【FPGA学习笔记】用状态机来写一个简单的自动售卖机

一、模块框图的绘制

输入信号四个,分别是:时钟信号、复位信号、投币0.5元以及投币一元;

输出信号两个:出可乐信号和找零信号。

在这里插入图片描述

二、3要素

输入要素:0.5、1;
输出要素:不出可乐/不找零、出可乐/不找零、出可乐/找零;
状态要素:0、0.5、1、1.5、2、2.5、3。

三、状态机的绘制

在这里插入图片描述

(这里可乐价格规定为2.5元)首先状态机初始状态为IDLE,投0.5元硬币,状态机从初始状态跳到HALF状态(不出可乐),投1元硬币从初始状态跳转到ONE状态(不出可乐),再来看HALF状态,如果不投币,状态机保持HALF状态,如果投0.5元硬币,状态机从HALF状态跳转到ONE状态(不出可乐),同理投1元硬币,状态机从跳转到ONE_HALF状态(不出可乐),最后说一下从TWO状态开始,如果投0.5元硬币,状态会回到初始状态,然后出可乐,不找零,如果投1元硬币,回到初始状态,出可乐,找零。

通过状态机的绘制,我们可以通过这种方式把我们的波形图也绘制出来

在这里插入图片描述
波形图绘制完成后,我们可以进行代码的编写了。

四、代码部分

1、工程代码

`timescale  1ns/1ns

module  complex_fsm
(
    input   wire    sys_clk         ,   //系统时钟50MHz
    input   wire    sys_rst_n       ,   //全局复位
    input   wire    pi_money_one    ,   //投币1元
    input   wire    pi_money_half   ,   //投币0.5元
                    
    output  reg     po_money        ,   //po_money为1时表示找零
                                        //po_money为0时表示不找零
    output  reg     po_cola             //po_cola为1时出可乐
                                        //po_cola为0时不出可乐
);



//parameter define
//只有五种状态,使用独热码
parameter   IDLE     = 5'b00001;
parameter   HALF     = 5'b00010;
parameter   ONE      = 5'b00100;
parameter   ONE_HALF = 5'b01000;
parameter   TWO      = 5'b10000;

//reg   define
reg     [4:0]   state;

//wire  define
wire    [1:0]   pi_money;



//pi_money:为了减少变量的个数,我们用位拼接把输入的两个1bit信号拼接成1个2bit信号
//投币方式可以为:不投币(00)、投0.5元(01)、投1元(10),每次只投一个币
assign pi_money = {
   pi_money_one, pi_money_half};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值