module multiplication (multiplier, multiplicand, product, clk);
input [3:0] multiplier;
input [4:0] multiplicand;
input clk;
output [7:0] product;
reg [7:0] product;
initial
begin
product [7:4] = 4'b0000;
product [3:0] = 4'b1100;
end
always @ (posedge clk)
begin
if (product[0] == 1)
begin
product <= product >> 1;
product[7:3] <= product[7:3] + multiplicand[4:0];
end
else
begin
product <= product >> 1;
end
end
endmodule
这个verilog代码用于实现此问题中提到的电路:How to perform right shifting binary multiplication?,波形在最后一步之前是正确的。正确的答案应该是00111100
答案 0 :(得分:0)
为什么会这样?
我们知道t = 300ns,product[0]==1
,所以我们使用了if-else的第一个选项。
在这种情况下,我们有以下内容:
product <= product >> 1;
product[7:3] <= product[7:3] + multiplicand[4:0];
因为您(正确地)使用了非阻塞分配,所以{always}块的完成后才会更新product
的值。这意味着第二个任务使用产品的未移位值。我们可以将此表达式简化为
product[2:0] <= product [3:1];
product[7:3] <= product[7:3] + multiplicand[4:0];
,结果会一样。
第一句话给我们0b100
。第二个给我们0b00101 + 0b00101 = 0b01010
。总的来说,这会产生0b01010100
,它与模拟输出相匹配。