Float計算回路のVerilog-HDL実装について -その4(除算回路)


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(共通化)

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

乗算回路編
Float計算回路のVerilog-HDL実装について -その3(積算回路)

目的

floatの勉強
float32のハードウェア実装

だいたい前回と一緒
0 に対応しない乗算回路の実装を行う

今回のHW

コード

module float_div(
    input wire clk,
    input wire [31:0] v1,
    input wire [31:0] v2,

    output wire [31:0] vres
);

    assign vres = res;

    // TIM1
    reg [7:0] v1e;
    reg [7:0] v2e;
    reg [23:0] v1v;
    reg [23:0] v2v;
    reg v1o;
    reg v2o;

    // TIM2
    reg [7:0] re;
    reg [47:0] rv;
    reg ro;

    // TIM3
    reg [31:0] res;

    always @(posedge clk) begin
    // TIM1
        v1e <= (v1[30:23] - 8'h7F);
        v2e <= (v2[30:23] - 8'h7F);
        v1v <= {1'b1, v1[22:0]};
        v2v <= {1'b1, v2[22:0]};
        v1o <= v1[31];
        v2o <= v2[31];

    // TIM2
        re <= v1e - v2e;
        rv <= {v1v, 24'b0} / v2v;
        ro <= v1o ^ v2o;

    // TIM3
        if (rv[24]) begin
            res <= {ro, re + 8'h7F, rv[23:1]};
        end else begin
            res <= {ro, re + 8'h7E, rv[22:0]};
        end
    end

endmodule

TIM2


v1v も v2v も最上位ビットが 1 であるため、
そのまま除算すると1桁しか答えが出ないので 0 で拡張する

逆に商は上位23ビットもしくは24ビットが 0 となる

シミュレーション結果と誤差

値1 値2 結果 正答
123.4 7.25 17.020689 17.0206896…
7.25 123.4 0.058752023 0.0587520259…
123.4 0.725 170.20688 170.206896…
0.725 0.00123 589.43085 589.430894…

ちょっとブレるけど誤差ということで・・・