10進数の実数と32bitの符号付き固定小数点演算の形式変換処理
研究の都合上,FPGA上で符号付き固定小数点演算を取り扱うことになりました.固定小数点演算を用いた演算器は整数演算と基本的に同じなので特に困ることはありませんが,回路上では全て0と1のbitで処理されるため,固定小数点演算や浮動小数点演算の区別は当然なく,入力値や出力値は01のbitとなります.そして,固定小数点演算ではbit数などのフォーマットが任意のため,入力値を生成する際には自分でbitの形式に変換する必要があり,さらに単純にテストベンチ上での$display等で出力値を表示させることができません.何とかするために調べましたが,浮動小数点演算形式はIEEE754規格に準拠しているため変換ツールなどがいろいろありますが,固定小数点演算形式は任意のため変換ツールがなく,見つけることができませんでした.「無いなら自分で作ればいいか.」ということで,ソースコードの綺麗さ等は何も考えずにとりあえず作成.固定小数点演算のbit数などは浮動小数点演算と比較するために暫定的に32bitと仮定し,ついでにFPGA開発時に使用している複数の言語で実装してみました.全て自分用なので利用する上で不具合等がありますが,メモとして残しておきます.
変換の例
固定小数点演算形式は符号付き32bit(符号1bit,整数20bit,小数11bit)
- 10進数表記(実数)→2進数表記(固定小数点)
-2.74929489937376 ↓ 111111111111111111101.01000000010(ピリオド.は確認用)
- 2進数表記(固定小数点)→10進数表記変換(実数)
111111111111111111101.01000000010 ↓ -2.7490234375(量子化誤差が発生)