我是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块功能的情况下初始化它的值?
答案 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