#Float計算回路のVerilog実装
~ FPGA に載せたい ~
オレオレ実装なので間違っていても知りません
加算回路編
Float計算回路のVerilog-HDL実装について -その1
デバッグツール作成編
Float計算回路の(ry-その1.1(float値の16進数表記)
補足とLeadingZeros編
Float計算回路のVerilog-HDL実装について -その1.5 (LeadingZeros)
減算回路編
Float計算回路のVerilog-HDL実装について -その2(減算編)
回路共通化とタイミング調整編
Float計算回路のVerilog-HDL実装について -その2.1(加算回路の共通化とタイミング調整)
共通化編
Float計算回路のVerilog-HDL実装について -その2.5(共通化)
目的
floatの勉強
float32のハードウェア実装
0に対応したHWの実装
面倒くさいので指数部が0かどうかで判定して非正規化数はまるめる(どんまい)
これで通常計算は最後(のはず)
0のパターン
a \pm 0\\
0 \pm a\\
a - a\\
0-0
だいたいこの4パターン(2でも良いくらい)
今回のHW
各値の保持とTIM4の変更
TIM4
// TIM4 //
if ((eb2 == es2) && (vb3 == vs3) && (opb2 ^ opb3)) begin
op3 <= 1'b0;
vexp3 <= 8'b0;
end else begin
op3 <= opb2;
vexp3 <= eb2;
end
if (eb2 == 8'b0) begin
r <= 25'b0;
end else if (es2 == 8'b0) begin
r <= vb3;
end else if (opb2 ^ ops2) begin
r <= vb3 - vs3;
end else begin
r <= vb3 + vs3;
end
その2.5までで、絶対値の大小で値をソートしている為、
a \pm 0
のパターンで 0 は必ず小さい値としてソートされる
したがって、
計算時にこれを検出すれば良い
さらに
大きい値が 0 であるならば 小さい方は必ず 0 である
シミュレーション結果
|値1| 値2| 演算子|| 結果|
|:-:|:-:|:-:|:-:|:-:|:-:|
|123.4|0| +||123.4|
|-123.4|0| +||-123.4|
|0|123.4| +||123.4|
|0|-123.4| +||-123.4|
|123.4|0| -||123.4|
|-123.4|0| -||-123.4|
|0|123.4| -||-123.4|
|0|-123.4| -||123.4|
|0|0| +||0|
|0|0| -||0|
|123.4|123.4| +||246.8|
|123.4|123.4| -||0|