基于FPGA的自动售货机设计---第一版

欢迎各位朋友关注“郝旭帅电子设计团队”,本篇为各位朋友介绍基于FPGA的自动售货机设计—第一版。

功能说明:

  1. 自动售货机的显示信息为数码管。
  2. 前三个数码管显示商品的名字和价格(A 2.0 B2.5 C 3.0)
  3. 在未确定状态,可以通过选择商品按键进行商品选择。
  4. 选择好商品后,可以按下确认选择按键,此时前三个数码馆开始闪烁。此时选择商品键将无法使用。
  5. 当选择完商品后,可以通过按键模拟投入0.5元和1元,钱数显示在最后两个数码管上。
  6. 当输入钱数等于商品价格时,钱数显示归0,控制led(leda、ledb、ledc),点亮1秒钟,表示有商品输出,商品从新进入可以选择的状态。
  7. 当输入钱数大于商品价格时,钱数显示归0,控制led(leda、ledb、ledc),点亮1秒钟,表示有商品输出,商品从新进入可以选择的状态;
    控制led2,点亮一秒钟,表示有找零输出。
  8. 在输入钱的时候,商品无法切换,且前三个数码管一直闪烁。
  9. 在选择商品时,无法输入金钱。

使用平台:本次设计应用Altera的平台设计(芯片:EP4CE10F17C8N)。

作者QQ:746833924

说明:本篇设计中不涉及到IP和原语,代码在其他平台依然可以适用;当其他板卡电路不同时,会导致不同的现象出现,如有需要修改代码请联系作者;如需作者使用的板卡,请联系作者;

设计思想如下:

在这里插入图片描述

key_ctrl模块负责将外部的按键信号进行消抖,并且产生对应边沿变化时的脉冲;auto_seller_ctrl模块负责根据脉冲信号和设计逻辑产生对应数字逻辑;water_mode_convert模块负责将选择的水和价格译码出来,并且根据是否选择确定,来控制数码管对应的位置是否闪烁;led_ctrl模块是根据外部的脉冲,控制led点亮一秒钟;seven_tube_drive(七段数码管驱动)模块负责将产生的数字逻辑显示到数码管上。

key_ctrl模块设计思想为:按键信号是由外部机械式按键产生,每次按下或者抬起时,会产生一定的抖动。如果直接对其进行边沿检测就会导致多次触发。故而需要设计按键消抖,进而对消抖之后的波形进行边沿检测。消抖原理为:外部按键信号发生改变后,如果能够持续20ms,没有新的改变,就认为此次改变不是抖动,而是真正的按下,然后进行采样即可。

auto_seller_ctrl模块的设计思想:利用状态机设计进行实现。共有八个状态。

  localparam      STATE_IDLE              =     8'b0000_0001;
  localparam      STATE_SEL               =     8'b0000_0010;
  localparam      STATE_ZERO_ZERO         =     8'b0000_0100;
  localparam      STATE_ZERO_FIVE         =     8'b0000_1000;
  localparam      STATE_ONE_ZERO          =     8'b0001_0000;
  localparam      STATE_ONE_FIVE          =     8'b0010_0000;
  localparam      STATE_TWO_ZERO          =     8'b0100_0000;
  localparam      STATE_TWO_FIVE          =     8'b1000_0000;

复位结束后,在IDLE状态。之后进入SEL状态,可以通过切换商品按键切换商品的选择。通过按下选择OK键,进入到投递金钱的状态。下面把所有的有可能出现的金钱都做状态设计,根据现有状态和投入的金钱做出对应的动作(输出对应的出货脉冲和找零脉冲、输出输入的钱数)即可。
图片


  always @ * begin
    case (c_state)
      STATE_IDLE            :   n_state = STATE_SEL;
      STATE_SEL             :   n_state = (flag_ok == 1'b1) ? STATE_ZERO_ZERO : STATE_SEL;
      STATE_ZERO_ZERO       :   if (flag_half == 1'b1)
                                  n_state = STATE_ZERO_FIVE;
                                else 
                                  if (flag_one == 1'b1)
                                    n_state = STATE_ONE_ZERO;
                                  else
                                    n_state = STATE_ZERO_ZERO;
      
      STATE_ZERO_FIVE       :   if (flag_half == 1'b1)
                                  n_state = STATE_ONE_ZERO;
                                else 
                                  if (flag_one == 1'b1)
                                    n_state = STATE_ONE_FIVE;
                                  else
                                    n_state = STATE_ZERO_FIVE;
      
      STATE_ONE_ZERO       :    if (flag_half == 1'b1)
                                  n_state = STATE_ONE_FIVE;
                                else 
                                  if (flag_one == 1'b1)
                                    if (water_mode == 2'd0)
                                      n_state = STATE_IDLE;
                                    else
                                      n_state = STATE_TWO_ZERO;
                                  else
                                    n_state = STATE_ONE_ZERO;
                                  
      STATE_ONE_FIVE      :   if (flag_half == 1'b1)
                                  if (water_mode == 2'd0)
                                    n_state = STATE_IDLE;
                                  else
                                    n_state = STATE_TWO_ZERO;
                              else 
                                if (flag_one == 1'b1)
                                  if (water_mode == 2'd0)
                                    n_state = STATE_IDLE;
                                  else
                                    if (water_mode == 2'd1)
                                      n_state = STATE_IDLE;
                                    else
                                      n_state = STATE_TWO_FIVE;
                                else
                                  n_state = STATE_ONE_FIVE;
                                                    
      STATE_TWO_ZERO      :   if (flag_half == 1'b1)
                                  if (water_mode == 2'd1)
                                    n_state = STATE_IDLE;
                                  else
                                    n_state = STATE_TWO_FIVE;
                              else 
                                if (flag_one == 1'b1)
                                  n_state = STATE_IDLE;
                                else
                                  n_state = STATE_TWO_ZERO;
                                  
      STATE_TWO_FIVE     :   if (flag_half == 1'b1)
                                n_state = STATE_IDLE;
                              else 
                                if (flag_one == 1'b1)
                                  n_state = STATE_IDLE;
                                else
                                  n_state = STATE_TWO_FIVE;
                                  
      default             :     n_state = STATE_IDLE;
    endcase
  end

water_mode_convert模块的设计思想为:根据选择的水,解析出对应的种类和价格;当未确定选择时,正常输出水的种类和价格;当确定选择时,让输出在正常输出和息屏输出每0.5s进行切换一次。

  always @ (posedge clk) begin
    if (rst_n == 1'b0)
      water_mode_bcd_src <= 12'hA20;
    else
      case (water_mode)
        2'd0    :   water_mode_bcd_src <= 12'hA20;
        2'd1    :   water_mode_bcd_src <= 12'hB25;
        2'd2    :   water_mode_bcd_src <= 12'hC30;
        default :   water_mode_bcd_src <= 12'hA20;
      endcase
  end

led_ctrl模块的设计思想为:根据外部输入的脉冲,控制对应的led点亮一秒钟即可。

七段数码管为普通六位一体的共阳极数码,采用动态驱动的方式,在此不再赘述。

下板时,按下复位,此项设计开始运行。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

讲解和演示视频链接如下:

https://www.bilibili.com/video/BV1Tr42177wX/?spm_id_from=333.999.0.0&vd_source=b5405faeab8632f02533bcbfc5e52e55

本设计所有内容(设计代码、设计工程)链接为:

链接:https://pan.baidu.com/s/1JfUSrUaIRrb5-4aEg7vfeA
提取码:ojzq

本篇内容中有部分资源来源于网络,如有侵权,请联系作者。

如果您觉得本公众号还不错的话,可以推给身边的朋友们,感谢并祝好!

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于FPGA自动售货机控制系统设计是一种新型的自动售货机控制系统,它采用FPGA芯片作为核心控制器,实现了自动售货机的自动化控制和管理。该系统具有高效、稳定、可靠、灵活等特点,能够满足不同场合的需求。同时,该系统还可以实现多种支付方式,如现金支付、刷卡支付、移动支付等,方便用户购买商品。此外,该系统还可以实现商品库存管理、销售统计、故障报警等功能,提高了自动售货机的管理效率和服务质量。 ### 回答2: 自动售货机是现代社会公共场合中不可或缺的设备,而基于FPGA自动售货机控制系统设计自动售货机技术发展中具有巨大的潜力和优势。 首先,该系统可以将传统的控制芯片替换为FPGA芯片,这一替换能够克服传统控制芯片固定功能的缺陷,大大增强自动售货机自主智能控制的能力。 其次,基于FPGA自动售货机控制系统具有高度灵活性。FPGA芯片的底层构造可以根据自动售货机应用的需求进行定制,如可定制的逻辑和协议等。因此,基于FPGA自动售货机控制系统可以满足不同售货机的不同功能需求。 此外,基于FPGA自动售货机控制系统安全性优秀。FPGA芯片集成了多种硬件防护技术,如位移序列、电源监控、比特流监测等。这些技术使得自动售货机在面临恶意攻击或非法操作时更加安全可靠。 最后,基于FPGA自动售货机控制系统具有极高的稳定性和可扩展性。FPGA芯片使用的是固定逻辑门,因此可以减少故障或断电时的数据损失。同时,该系统支持快速扩容,可将售货机连接成一个网络,方便实现数据收集和维护。 总之,基于FPGA自动售货机控制系统设计在目前自动售货机技术的发展趋势中具有重要作用,并有助于提高自动售货机的智能控制、安全性、稳定性和可扩展性。 ### 回答3: 随着科技的不断发展,传统的自动售货机已不足以满足人们的需求。为了提高售货机的性能和功能,利用FPGA进行自动售货机控制系统设计已成为一种趋势。 基于FPGA自动售货机控制系统的设计核心是FPGA芯片,它具有可编程性、灵活性以及高度集成的特点,能够实现灵活多变的功能和极高的性能,是开发自动售货机控制系统不可或缺的技术。 该系统包括硬件和软件两个方面。硬件方面,通过FPGA芯片实现数据采集、通信传输、控制逻辑处理等功能,其中还包括监测货道、货源位置、货道物品信息等传感器模块。此外还包括库存控制模块、货币识别模块和专用电源模块等。 软件方面,首先通过用户界面和嵌入式操作系统设计可交互的用户界面和信号处理程序。然后,通过使用Verilog语言或VHDL语言来开发FPGA的控制逻辑,定制控制器的电路图,实现各种不同的自动售货机操作和功能。 基于FPGA自动售货机控制系统设计充分利用现代技术,提高了自动售货机的可靠性、稳定性、灵活性和效率,同时降低了系统成本和开发周期。它可以更好地满足人们的需求和升级,具有很高的发展潜力和市场前景,因此在未来相信会获得广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值