// File name : vending.v // Original : Evita_Verilog Tutorial from Aldec. // Modified by : Jianjian Song, 27 October 2000 // A pop vending machine. // Receive 5, 10, 25 cent coins and release a chocolate bar // if the total coin collection is 45 cents. No change given. module vending(ChocBarOpen,Coin25,Coin10,Coin5, RESET, CLOCK); output ChocBarOpen; reg ChocBarOpen; input Coin25, Coin10, Coin5; input RESET, CLOCK; // State variables reg [3:0] CurrentState, NextState; // State codes parameter Paid0 = 4'b0000, Paid5 = 4'b1000, Paid10 = 4'b0001, Paid15 = 4'b1001, Paid20 = 4'b0010, Paid25 = 4'b1010, Paid30 = 4'b0011, Paid35 = 4'b1011, Paid40 = 4'b0100, Paid45 = 4'b1100; // State registers always @ (posedge CLOCK or posedge RESET) begin if (RESET==1) CurrentState = Paid0; else CurrentState = NextState; end // Output logic always @ (CurrentState) if (CurrentState == Paid45) ChocBarOpen = 1; else ChocBarOpen = 0; // Next state logic always @(CurrentState or Coin25 or Coin10 or Coin5) case (CurrentState) Paid0: begin if (Coin25) NextState = Paid25; else if (Coin10) NextState = Paid10; else if (Coin5) NextState = Paid5; else NextState = Paid0; end Paid5: begin if (Coin25) NextState = Paid30; else if (Coin10) NextState = Paid15; else if (Coin5) NextState = Paid10; else NextState = Paid5; end Paid10: begin if (Coin25) NextState = Paid35; else if (Coin10) NextState = Paid20; else if (Coin5) NextState = Paid15; else NextState = Paid10; end Paid15: begin if (Coin25) NextState = Paid40; else if (Coin10) NextState = Paid35; else if (Coin5) NextState = Paid20; else NextState = Paid15; end Paid20: begin if (Coin25) NextState = Paid45; else if (Coin10) NextState = Paid30; else if (Coin5) NextState = Paid25; else NextState = Paid20; end Paid25: begin if (Coin25) NextState = Paid45; else if (Coin10) NextState = Paid35; else if (Coin5) NextState = Paid30; else NextState = Paid25; end Paid30: begin if (Coin25) NextState = Paid45; else if (Coin10) NextState = Paid40; else if (Coin5) NextState = Paid35; else NextState = Paid30; end Paid35: begin if (Coin25) NextState = Paid45; else if (Coin10) NextState = Paid45; else if (Coin5) NextState = Paid40; else NextState = Paid35; end Paid40: begin if (Coin25) NextState = Paid45; else if (Coin10) NextState = Paid45; else if (Coin5) NextState = Paid45; else NextState = Paid40; end Paid45: begin NextState = Paid0; end endcase endmodule