数字IC手撕代码——饮料机

该文章描述了一个使用Verilog语言设计的电路,该电路模拟了一台饮料机,接受0.5元和1.0元两种硬币,每次只接受一枚硬币。饮料价格为1.5元,状态机管理不同余额状态,包括IDLE、0.5元、1.0元、1.5元(出饮料)和2.0元(出饮料并找零0.5元)。电路还包括对饮料输出和硬币找零的控制逻辑。
摘要由CSDN通过智能技术生成

使用verilog设计电路,完成以下功能:每瓶饮料1.5元,一次只能投入一个硬币,可投入0.5与1.0两种硬币,具有找零功能。

原理

一瓶饮料1.5元,一次投入一个硬币,那么饮料机中硬币对应面值最多为2.0元,使用状态机设计电路,根据饮料机中剩余的硬币面值进行状态划分

状态划分

◆IDLE:复位状态,饮料机余额为0

◆s1:饮料机余额0.5元

◆s2:饮料机余额1.0元

◆s3:饮料机余额1.5元(输出饮料,不找零)

◆s4:饮料机余额2.0元(输出饮料,找零0.5元)

对于状态机的输入来说

input [1:0] money: money[1]为1元;money[0]为0.5元

output drink: 输出饮料状态

output coin: 输出硬币是否找零

状态转移图想画的好看有点复杂,按照00/01递进就行,略。

代码实现

module drink_machine(
    input clk,
    input rst_n,
    input [1:0] money,
    output drink,
    output coin
);

    parameter IDLE = 3'd0; // 余额0
    parameter s1   = 3'd1; // 余额0.5
    parameter s2   = 3'd2; // 余额1.0
    parameter s3   = 3'd3; // 余额1.5
    parameter s4   = 3'd4; // 余额2.0

    reg [2 : 0] state;
    reg [2 : 0] nstate;

    always@(posedge clk or negedge rst_n) begin
        if(rst_n == 1'b0)
            state <= IDLE;
        else
            state <= nstate;
    end

    always@(*) begin
        case(state)
            IDLE    : nstate = money[1] ? s2 : (money[0] ? s1 : IDLE);
            s1      : nstate = money[1] ? s3 : (money[0] ? s2 : s1);
            s2      : nstate = money[1] ? s4 : (money[0] ? s3 : s2);
            s3      : nstate = money[1] ? s2 : (money[0] ? s1 : IDLE);
            s4      : nstate = money[1] ? s2 : (money[0] ? s1 : IDLE);
            dafault nstate = IDLE;
        endcase
    end

    assign drink = (state == s3 || state == s4) ? 1 : 0;
    assign coin  = (state == s4) ? 1 : 0;

endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值