在计算机中,乘法是数字信号处理中的重要角色。
四位无符号数相乘的手算运算可以提炼出最简单的乘法器的计算算法,利用手算乘法的思想,算出每次的部分积然后求和。这样的方法思想较为容易理解前面的(FPGA-定点乘法器)已经给出具体的代码的设计,代码中设计的是4位,则需要4个时钟周期,如果是N位则会需要N个时钟周期进行运行,这样运行的乘法器运行效率不高(也可以看做是串行的),所以为了提高效率采用硬件的叠加和流水线设计
附代码:
全加器:
module adder(dina,dinb,c,ci,dout ); input dina; input dinb; input c; output reg ci; output reg dout; always@(*)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; always@(*)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