// 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