Verilog 使用加法和移位的8位顺序乘法器
我正在使用Verilog设计一个8位有符号顺序乘法器。输入为Verilog 使用加法和移位的8位顺序乘法器,verilog,sequential,test-bench,iverilog,Verilog,Sequential,Test Bench,Iverilog,我正在使用Verilog设计一个8位有符号顺序乘法器。输入为clk(时钟)、rst(复位)、a(8位乘法器)、b(8位乘法器),输出为p(乘积)和rdy(就绪信号,指示乘法结束)。对于负输入,我进行符号扩展并将其保存在15位寄存器变量multiplier和multipliand中。这是我的密码: module seq_mult (p, rdy, clk, reset, a, b); input clk, reset; input [7:0] a, b; output [15:0
clk
(时钟)、rst
(复位)、a
(8位乘法器)、b
(8位乘法器),输出为p
(乘积)和rdy
(就绪信号,指示乘法结束)。对于负输入,我进行符号扩展并将其保存在15位寄存器变量multiplier
和multipliand
中。这是我的密码:
module seq_mult (p, rdy, clk, reset, a, b);
input clk, reset;
input [7:0] a, b;
output [15:0] p;
output rdy;
reg [15:0] p;
reg [15:0] multiplier;
reg [15:0] multiplicand;
reg rdy;
reg [4:0] ctr;
always @(posedge clk or posedge reset) begin
if (reset)
begin
rdy <= 0;
p <= 0;
ctr <= 0;
multiplier <= {{8{a[7]}}, a};
multiplicand <= {{8{b[7]}}, b};
end
else
begin
if(ctr < 16)
begin
if(multiplier[ctr]==1)
begin
multiplicand = multiplicand<<ctr;
p <= p + multiplicand;
end
ctr <= ctr+1;
end
else
begin
rdy <= 1;
end
end
end //End of always block
endmodule
现在的问题是:代码只适用于前两个输入和后两个输入。对于其余的输入,我得到的数字与预期的不同。有人能指出我的代码中的任何逻辑错误导致这种情况吗?或者,如果有更简单的策略来做同样的事情,请让我也知道。
multiplier
在每次迭代中,如果multiplier[ctr]
为1,则ctr
会向左移动
但是ctr
已经包含了以前的班次,所以您的班次太多了
在每次迭代中,只需将被乘数
无条件地移位1即可:
multiplicand <= multiplicand << 1;
if (multiplier[ctr] == 1)
begin
p <= p + multiplicand;
end
ctr <= ctr + 1;
被乘数
10
5 5
2 3
10 1
10 2
20 20
-128 2
10 -128
-1 -1
10 0
0 2
multiplicand <= multiplicand << 1;
if (multiplier[ctr] == 1)
begin
p <= p + multiplicand;
end
ctr <= ctr + 1;