首页 > 技术文章 > 设计一个自动饮料售卖机,共有两种饮料,其中饮料 A 每个 10 分钱,饮料 B 每个 5 分钱,硬币有 5 分和 10 分两种,并考虑找零--verilog实现。

shadow-fish 2020-08-21 21:38 原文

//设计一个自动饮料售卖机,共有两种饮料,其中饮料 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

 

推荐阅读