【问题标题】:How to initialize an output in verilog?如何在verilog中初始化输出?
【发布时间】:2018-04-20 01:33:33
【问题描述】:

我一直在尝试将我的输出 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

这是我的结果:

【问题讨论】:

    标签: initialization verilog quartus


    【解决方案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 之前,您仍会看到X,除非从t=0 断言reset。因此,在您遵循一个 reset 断言-解除断言序列之后,您可以继续进行其余的模拟

    【讨论】:

    • 笼统地说,这是错误的。 initial 的值可在某些硬件上合成,例如Xilinx FPGAs。这实际上也没有回答 OP 的问题,其中包括显示代码无论如何都在模拟中运行的屏幕截图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多