乘法原理
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,循环条件为循环变量>1;B右移1位,判断B1是否为1;A左移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
则调整过的仿真结果为