两则乘法器的Verilog描述及测试程序

乘法原理 

         

Verilog描述

module MULT4B(R,A,B);
parameter S = 4;//4位乘法器
//参数定义关键词parameter(将常数用字符表示称为参数)
input [S:1] A,B;//A为被乘数,B为乘数
output [2*S:1] R;//R为乘积
integer i;//i为循环变量
reg [2*S:1] R;//always语句中的赋值目标必须为reg型
always @ (A or B)
    begin
        R = 0;
        for(i=1;i<=S;i=i+1)//循环4次
            if(B[i]) R = R + (A<<(i-1));//被乘数左移,与部分积相加
            else R = R;
    end
endmodule

算法二:循环变量减1,循环条件为循环变量>1B右移1位,判断B1是否为1A左移1位,R=R+A

算法二的Verilog描述

//采用repeat循环语句实现

module MULT4B(R,A,B);
parameter S = 4;//4位乘法器
//参数定义关键词parameter(将常数用字符表示称为参数)
input [S:1] A,B;
output [2*S:1] R;
reg [2*S:1] TA,R;//TA为A的2S位扩展
reg [S:1] TB;//TB = B

always @ (A or B)
    begin
        R = 0;
        TA = A;//A自动与TA位宽匹配,变成2S位
        TB = B;
        repeat(S)//重复S次
            begin
                if(TB[1]) R = R + TA;//如果乘数右移后的最低位为1
                else R = R;
                TA = TA << 1;//被乘数左移
                TB = TB >> 1;//乘数右移
            end
    end
endmodule

//采用while循环语句实现

module MULT4B(R,A,B);
parameter S = 4;//4位乘法器
//参数定义关键词parameter(将常数用字符表示称为参数)
input [S:1] A,B;
output [2*S:1] R;
reg [2*S:1] AT,R;//AT为A的2S位扩展
reg [S:1] BT,CT;//BT = B,CT为循环变量
always @ (A or B)
    begin
        R = 0;
        AT = {
   
   {S{1'b0}},A};//将A扩展成2S位
        BT = B;
        CT = S;
        while(CT > 0) begin
            if(BT[1]) R = R + AT;
            else R = R;
            begin
                CT = CT - 1;
                AT = AT << 1;
                BT = BT >> 1;
            end
       end
    end
endmodule

测试程序

module test_MULT4B;
    reg [3:0] a,b;
    wire [7:0] r;
    MULT4B M1(r,a,b);
    
    initial
        begin
           a = 4'd1; b = 4'd9;
           #120 $stop;
        end
        always #10 a = a + 1;
        always #20 b = b - 1;
endmodule

  仿真结果

             

! ! ! 是不是看着很别扭,因为仿真结果默认为16进制,只需要改成十进制即可

右键具体Name→Radix→Unsigned Decimal

则调整过的仿真结果为

                           

猜你喜欢

转载自blog.csdn.net/qq_41270858/article/details/108541253