国防科大计算机原理慕课的实验练习verilog实现
基本原理:
阵列乘法跟我们手算乘法十分地类似,例如:1101*1111,手算过程为
这里贴一张来自国防科技大学慕课的一张图来表示运算,我觉得十分清晰。
在verilog里面乘对应于一位的与操作,每一行上下之间是用一位全加器来连接的,如图的FA模块就是了。x跟y都是输入的一位数据,Cin是进位输入,S是运算结果,Cout是输出进位。
原理图
阵列乘法器组合逻辑就可以实现,首先要实现的是一位全加器模块。
verilog实现
module one_full_add(input X1,X2,Cin, output Y,Cout
);
assign {Cout,Y}=X1+X2+Cin;
endmodule
接下来就是多次调用这个全加器模块,按照电路图来连接各个模块。
module multiplier(input [3:0]X1,input [3:0]X2,output [7:0]Y
);
wire [3:0]a1,a2,a3,a4;
assign a1[0]=X1[0]&&X2[0];
assign a1[1]=X1[1]&&X2[0];
assign a1[2]=X1[2]&&X2[0];
assign a1[3]=X1[3]&&X2[0];
assign a2[0]=X1[0]&&X2[1];
assign a2[1]=X1[1]&&X2[1];
assign a2[2]=X1[2]&&X2[1];
assign a2[3]=X1[3]&&X2[1];
assign a3[0]=X1[0]&&X2[2];
assign a3[1]=X1[1]&&X2[2];
assign a3[2]=X1[2]&&X2[2];
assign a3[3]=X1[3]&&X2[2];
assign a4[0]=X1[0]&&X2[3];
assign a4[1]=X1[1]&&X2[3];
assign a4[2]=X1[2]&&X2[3];
assign a4[3]=X1[3]&&X2[3];
wire C11,C12,C13,out11,out12,out13;//第一层要用到的输出线进位输出输入到下一层
one_full_add U0 (.X1(a1[1]),.X2(a2[0]),.Cin(0),.Y(out11),.Cout(C11));
one_full_add U1 (.X1(a1[2]),.X2(a2[1]),.Cin(0),.Y(out12),.Cout(C12));
one_full_add U2 (.X1(a1[3]),.X2(a2[2]),.Cin(0),.Y(out13),.Cout(C13));
wire C21,C22,C23,out21,out22,out23;
one_full_add U3 (.X1(out12),.X2(a3[0]),.Cin(C11),.Y(out21),.Cout(C21));
one_full_add U4 (.X1(out13),.X2(a3[1]),.Cin(C12),.Y(out22),.Cout(C22));
one_full_add U5 (.X1(a2[3]),.X2(a3[2]),.Cin(C13),.Y(out23),.Cout(C23));
wire C31,C32,C33,out31,out32,out33;//第二层要用到的输出线本层的进位输出输入到下一层的进位输入。
one_full_add U6 (.X1(out22),.X2(a4[0]),.Cin(C21),.Y(out31),.Cout(C31));
one_full_add U7 (.X1(out23),.X2(a4[1]),.Cin(C22),.Y(out32),.Cout(C32));
one_full_add U8 (.X1(a3[3]),.X2(a4[2]),.Cin(C23),.Y(out33),.Cout(C33));
wire C41,C42,C43,out41,out42,out43;//最后一层跟前面的不一样,进位信号当做本层下一个模块的一个输入
one_full_add U9 (.X1(out32),.X2(0),.Cin(C31),.Y(out41),.Cout(C41));
one_full_add U10 (.X1(out33),.X2(C41),.Cin(C32),.Y(out42),.Cout(C42));
one_full_add U11 (.X1(a4[3]),.X2(C42),.Cin(C33),.Y(out43),.Cout(C43));
assign Y[7]=C43;
assign Y[6]=out43;
assign Y[5]=out42;
assign Y[4]=out41;
assign Y[3]=out31;
assign Y[2]=out21;
assign Y[1]=out11;
assign Y[0]=a1[0];
endmodule
验证
仿真模块
`timescale 1ns/1ps
module multiplier_bench;
reg [3:0]X1,X2;
wire [7:0]Y;
multiplier U0 (X1,X2,Y);
initial begin
X1=4'b0000;X2=4'b1010;
#1 X1=4'b0010;X2=4'b0010;
#1 X1=4'b1000;X2=4'b1001;
#1 X1=4'b1111;X2=4'b1000;
end
endmodule
可以看到运算结果是正确的!
至此,我们就用组合逻辑的方法实现了这个四位无符号数的阵列乘法器。
水平有限,如有错误欢迎斧正。