如何在Verilog(时序电路)上初始化输出

时间:2018-12-07 11:44:15

标签: initialization verilog test-bench

我是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'在顶部模块中声明为wire。我假设我无法模拟它,因为'current'的值未初始化。如何在不影响always块功能的情况下初始化它的值?

2 个答案:

答案 0 :(得分: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与reset的一些讨论。

我没有检查您的其余代码,因为对我而言,由于缺少缩进,因此无法读取。

答案 1 :(得分:0)

您正在将阻塞语句和非阻塞语句混合在一起,从而导致模拟期间的竞争状态。我已经修改了您的代码。

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