设计一个自动饮料售卖机,共有两种饮料,其中饮料 A 每个 10 分钱,饮料 B 每个 5 分钱,硬币有 5 分和 10 分两种,并考虑找零--verilog实现。
//设计一个自动饮料售卖机,共有两种饮料,其中饮料 A 每个 10 分钱,饮料 B 每个 5 分钱 //硬币有 5 分和 10 分两种,并考虑找零。 //要求用状态机实现,定义状态,画出状态转移图,并用 Verilog 完整描述该识别模块。 //sel为1.表示选择饮料A,sel为0,表示选择饮料B。//输入2'b01--表示5分钱,2'b10--表示10分钱。
//d_in表示投入钱的数量,d_out高表示输出饮料,d_c表示找零。 module sel_fsm ( input clk, input rst, input sel, input [1:0]d_in, output reg d_out, output reg [1:0]d_c ); reg [1:0]state,nextstate; parameter s0=2'b00; parameter s1=2'b01; parameter s2=2'b10; always @(posedge clk or negedge rst) begin if(!rst) begin state <= s0; end else begin state <= nextstate; end end always @(state or sel or d_in) begin nextstate = 2'bxx; case (state) s0: begin if(d_in==2'b01 && sel == 1'b1) begin nextstate = s1; {d_c,d_out} = 3'b0; end else if(d_in == 2'b10 && sel == 1'b1) begin nextstate = s0; {d_c,d_out} = 3'b001; end else if(d_in == 2'b01 && sel == 1'b0)begin nextstate = s0; {d_c,d_out} = 3'b001; end else if(d_in == 2'b10 && sel == 1'b0)begin nextstate = s0; {d_c,d_out} = 3'b011; end else begin nextstate = s0; {d_c,d_out} = 3'b0; end end s1:begin if(d_in == 2'b01 && sel == 1'b1) begin nextstate = s0; {d_c,d_out} = 3'b001; end else if (d_in == 2'b10 && sel == 1'b1) begin nextstate = s0; {d_c,d_out} = 3'b011; end else if(sel == 1'b0)begin nextstate = s0; {d_c,d_out} = 3'b001; end else begin nextstate = s1; end end default: nextstate = s0; endcase end endmodule
`timescale 1ns/1ps module test_tb; reg clk; reg rst; reg sel; reg [1:0]d_in; wire d_out; wire [1:0]d_c; sel_fsm u1( .clk(clk), .rst(rst), .sel(sel), .d_in(d_in), .d_out(d_out), .d_c(d_c) ); initial begin clk = 1'b1; rst = 1'b0; #7; rst = 1'b1; end always #5 clk = ~clk; initial begin #10; sel = 1'b1; d_in = 2'b01; #10 d_in = 2'b01; #10 d_in = 2'b01; #10 d_in = 2'b01; #10 d_in = 2'b10; #10 d_in = 2'b00; #10 d_in = 2'b01; #10 sel = 1'b0; #10 d_in = 2'b01; #10 d_in = 2'b00; #10 d_in = 2'b10; #10 d_in = 2'b00; #10; end endmodule