我目前正在研究一个班级项目,以使用verilog创建自动售货机FSM。我目前停留在测试台部分,试图检查我的输出“ ReturnN”之一,当插入镍和四分之一时,由于饮料是25美分,该输出应该返回镍。无论我如何尝试分配reg,ReturnN输出都将驱动为0。我已经以相同的方式定义了其他reg /变量,并且能够获得所需的输出。我是Verilog的新手,所以我不知道自己在做什么错。
设计
module vending(d,n,q, reset, clk, y, ReturnN);
output reg y;
output reg ReturnN;
input d,n,q; //n=5,d=10,q=25;
input clk;
input reset;
reg [2:0] cst, nst;
parameter S0 = 3'b000,
S5 = 3'b001,
S10 = 3'b010,
S15 = 3'b100,
S20 = 3'b101;
always @(cst or d or n or q)
begin
case (cst)
S0: if (n== 1'b1 && d==1'b0 && q==1'b0)
begin
nst = S5;
y=1'b0;
ReturnN=1'b0;
end
else if(n== 1'b0 && d==1'b1 && q==1'b0)
begin
nst=S10;
y=1'b0;
ReturnN=1'b0;
end
else if(n== 1'b0 && d==1'b0 && q==1'b1)
begin
nst=S0;
y=1'b1;
ReturnN=1'b0;
end
else
begin
nst = cst;
y=1'b0;
ReturnN=1'b0;
end
S5: if (n== 1'b1 && d==1'b0 && q==1'b0)
begin
nst = S10;
y=1'b0;
ReturnN=1'b0;
end
else if(n== 1'b0 && d==1'b1 && q==1'b0)
begin
nst=S15;
y=1'b0;
ReturnN=1'b0;
end
else if(n== 1'b0 && d==1'b0 && q==1'b1)
begin
nst=S0;
y = 1'b1;
ReturnN<=1'b1;
end
else
begin
nst = cst;
y=1'b0;
ReturnN=1'b0;
end
S10:if (n== 1'b1 && d==1'b0 && q==1'b0)
begin
nst = S15;
y=1'b0;
ReturnN=1'b0;
end
else if(n== 1'b0 && d==1'b1 && q==1'b0)
begin
nst=S20;
y=1'b0;
ReturnN=1'b0;
end
else if(n== 1'b0 && d==1'b0 && q==1'b1)
begin
nst=S0;
y=1'b1;
ReturnN=1'b0;
end
else
begin
nst = cst;
y=1'b0;
ReturnN=1'b0;
end
S15: if (n== 1'b1 && d==1'b0 && q==1'b0)
begin
nst = S20;
y=1'b0;
ReturnN=1'b0;
end
else if(n== 1'b0 && d==1'b1 && q==1'b0)
begin
nst=S0;
y=1'b1;
ReturnN=1'b0;
end
else if(n== 1'b0 && d==1'b0 && q==1'b1)
begin
nst=S0;
y=1'b1;
ReturnN=1'b0;
end
else
begin
nst = cst;
y=1'b0;
ReturnN=1'b0;
end
S20: if (n== 1'b1 && d==1'b0 && q==1'b0)
begin
nst = S0;
y=1'b1;
ReturnN=1'b0;
end
else if(n== 1'b0 && d==1'b1 && q==1'b0)
begin
nst=S0;
ReturnN<=1'b1;
y = 1'b1;
end
else if(n== 1'b0 && d==1'b0 && q==1'b1)
begin
nst=S0;
y=1'b1;
ReturnN=1'b0;
end
else
begin
nst = cst;
y=1'b0;
ReturnN=1'b0;
end
default: nst = S0;
endcase
end
always@(posedge clk) //or posedge reset)
begin
if (reset)
cst <= S0;
else
cst <= nst;
end
endmodule
TESTBENCH
module vending_tb;
reg n,d,q,clk,reset;
wire y, ReturnN;
candy m1(n,d,q,reset, clk,y, ReturnN);
initial
begin
reset=0 ;clk=0;n=0;q=0;d=0;
$monitor($time, , ,"c=%b",clk,,"dispense=%b",y,,"r=%b",reset,,"d=%b",d,,"n=%b",n,,"q=%b",q,,"r_nickel=%b",ReturnN);
#10 d=0;n=1;q=0;
#10 d=0;n=0;q=1;
#10 d=0;n=0;q=0;
#10 d=0;n=0;q=0;
#10 d=0;n=0;q=1;
#10 d=0;n=0;q=0;
#10 d=0;n=0;q=0;
#10 d=0;n=0;q=0;
#10 d=0;n=0;q=0;
end
always
#5 clk=~clk;
initial
#100 $finish ;
endmodule
无论我如何分配,ReturnN的结果始终为0