Нет выхода из провода, используя Verilog - PullRequest
0 голосов
/ 13 марта 2019

В настоящее время я работаю над проектом класса для создания торгового автомата FSM с использованием verilog. В настоящее время я застрял в той части тестового стенда, где я пытаюсь проверить один из моих выходов «ReturnN», который должен возвращать никель, когда никель и четверть вставлены, поскольку напиток стоит 25 центов. Выход ReturnN устанавливается на 0 независимо от того, как я пытаюсь назначить рег. Я определил другие регистры / переменные таким же образом, и я могу получить желаемый результат. Я очень плохо знаком с 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, независимо от того, как я назначаю

...