具有错误波形的Verilog代码(多重电路)

时间:2016-12-09 10:31:29

标签: verilog quartus

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

波形: Waveform

1 个答案:

答案 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,它与模拟输出相匹配。