Float計算回路のVerilog-HDL実装について -その2.7(0対応)


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