// Soda Machine FSM (Moore 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 ); localparam IDLE = 3'd0; localparam S5 = 3'd1; localparam S10 = 3'd2; localparam S15 = 3'd3; localparam S20 = 3'd4; localparam S25 = 3'd5; 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 ? S20 : S10; S15: next_state = nickel ? S20 : dime ? S25 : S15; S20: next_state = IDLE; S25: next_state = IDLE; default: next_state = IDLE; endcase end // combinational logic: outputs // moore FSM sets outputs on state // note: outputs can glitch! assign ret_soda = (state == S20) || (state == S25); assign ret_nickel = (state == S25); endmodule