verilog~整数から浮動小数点へ変換とその逆も~

はじめに

こんにちは、keymaleです。python記事をいくら書いても全く閲覧数が増えず、verilog関係の記事ばかり閲覧数が増えています。あとなぜか育児日記が最近閲覧数が増えています。
そんなこんなで今回は久しぶりにverilogの記事を書こうと思ったわけです。FPGAで浮動小数点の演算をしようと思ったのですが、調べても情報が古かったり、結局どうしたらいいかわからなかったのですが、解決できたので、まずその第一弾として、そもそもverilog上で簡単に浮動小数点を扱う方法をお伝えします。

浮動小数点とは?

コンピュータ上で扱う小数には固定小数と浮動小数があります。固定小数は小数点以下の桁が固定されているもので、浮動小数は小数の桁が変動可能で、精度は低いけどより多くの小数範囲を扱えるものです。詳しくはwikiを見てください。
浮動所数には32bit定義と64bit定義のものがあります。FPGAではどちらも対応可能ですので、扱う小数範囲に応じて決めればいいと思います。

alteraでの浮動小数点

まずquartus primeを起動してください。動作環境はwindows10 でquartus prime lite edition 18.0です。以下のような画面が出るかと思います。

出ない場合は上のタスクバーからView/Utility window/IP catalogで出ます。
検索窓にALTERA_FP_FUNCTIONSと入力すると、ALTERA_FP_FUNCTIONSが表示されます。ALTERAだけ入力しても出てくると思うので、これをダブルクリックします。すると以下のようなポップアップが表示されます。

IPを保存するパスを聞かれます。デフォルトのままだと、TOPファイルと同じディレクトリに保存されます。おススメとしては新たにディレクトリを用意したほうがわかりやすいと思います。今回は整数から浮動小数点に変換する予定なので、IN_FPといyディレクトリ下にIPを置くことを想定してます。ディレクトリを指定してOKを押すと以下のポップアップが出てきます。

Familyにconversionを選んでください。そしてNameのタグでfixed to floating pointを選ぶと固定小数点から浮動小数点への変換となります。floating point to fixedだと浮動小数点から固定小数点になります。floating to floating pointは浮動小数点のbit数変換になります。今回はfixed to floating pointを用いて、固定小数ではなく整数から浮動小数への変換を紹介します。

次にfomatにおいて、single,double,originalを選びます。singleは32bitの浮動小数点、doubleは64bitの浮動小数点を示しています。返還後にどの浮動小数点にするかは好きなほうを選んで下さい。この後、Fixed pointでまず、固定小数点が何ビットあるかを選びます。widthの欄です。今回はintegerなので32bitの整数なので32とします。Fractionに小数点以下の使うbit数を記入して下さい。整数の場合は0です。最後はsignedとunsignedの違いですが、負を含むか。含まないかです。含む場合はsigenedで含まない場合はunsignedです。設定を決めたらfinishボタンを押すと指定のIPが生成されます。

するとproject navigater のfilesに先ほど作成したディレクトリ名のIN_FP.cipがあると思います。その中にIN_FP.vがあれば成功です。あとはmodule呼び出しで以下を書けば32bitの整数から32bitもしくは64bitの浮動小数を受け取れます。

clkには50MHzくらいのクロックをぶち込めば大丈夫です。aresetはreset関数で0だと計算してくれて、1だと0を常に返します。aは入力する32bitの整数です。bは固定小数点の小数点の値ですが、今回は整数なので0で大丈夫です。
qに浮動小数が帰ってきます。以上が整数から浮動小数への変換です。途中のnameでfloating point to fixedを選ぶと整数から浮動小数もしくは、固定小数から浮動小数を変換できます。

以上がFPGAでの浮動小数への変換の仕方です。次回は浮動小数を用いた演算について紹介したいと思います。