verilog实现无符号数4位阵列乘法器

国防科大计算机原理慕课的实验练习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

在这里插入图片描述

可以看到运算结果是正确的!
至此,我们就用组合逻辑的方法实现了这个四位无符号数的阵列乘法器。


水平有限,如有错误欢迎斧正。

  • 6
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值