verilog 典型電路設計之加法器樹乘法器
加法器樹乘法器
加法器樹乘法器的設計思想是“移位后加”,并且加法運算采用加法器樹的形式。乘法運算的過程是,被乘數與乘數的每一位相乘并且乘以相應的權值,最后將所得的結果相加,便得到了最終的乘法結果。
首先我們明確一個觀點 進行4位數乘法應該來說是最多會得到 8 位
因為4位數最大是15 15乘15得到的是225 在可控制的 128 到 256 之間 所以我們基本確定 臨時變量選取為【7:0】 即可
然后下一步我們通過實際例子來確定乘法器簡單的邏輯
比如 兩個數 1001 乘 1010
我們觀察可知得到【6:0】 完全可以用[7:0]去覆蓋 還有 得到的四位暫存下來就是0 乘1001 1乘1001 0 乘1001 1乘1001
每一個進行小移位之后相加 即可
四位暫存數,就好比 第一位確定的是[3:0] 第二位確定的是[4:1] 第三位是[5:2] 第四位是[6:3] 在面對是[7:0]中 我們可以采取在其他位補0 的做法 保證它的適用性
以下是verilog的代碼
module mul_addtree(mul_a,mul b,mul_out);
input[3:0] mul_a,mul_b;
wire[7:0] mul_out;
wire[7:0] stored0,stored1,stored2,stored3;
wire[7:0] add01, add23;
assign
stored3=mul_b[3]?{1'b0,mul_a,3'b0}:8'b0;
assign
stored2=mul_b[2]?{2'b0,mul_a,2'b0}:8'bo;
assign
stored1=mul_b[1]?{3'b0,mul_a,1'b0}:8'b0;
assignstored0=mul_b[0]?{4'b0,mul_a}:8'b0;
assign add01=stored1+stored0;
assign add23=stored3+stored2;
assign mul_out=add01+add23;
endmodule
接下來
寫下testbench
module mult_addtree_tb;
reg [3:0]mult_a;
reg [3:0]mult_b;
wire [7:0]mult_out;
mul_addtreeU1(.mul_a(mult_a),.mul_b(mult_b),.mul_out(mult_out));
initial
begin
mult_a=0;
mult_b=0;
repeat(9)
begin
#20
mult_a=mult_a+1;
mult_b=mult_b+1;
end
end