23.状态机设计——可乐机设计(2.5元1瓶可乐,有找零功能)

(1)Visio视图:

(2)Verilog代码:

module fsm_cola_plus(clk,reset_n,pi_money_one,pi_money_half,po_cola,po_money);

    input clk;
    input reset_n;
    input pi_money_one;
    input pi_money_half;
    
    output po_cola;
    output po_money;
    
    reg [4:0] state;
    
    wire [1:0]pi_money;
    reg [1:0]po;
    
    parameter IDLE      = 5'b00001;
    parameter HALF      = 5'b00010;
    parameter ONE       = 5'b00100;
    parameter ONE_HALF  = 5'b01000;
    parameter TWO       = 5'b10000;
    
//输入、输出信号编码设计
    assign pi_money = {pi_money_one,pi_money_half};
    assign {po_cola,po_money} = po;
    
//状态机状态跳转设计
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            state <= IDLE;
        else begin
            case(state)
                IDLE:begin
                    if(pi_money == 2'b10)
                        state <= ONE;
                    else if(pi_money == 2'b01)
                        state <= HALF;
                    else 
                        state <= state;
                end
                
                HALF:begin
                    if(pi_money == 2'b10)
                        state <= ONE_HALF;
                    else if(pi_money == 2'b01)
                        state <= ONE;
                    else 
                        state <= state;
                end
                
                ONE:begin
                    if(pi_money == 2'b10)
                        state <= TWO;
                    else if(pi_money == 2'b01)
                        state <= ONE_HALF;
                    else 
                        state <= state;
                end
                
                ONE_HALF:begin
                    if(pi_money == 2'b10)
                        state <= IDLE;
                    else if(pi_money == 2'b01)
                        state <= TWO;
                    else 
                        state <= state;
                end
                
                TWO:begin
                    if((pi_money == 2'b10) || (pi_money == 2'b01))
                        state <= IDLE;
                    else 
                        state <= state;
                end
                
                default:begin
                    state <= IDLE;
                end
            endcase
        end
        
//状态机输出信号设计
    always@(posedge clk or negedge reset_n)
        if(!reset_n)
            po <= 2'b00;
        else if(((state == ONE_HALF) && (pi_money == 2'b10)) || ((state == TWO) && (pi_money == 2'b01)))
            po <= 2'b10;
        else if((state == TWO) && (pi_money == 2'b10))
            po <= 2'b11;
        else
            po <= 2'b00;
    
endmodule

(3)仿真文件代码:

`timescale 1ns / 1ps

module fsm_cola_plus_tb;

    reg clk;
    reg reset_n;
    reg pi_money_one;
    reg pi_money_half;
    
    wire po_cola;
    wire po_money;

    fsm_cola_plus fsm_cola_plus_inst(
        .clk(clk),
        .reset_n(reset_n),
        .pi_money_one(pi_money_one),
        .pi_money_half(pi_money_half),
        .po_cola(po_cola),
        .po_money(po_money)
    );
    
    initial clk = 1'd1;
    always #10 clk = ~clk;
    
    initial begin
        reset_n <= 1'd0;
        pi_money_half <= 1'd0;
        pi_money_one  <= 1'd0;
        #15;
        reset_n <= 1'd1;
        #200;
        pi_money_half <= 1'd1;      //0.5元
        #20;
        pi_money_half <= 1'd0;
        pi_money_one  <= 1'd1;      //1.5元
        #20;
        pi_money_half <= 1'd0;
        pi_money_one  <= 1'd0;      //1.5元
        #40;
        pi_money_half <= 1'd0;
        pi_money_one  <= 1'd1;      //0元       可乐不找零
        #20;
        pi_money_half <= 1'd0;  
        pi_money_one  <= 1'd0;      //0元
        #200;
        pi_money_half <= 1'd0;
        pi_money_one  <= 1'd1;      //1元
        #20;
        pi_money_half <= 1'd1;
        pi_money_one  <= 1'd0;      //1.5元
        #20;
        pi_money_half <= 1'd1;
        pi_money_one  <= 1'd0;      //2元
        #20
        pi_money_half <= 1'd0;
        pi_money_one  <= 1'd1;      //0元   可乐加找零
        #20
        pi_money_half <= 1'd0;
        pi_money_one  <= 1'd0;      //2元
        #200;
        $stop;
    end


endmodule

(4)仿真波形:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值