// Soda Machine FSM (Mealy FSM) // A. Lerer & C. Celio (TAs), 6.111 Spring 2009 // Soda costs $0.20 // Input accepts only nickels and dimes module vend_fsm ( input clk, input reset, input nickel, input dime, output ret_soda, output ret_nickel ); // mealy FSM uses less states than moore FSM! localparam IDLE = 3'd0; localparam S5 = 3'd1; localparam S10 = 3'd2; localparam S15 = 3'd3; reg [2:0] state; reg [2:0] next_state; // sequential logic: state register always @ (posedge clk) begin if (reset) state <= IDLE; else state <= next_state; end // combinational logic: next state always @ (*) begin case(state) IDLE: next_state = nickel ? S5 : dime ? S10 : IDLE; S5: next_state = nickel ? S10 : dime ? S15 : S5; S10: next_state = nickel ? S15 : dime ? IDLE : S10; S15: next_state = nickel ? IDLE : dime ? IDLE : S15; default: next_state = IDLE; endcase end // combinational logic: outputs // mealy FSM sets outputs on both state AND inputs! // note: outputs can glitch! assign ret_soda = (state == S15 && (nickel || dime)) || (state == S10 && dime); assign ret_nickel = (state == S15 && dime); endmodule