FPGA-陣列乘法器的設計(利用全加器 基於CRA陣列乘法器)
阿新 • • 發佈:2018-12-24
在計算機中,乘法是數字訊號處理中的重要角色。
四位無符號數相乘的手算運算可以提煉出最簡單的乘法器的計算演算法,利用手算乘法的思想,算出每次的部分積然後求和。這樣的方法思想較為容易理解前面的(FPGA-定點乘法器)已經給出具體的程式碼的設計,程式碼中設計的是4位,則需要4個時鐘週期,如果是N位則會需要N個時鐘週期進行執行,這樣執行的乘法器執行效率不高(也可以看做是序列的),所以為了提高效率採用硬體的疊加和流水線設計
附程式碼:
全加器:
module adder(dina,dinb,c,ci,dout
);
input dina;
input dinb;
input c;
output reg ci;
output reg dout;
[email protected](*)begin
{ci,dout}=dina+dinb+c;
end
endmodule
累加器module
module add_demo(dina,xi,yi,dinb,out_1,out_2,out_3,out_4
);
input dina ;//部分積輸入
input xi ;//Xi
input yi ;//Yi
input dinb ;//進位輸入
output reg out_1;//Xi
output out_2;//進位輸出
output reg out_3;//Yi
output out_4;//部分積輸出
wire din1=xi&yi;
[email protected](*)begin
out_1=yi;
out_3=xi;
end
adder u_adder(
.dina(dina),
.dinb(din1),
.c(dinb),
.ci(out_2),
.dout(out_4)
);
endmodule
陣列乘法器:
module array_multiplier_1(X,Y,P ); input [3:0] X; input [3:0] Y; output [7:0] P; wire out_1_00,out_2_00,out_3_00; add_demo ad_00( .dina(1'b0),.xi(X[0]),.yi(Y[0]),.dinb(1'b0), .out_1(out_1_00),.out_2(out_2_00),.out_3(out_3_00),.out_4(P[0]) ); wire out_1_01,out_2_01,out_3_01,out_4_01; add_demo ad_01( .dina(1'b0),.xi(X[1]),.yi(out_1_00),.dinb(out_2_00), .out_1(out_1_01),.out_2(out_2_01),.out_3(out_3_01),.out_4(out_4_01) ); wire out_1_02,out_2_02,out_3_02,out_4_02; add_demo ad_02( .dina(1'b0),.xi(X[2]),.yi(out_1_01),.dinb(out_2_01), .out_1(out_1_02),.out_2(out_2_02),.out_3(out_3_02),.out_4(out_4_02) ); wire out_2_03,out_3_03,out_4_03; add_demo ad_03( .dina(1'b0),.xi(X[3]),.yi(out_1_02),.dinb(out_2_02), .out_2(out_2_03),.out_3(out_3_03),.out_4(out_4_03) ); wire out_1_10,out_2_10,out_3_10; add_demo ad_10( .dina(out_4_01),.xi(out_3_00),.yi(Y[1]),.dinb(1'b0), .out_1(out_1_10),.out_2(out_2_10),.out_3(out_3_10),.out_4(P[1]) ); wire out_1_11,out_2_11,out_3_11,out_4_11; add_demo ad_11( .dina(out_4_02),.xi(out_3_01),.yi(out_1_10),.dinb(out_2_10), .out_1(out_1_11),.out_2(out_2_11),.out_3(out_3_11),.out_4(out_4_11) ); wire out_1_12,out_2_12,out_3_12,out_4_12; add_demo ad_12( .dina(out_4_03),.xi(out_3_02),.yi(out_1_11),.dinb(out_2_11), .out_1(out_1_12),.out_2(out_2_12),.out_3(out_3_12),.out_4(out_4_12) ); wire out_2_13,out_3_13,out_4_13; add_demo ad_13( .dina(out_2_03),.xi(out_3_03),.yi(out_1_12),.dinb(out_2_12), .out_2(out_2_13),.out_3(out_3_13),.out_4(out_4_13) ); wire out_1_20,out_2_20,out_3_20; add_demo ad_20( .dina(out_4_11),.xi(out_3_10),.yi(Y[2]),.dinb(1'b0), .out_1(out_1_20),.out_2(out_2_20),.out_3(out_3_20),.out_4(P[2]) ); wire out_1_21,out_2_21,out_3_21,out_4_21; add_demo ad_21( .dina(out_4_12),.xi(out_3_11),.yi(out_1_20),.dinb(out_2_20), .out_1(out_1_21),.out_2(out_2_21),.out_3(out_3_21),.out_4(out_4_21) ); wire out_1_22,out_2_22,out_3_22,out_4_22; add_demo ad_22( .dina(out_4_13),.xi(out_3_12),.yi(out_1_21),.dinb(out_2_21), .out_1(out_1_22),.out_2(out_2_22),.out_3(out_3_22),.out_4(out_4_22) ); wire out_2_23,out_3_23,out_4_23; add_demo ad_23( .dina(out_2_13),.xi(out_3_13),.yi(out_1_22),.dinb(out_2_22), .out_2(out_2_23),.out_3(out_3_23),.out_4(out_4_23) ); wire out_1_30,out_2_30; add_demo ad_30( .dina(out_4_21),.xi(out_3_20),.yi(Y[3]),.dinb(1'b0), .out_1(out_1_30),.out_2(out_2_30),.out_4(P[3]) ); wire out_1_31,out_2_31; add_demo ad_31( .dina(out_4_22),.xi(out_3_21),.yi(out_1_30),.dinb(out_2_30), .out_1(out_1_31),.out_2(out_2_31),.out_4(P[4]) ); wire out_1_32,out_2_32; add_demo ad_32( .dina(out_4_23),.xi(out_3_22),.yi(out_1_31),.dinb(out_2_31), .out_1(out_1_32),.out_2(out_2_32),.out_4(P[5]) ); add_demo ad_33( .dina(out_2_23),.xi(out_3_23),.yi(out_1_32),.dinb(out_2_32), .out_2(P[7]),.out_4(P[6]) ); endmodule