如何在verilog中初始化输出?

时间:2018-04-20 01:33:33

标签: initialization verilog quartus

我一直在尝试将输出LEDR [3:0]初始化为全0。但是,LEDR在我的波形时序图中保持为XXXX。我尝试过使用初始块,但它不起作用。 (我的IDE是Quartus Prime)

这是我的代码

module synasyn_counter(SW,LEDR,PLoad,CLK);
    parameter n=16;
    input CLK,PLoad;
    input [3:0] SW;
    output reg [3:0] LEDR;
    initial 
    begin
        LEDR=0;
    end
    always @(negedge PLoad or negedge CLK)
    begin
        if (PLoad==0) LEDR<=SW;
        else 
        begin
            if (LEDR==n-1) LEDR<=0;
            else LEDR<=LEDR+1;
        end
    end
endmodule

这是我的结果:

enter image description here

1 个答案:

答案 0 :(得分:1)

您无法在合成代码中使用initial块。这是一个纯粹基于模拟的代码。

在硬件中,我们通常通过reset信号实现翻转/寄存器初始化。因此,如果你的设计中有一个低有效的低异步复位,那么你可以为你的翻转方程式做这样的事情 -

always @ (posedge clock or negedge reset) begin
  if(!reset) begin
    LEDR <= <initialized_value>
  end
  else begin
    <rest_of_your_code>
  end
end

完成此操作后,在TB中确保在开始时断言reset信号(因为其低电平有效断言意味着将其拉低至0)然后在1之后取消断言或更多时钟周期。

请注意,在reset置位之前,除非{t = 0}声明X,否则您仍会看到reset。因此,在您遵循一个reset断言 - 断言序列之后,您可以在此之后继续进行其余的模拟