私は4x4配列の乗数を設計する方法を知っていますが、私が同じロジックに従えば、コードが面倒になります。Verilogで64×64ビットのアレイ乗算器を設計するには?
- 4×4から16の部分積
- 64×64から4096の部分積。
8つの全加算器と4つの半加算器に加えて、64×64ビットに必要な全加算器と半加算器はいくつありますか。 Partial製品の数を減らすにはどうしたらいいですか?これを解決する簡単な方法はありますか?
私は4x4配列の乗数を設計する方法を知っていますが、私が同じロジックに従えば、コードが面倒になります。Verilogで64×64ビットのアレイ乗算器を設計するには?
8つの全加算器と4つの半加算器に加えて、64×64ビットに必要な全加算器と半加算器はいくつありますか。 Partial製品の数を減らすにはどうしたらいいですか?これを解決する簡単な方法はありますか?
うんざりするほどあなたの代わりに生成するステートメントを使用する必要があります繰り返しパターンコーディングするたび:
module array_multiplier(a, b, y);
parameter width = 8;
input [width-1:0] a, b;
output [width-1:0] y;
wire [width*width-1:0] partials;
genvar i;
assign partials[width-1 : 0] = a[0] ? b : 0;
generate for (i = 1; i < width; i = i+1) begin:gen
assign partials[width*(i+1)-1 : width*i] = (a[i] ? b << i : 0) +
partials[width*i-1 : width*(i-1)];
end endgenerate
assign y = partials[width*width-1 : width*(width-1)];
endmodule
を、私は、次のテストベンチを使用して、このモジュールを確認しました: http://svn.clifford.at/handicraft/2013/array_multiplier/array_multiplier_tb.v
はEDIT:
@Debianはパイプラインバージョンを要求しています。ここがそうです。今回は配列部分のfor-loopをalways-regionで使用します。多くの合成ツールとそれだけで非パイプライン加算器の後にステージを登録し、ツールがパスをパイプライン化を行う均衡登録してみましょう(幅)を追加することも可能だと
module array_multiplier_pipeline(clk, a, b, y);
parameter width = 8;
input clk;
input [width-1:0] a, b;
output [width-1:0] y;
reg [width-1:0] a_pipeline [0:width-2];
reg [width-1:0] b_pipeline [0:width-2];
reg [width-1:0] partials [0:width-1];
integer i;
always @(posedge clk) begin
a_pipeline[0] <= a;
b_pipeline[0] <= b;
for (i = 1; i < width-1; i = i+1) begin
a_pipeline[i] <= a_pipeline[i-1];
b_pipeline[i] <= b_pipeline[i-1];
end
partials[0] <= a[0] ? b : 0;
for (i = 1; i < width; i = i+1)
partials[i] <= (a_pipeline[i-1][i] ? b_pipeline[i-1] << i : 0) +
partials[i-1];
end
assign y = partials[width-1];
endmodule
注意。
どうすればパイプライン化する必要がありますか?どうすればいいですか、ちょっと難しいですか? – chitranna
私は答えにパイプライン版を追加しました(上記のEDITを参照)。 – CliffordVienna
私は長い時間を知っています。あなたのコードを再評価できますか?出力[幅-1:0] y; //それは[2 * width - 1]ではいけません。 – chitranna