人気ブログランキング | 話題のタグを見る

雑多な趣味の記録帳

tom01h.exblog.jp

正規化数だけに対応した FPU 乗算器の話

FPU 乗算の話です。FPU で扱うデータは正規化数以外にサブノーマル数や無限大から、数字じゃないデータまであるのですが、今回は正規化数に限った話。32bit で表現する単精度浮動小数で言うなら以下のようになります。
ビット31が符号を表す。
ビット30~23が指数を表す。正規化数の場合は1~254。
ビット22~0が仮数の小数点以下の部分を表す。ただし、仮数は 1.**** で表す。
で、F[31:0] の値は↓です。
((-1)^F[31]) * (1.F[22:0]) * (2^(F[30:23]-127)) ^はべき乗です
A[31:0]*B[31:0] を考えた時、
F[47:0]={1'b1,A[22:0]}*{1'b1,B[22:0]}
が仮数の掛け算の結果です。小数点以上が1桁、小数点以下が23桁の数同士の掛け算なので、小数点以上が2桁、小数点以下が46桁の乗算結果が得られます。つまり、F[46]の下に小数点があります。この結果を再度、浮動小数点フォーマットに戻すために、1.**** の形式に変換する必要があります。具体的にはF[47]の値によって分岐する必要があり、
F[47]==0の場合は桁上げ無しなので指数は A[30:23]+B[30:23]-127 になります。
仮数はF[45]が小数点以下第1位になって、[23]が最下位ビットでそれ以下は四捨五入をします。ただ FPU の四捨五入はちょっと特殊で、ちょうど真ん中、つまり[22]が1で[21:0]==0の時は、[23]=0となるように切り上げたり切り捨てたり、[23]によって動作が異なります。
F[47]==1の場合は桁上げ有りなので、指数は A[30:23]+B[30:23]-127+1 になります。
仮数はF[46]が小数点以下… 以下同文
だらだら言葉で説明してもわかりにくいので、Github を見てください。

by tom01h | 2017-11-04 21:25 | 論理設計の話