Design Code:
`timescale 1ns / 1ps
module vending_machine(
input clk, reset, cancel,
input [1:0] coin, sel,
output reg PrA, PrB, PrC, change
);
// State encoding using parameter
parameter S0 = 3'b000, S5 = 3'b001, S10 = 3'b010, S15 = 3'b011, S20 = 3'b100;
reg [2:0] current_state, next_state;
// Sequential logic for state transition
always @(posedge clk or posedge reset) begin
if (reset)
current_state <= S0; // Reset to initial state
else
current_state <= next_state;
end
// Next State Logic (Combinational)
always @(*) begin
case (current_state)
S0: begin
if (coin == 2'b01) next_state = S5;
else if (coin == 2'b10) next_state = S10;
else next_state = S0;
end
S5: begin
if (coin == 2'b01) next_state = S10;
else if (coin == 2'b10) next_state = S15;
else if (cancel) next_state = S0;
else next_state = S5;
end
S10: begin
if (coin == 2'b01) next_state = S15;
else if (coin == 2'b10) next_state = S20;
else if (cancel) next_state = S0;
else next_state = S10;
end
S15: begin
if (coin == 2'b01) next_state = S20;
else if (cancel) next_state = S0;
else next_state = S15;
end
S20: begin
if (cancel) next_state = S0;
else next_state = S20;
end
default: next_state = S0; // Default state
endcase
end
// Output Logic
always @(posedge clk or posedge reset) begin
if (reset) begin
PrA <= 0;
PrB <= 0;
PrC <= 0;
change <= 0;
end
else begin
// Default values (avoid latches)
PrA <= 0;
PrB <= 0;
PrC <= 0;
change <= 0;
case (current_state)
S5: begin
if (sel == 2'b00) begin
PrA <= 1; // Product A (Rs. 5)
change <= 0; // No change needed
end
end
S10: begin
if (sel == 2'b00) begin
PrA <= 1; // Product A (Rs. 5)
change <= 1; // Rs. 5 change
end
else if (sel == 2'b01) begin
PrB <= 1; // Product B (Rs. 10)
change <= 0; // No change needed
end
end
S15: begin
if (sel == 2'b01) begin
PrB <= 1; // Product B (Rs. 10)
change <= 1; // Rs. 5 change
end
end
S20: begin
if (sel == 2'b00) begin
PrA <= 1;
change <= 1; // Rs. 15 change
end
else if (sel == 2'b01) begin
PrB <= 1;
change <= 1; // Rs. 10 change
end
else if (sel == 2'b10) begin
PrC <= 1; // Product C (Rs. 20)
change <= 0; // No change needed
end
end
endcase
// Handle cancellation (return money)
if (cancel)
change <= 1;
end
end
endmodule