2013-05-23 4 views
6

私は4x4配列の乗数を設計する方法を知っていますが、私が同じロジックに従えば、コードが面倒になります。Verilogで64×64ビットのアレイ乗算器を設計するには?

  • 4×4から16の部分積
  • 64×64から4096の部分積。

8つの全加算器と4つの半加算器に加えて、64×64ビットに必要な全加算器と半加算器はいくつありますか。 Partial製品の数を減らすにはどうしたらいいですか?これを解決する簡単な方法はありますか?

答えて

8

うんざりするほどあなたの代わりに生成するステートメントを使用する必要があります繰り返しパターンコーディングするたび:

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 

注意。

+0

どうすればパイプライン化する必要がありますか?どうすればいいですか、ちょっと難しいですか? – chitranna

+0

私は答えにパイプライン版を追加しました(上記のEDITを参照)。 – CliffordVienna

+0

私は長い時間を知っています。あなたのコードを再評価できますか?出力[幅-1:0] y; //それは[2 * width - 1]ではいけません。 – chitranna

関連する問題