【问题标题】:how to initialize an output on verilog (sequential circuit)如何在verilog(顺序电路)上初始化输出
【发布时间】:2018-12-07 11:44:14
【问题描述】:

我是 Verilog 编码的新手,我有一个大学项目来设计一个简单的电梯系统。该代码在 FPGA 上运行良好,但我无法让模拟工作。这是我的代码:

module move(
    output reg [1:0] current,
    input [1:0] target,
    input clk,
    input overloadin,
    output reg up,
    output reg down
    );

always@(posedge clk)
if (overloadin==1'b0)
begin
if (target[1:0]>current[1:0])
begin
current[1:0] <= current[1:0] + 1;
up = 1'b1;
down = 1'b0;

end
else if (target[1:0]<current[1:0])
begin
current[1:0] <= current[1:0] - 1;
down = 1'b1;
up = 1'b0;

end
else
begin
up = 1'b0;
down = 1'b0;

end
end
endmodule 

'current' 在顶层模块中被声明为线。我假设我无法模拟它,因为“当前”的值没有被初始化。如何在不影响always块功能的情况下初始化它的值?

【问题讨论】:

    标签: initialization verilog test-bench


    【解决方案1】:

    您可以使用“初始”语句或添加复位信号。

    initial
       current = 2'b00;
    

      input reset_n,
      ...
       always @(posedge clk or negedge reset_n)
       begin
          if (!reset_n)
             current <= 2'b00;
          else
          ...
       end
    

    我个人更喜欢后者,但您可以在此论坛和 ee 论坛中找到有关使用 initial vs reset 的一些讨论。

    我没有检查您的其余代码,因为对我来说,由于缺少缩进,它是不可读的。

    【讨论】:

      【解决方案2】:

      您将阻塞和非阻塞语句混合在一起导致模拟期间出现竞争条件。我修改了你的代码。

      module move(
       output reg [1:0] current,
       input [1:0] target,
       input clk,
       input reset_n,             //Added an additional input
       input overloadin,
       output reg up,
       output reg down
      );
      
      always@(posedge clk or negedge reset_n)
      begin
       if(!reset_n)               //Active low reset
       begin
         up      <= 1'd0;
         down    <= 1'd0;
         current <= 2'd0;
       end
      else if(!overloadin)
      begin
       if(target > current)
       begin
        up      <= 1'd1;
        down    <= 1'd0;
        current <= current + 2'd1;
       end
       else if(target < current)
       begin
        up      <= 1'd0;
        down    <= 1'd1;
        current <= current - 2'd1;
       end
      else
       begin
        up      <= 1'd0;
        down    <= 1'd0;
       end
        end  end  endmodule
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        相关资源
        最近更新 更多