0

2 ビット乗算器の次のコードがあります。

module Multiplier (a0, a1, b0, b1, c[3:0]);
output      [3:0]c; 
input       a0, a1, b0, b1;
wire        a0b1, a1b0, ha0c, a1b1;  

and (c[0], a0, b0);
and (a0b1, a0, b1);
and (a1b0, a1, b0);
HalfAdder ha0 (a1b0, a0b1, c[1], ha0c);

and (a1b1, a1, b1);
HalfAdder ha1 (ha0c, a1b1, c[2], c[3]);
endmodule

ただし、これを2ビット以上(32ビット)に拡張できるようにしたいです。ただし、私のコードの構造はこれに課題をもたらします。まず、モジュールには 68 個のパラメーターが必要です。また、64 本のワイヤー (ワイヤー a0b1、a1b0、ha0c、a1b1 の複製) を手動で作成する必要があります。最後に、すべてのロジックを接続するために、一連のロジック ゲートと HalfAdder モジュールを手動で書き出す必要があります。このため、n (渡されたパラメーター) サイズのバイナリ乗数をインスタンス化できるようにコードをリファクタリングできる方法があるかどうか疑問に思っています。

4

1 に答える 1

0

生成ブロックをパラメーター化して使用する必要があります。(そして、非同期回路よりも同期回路を使用する方がはるかに優れています)。

以下は不完全な例です。必要なロジックを入力できます。

module Multiplier (a, b, c, clk);
parameter WIDTH = 64;
output      [2*WIDTH:0]c; 
input       [WIDTH-1:0]a; 
input       [WIDTH-1:0]b; 
input       clk;


genvar i;
generate  for (i = 0; i < WIDTH; i <= i + 1)
begin : shifts
    // shift a 1-bit for each i and 'logical and' it with b
    reg  [WIDTH + i :0]carry;
    wire [WIDTH + i -1:0]shifted = {a,i{0}} & b[i]; 


    // sum the result of shift and 'logical and'
    always @ (posedge clk)
    begin
        carry <= shifted + shifts[i-1].carry ;
    end
end

assign c = shifts[WIDTH].carry;

endgenerate

endmodule
于 2017-07-07T14:18:31.953 に答える