当前位置:   article > 正文

【FPGA】自动售货机综合实现_自动售货机实验芯片

自动售货机实验芯片

一、项目需求

1. 售货机模拟项目。

pwm音频产生:PWM生成原理与控制输出

  • 模块

    按键消抖模块、有限状态机模块、LED模块、数码管模块、蜂鸣器模块

  • 功能实现

    • 售货机商品选择,存储商品1,2,单价设定为1.5元与1元,通过LED灯表示选择商品种类。
    • 商品选择后确定购买商品数量,并在数码管动态显示所选择商品的数量与商品总价。
    • 投币购买商品,数码管显示投币金额
    • 投币金额判断,满足商品出货,超额找零,调用PWM播放音乐,不足提示音,可继续投币
    • LED灯显示状态切换,识别进入状态并提示下一步操作

二、要求

  1. 了解FPGA架构和传统单片机的区别、
  2. 可独立完成实训中实验代码编写烧录、
  3. 可独立根据CycloneIV开发板现有元器件资源完成程序设计及代码编写

三、售货机原理

1. 基本原理

  1. 模拟真实综合售货机,采用数码管显示商品购买数量,商品总金额,投币金额,仿真实际生活的从商品选择数目的添加到投币购买完整状态。
  2. Led灯实现状态变换标志,led3,led2交替闪烁进入商品选择状态,单led亮确认商品选择。
  3. 数码管显示金额差值清0操作仿真售货机找0操作与回到初始状态。
  4. 购买状态音乐播放,成功失败调用不同音乐效果,模仿售货机购物操作是否成功。

2. 思路架构

在这里插入图片描述

  • 核心商品购买模块
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JqDldLbg-1651906508848)(C:\Users\24768\AppData\Roaming\Typora\typora-user-images\1651829525719.png)]
  1. FSM状态机状态细分
    1. 状态1: 初始状态(K4:进入状态2)(K3:进入状态5)(K2:确定)
    2. 状态2: 商品选择状态(K4:进入状态3)(K3:进入状态4)(K2:回到状态1)
    3. 状态3: 商品1数量修改状态(K4:当前商品数+1)(K3:当前商品数-1)(K2:回到状态1)
    4. 状态4: 商品2数量修改状态(K4:当前商品数+1)(K3:当前商品数-1)(K2:回到状态1)
    5. 状态5: 投币状态(K4:投1元)(K3:投0.5元)(K2:回到状态1)(K1:复位)
  2. key按键复用
      实现多商品选择及购物功能实现过程中,按键[3:0]key,需要进行按键复用操作,购买状态中,会默认进入初始状态,按键执行操作后,进入不同的状态:如商品选择状态,数量选择,投币状态,后执行按键操作,功能性改变,实现少按键多功能性操作。
  3. 按键消抖
    1. 产生原因:
        执行按键操作中,通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,电路开关不会发生迅速进入闭合或者断开状态。闭合或断开会发生机械抖动问题,可能产生多次按键效果
    2. 消抖原理
        设定抖动结束判断,通过比较判定抖动是否结束,信号变化频率平稳后持续20ms进行采样,确保按键消抖正常,同时对松开按键操作进行同样消抖操作处理。
      在这里插入图片描述
    3. 系统框图
      在这里插入图片描述
  4. 数码管显示
    1. 商品及数量动态显示
      1. 初始状态进入商品选择态,选择商品后自动切换进入商品数量选择中,此时按键功能性改变,可以对该商品的数量进行添加或减少,通过设定传递值com1_count、com2_count对商品1.2选择数量进行存储
      2. 通过传递按键消抖后标志值判断是否选择该商品并进行+1 -1操作,为计算总金额提供参数值,同时传递值进入seg模块,同样采取如投币的思路对传递值进行操作,实现数据的动态显示。
    2. 投币总金额及商品总金额数码管动态显示 在这里插入图片描述
      1. 投币采用KEY4 KEY3键作为投币输入,先对按键进行消抖后,进入到INSERT_STATE,对按键操作传递标识值,传递值为1,则按键值+1或0.5,累加记录按键操作次数,从而获得总输入金额

      2. 投币金额计算:在进行数据类型存储中,采用简易化方式,通过改变键值传递,金额加减算法,如0.5元在机内运算中通过整数值存储为5,采用十进制数据存储计算,优化运算过程,因数码管位数显示限制,投币操作中金额存在上限,通过对机内计算金额取余取整方式,实现数码管中的金额显示功能

        1. 金额/10:投币金额 x元
        2. 金额%10:投币金额 .y元
        // 中间两位显示投币数
        			6'b110_111: number = now_coins % 10;
        			6'b111_011: number = now_coins / 10;
        
        • 1
        • 2
        • 3
      3. 金额小数位显示:调用晶体管过程中,对数码管相应的sel位的seg模块赋予低电平进行点亮操作

        if (sel == 6'b111_011 || sel == 6'b101_111)
        				seg_r[7] <= 0;
        
        • 1
        • 2
      4. 总金额计算:通过投币传递值进行机内计算,同时设定存储金额上限为9.9,若发生一处操作,则进行置值操作,或可进入返回清0。同时将total值传递到seg模块,取余取整。

        wire [10:0] total_price_ex;
        	assign total_price_ex = com1_unit_price * com1_count + com2_unit_price * com2_count;
        	reg [6:0] total_price_temp;
        
        • 1
        • 2
        • 3
      5. 出货及清0动态显示
        商品购买状态下,设定额外状态,判断商品购买,通过值传递:商品总价,投币总金额进入状态,并设定状态,successful / fail状态

        if (now_state == DEFAULT_STATE && key_now == 3'd1) begin  // 在初始状态按下key1,即购买物品
        	if (now_coins >= total_price && total_price > 0) begin // 购买成功
        		buy_state_r <= BUY_SUCCESSFUL_STATE;
        
        • 1
        • 2
        • 3
        1. 投币金额等于商品总价
          此时successful并执行出货操作,恢复初始状态,并传递成功状态标志
        2. 投币金额超出商品总价
          此时successful并执行出货操作,执行找零操作,并在数码管上显示找0余额
          change_r <= now_coins - total_price;
          
          • 1
          恢复初始状态,并传递成功状态标志,调用其他功能效果
        3. 投币金额小于商品总价
          fail 并传递失败状态标志,此时保持投币状态,可继续进行投币操作

        系统框图 在这里插入图片描述

    3. 数码管动态整体性显示
      1. 晶体管驱动添加:采用跑马灯形式,通过缩短单晶体管显示时间间隔,达到肉眼状态下sel数码管同时显示效果,如20us,过程中,在进行点亮sel中,主体采用移位操作
        else if (cnt_delay == MAX_NUM)
        			sel_r <= {sel_r[0],sel_r[5:1]};
        		else
        			sel_r <= sel_r;
        
        • 1
        • 2
        • 3
        • 4
      2. 系统框图 在这里插入图片描述
  5. Led状态显示

    FSM状态机进入不同状态,通过设定状态标识符,调用不同LED灯管显示效果
        if (now_state == DEFAULT_STATE)
        	led_r <= 4'b0001;
        else if(now_state == SELECT_STATE) begin
        	if (cnt_shine < SHINE_T/2)
        		led_r <= 4'b1100;
    
    • 1
    • 2
    • 3
    • 4
    • 5

3. RTL物理模型实现

在这里插入图片描述

四、项目分析解决

  1. 综合项目:售货机
    在这里插入图片描述
    1. 问题

      1. 状态切换:采用Mealy型状态机实现功能效果,通过按键效果,进入不同状态选择,需要对按键进行多次复用,同一按键执行不同功能。 在这里插入图片描述
      2. 商品选择流程:初始状态进入商品选择,确认商品后可以对商品数量的需求进行添加或减少,同时通过com1/com2对数量值进行传递,同时机内进行商品总金额计算
        在这里插入图片描述
      3. 商品购买完整流程:选择商品状态通过按键选择进入投币状态,key3 key4键投入硬币,模拟真实投币效果,此时通过设定now_coins值对值进行存储,并输出此值进入购买状态判断中,判断购买成功,并回传changer值作为找零功能实现,满足条件出货,不满足则继续投币状态。
        在这里插入图片描述
      4. 音乐模块
        1. 蜂鸣器模块调用
            蜂鸣器IO口连接在FPGA芯片,PWM输出信号只有高低电平,重复输出周期T,在高电平1时间为t的脉冲中,占空比t/T
          在这里插入图片描述
            ​定义输出周期,通过调整低电平占空比,如20,30等通过按键作为控制和触发条件, 持续周期内发出一种声音,切换后发出另一种声音。

        2. 乐谱模块
            ​音频:音频(Audio),指人耳可以听到的声音频率在20HZ~20kHz之间的声波。乐普是由音符组成的,不同的音符拥有不同的频率。
          在这里插入图片描述
            ​计算出音符振动的周期,单位微秒。Cyclone IV开发板的晶振是50MHz,振动一次是20纳秒,使用周期时间除以20纳秒得出音符振动的次数。
          D O ( 高 ) = 955 × 1 0 3 20 = 47750 DO(高)= \frac{955×10^3}{20}=47750 DO()=20955×103=47750

    2. 不足

      • 使用数码管位数有限,在实现部分功能上存在限制,如投币功能实现中,根据位数实现时,投币金额上限单位为9,不能实现过10进位,同理选择商品计算总金额要和会出现同问题。
      • 实现音乐播放效果,修改占空比提高声音效果,技术局限导致提高音量音质受损,提高音质音量较低。
      • 按键功能实现选择商品存在局限。
    3. 实现效果
      在这里插入图片描述

五、总结

  1. 实验过程中尝试实现按键复用功能,需要根据购买状态切换,按键功能实现动态切换,如进入投币状态上一状态中key4实现商品数量+1,此状态下实现投币 +1 ,这个过程中需要完整实现有限状态机的逻辑功能,确保机内状态跳转正常高效。过程中实现困难,初始阶段中,程序下载后状态跳转无法切换,处于非初始态指示灯跳转处于初始态。经队友查找,使用异步时钟信号未进行复位功能操作,导致电平信号发生错位,导致进入不同状态,需要先进行返回操作实现复位动作才能正确运行。

参考

按键消抖+点亮led灯
按键消抖+蜂鸣器
基于FPGA状态机的自动售货机功能实现
FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/246481
推荐阅读
相关标签
  

闽ICP备14008679号