自动售卖机 饮料15元,钱有5,10,20三种,考虑找零
module fsm ( input clk, input rst_n, input [4:0] in_money, output reg [3:0] out_money, output reg [1:0] out_goods ); parameter s0 = 2’b00, s1 = 2’b01, s2 = 2’b10; reg [1:0] c_n, n_s; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin c_s <= s0; end else c_s <= n_s; end always@(posedge clk or negedge rst_n) begin if(!rst_n) begin n_s <= s0; end else case(n_s) s0: if(in_money == ‘d5) n_s <= s1; else if(in_money == ‘d10) n_s <= s2; else if(in_money == ‘d20) n_s <= s1; else n_s <= n_s; s1: if(in_money == ‘d5) n_s <= s2; else if (in_money == ‘d10) n_s <= s0; else if(in_money == ‘d20) n_s <= s2; else n_s < n_s; s2: if (in_money == ‘d5) n_s <= s0; else if (in_money == ‘d10) n_s <= s1; else if (in_money == ‘d20) n_s <= s0; else n_s <= n_s; default: n_s <= n_s; endcase end always@( posedge clk or negedge rst_n) begin if(!rst_n) begin out_money <= 0; out_goods <= 0; end else case(c_s) s0: if(in_money == ‘d5) begin out_money <= 5; out_goods <= 0; end else if(in_money == ‘d10) begin out_money <= 10; out_goods <= 0; end else if(in_money == ‘d20) begin out_money <= 5; out_goods <= 1; end else begin out_money <= out_money; out_goods <= out_goods; end s1: if(in_money == ‘d5) begin out_money <= 10; out_goods <= 0; end else if(in_money == ‘d10) begin out_money <= 0; out_goods <= 1; end else if(in_money == ‘d20) begin out_money <= 10; out_goods <= 1; end else begin out_money <= out_money; out_goods <= out_goods; end s2: if(in_money == ‘d5) begin out_money <= 0; out_goods <= 1; end else if(in_money == ‘d10) begin out_money <= 5; out_goods <= 1; end else if(in_money == ‘d20) begin out_money <= 0; out_goods <= 2; end else begin out_money <= out_money; out_goods <= out_goods; end endmodule