李红科 王庆春 贾晓菲
(安康学院电子与信息工程学院 陕西省安康市 725000)
随着集成电路产业快速发展,电路集成度越来越高,以计算机辅助为基础的电子设计自动化(EDA Electronics Design Automation)技术成为集成电路设计重要工具[1],Verilog HDL 硬件描述语言是以文字形式描述数字系统硬件电路结构和行为的语言,只需描述电路的功能和电路模块之间的相互关系,设计者更加专注电路设计整体性能,使电路更加优化,提高设计效率[2]。
自动售货机是一种常见的智能自动化设备,由于不受人直接参与,所以广泛应用在办公楼、操场、高速服务区等场所,大大降低时间、地点的限制,在节省人力资源方面有着明显优势。
有限状态机(FSM Finite-state Machine)是一种用来进行对象行为建模的工具,其作用是表示有限个状态以及这些状态之间相互转移和动作等行为的数学模型。有限状态机广泛应用于建模行为、硬件电路设计、软件工程和网络协议等的设计。在数字系统设计中,当某一事物发生连续变化时,可以采用有限状态机设计思路提高设计效率,增加程序可读性,降低错误概率,有限状态机设计思路是数字系统中最常用的设计方法之一[3]。
该售货机电路设计要求:
(1)每次只能出售一种商品。
(2)所售商品种类:售货机只售4 种商品,所售商品编号分别用四位二进制数从右向左表示为0001、0010、0100、1000,对应价格分别为2 元、3 元、4 元、5 元。出售哪种商品可由顾客按下相应按键,按键旁边标记该商品的价格。
(3)等待投币:本售货机只识别1 元、5 元和10 元纸币和1元硬币,一次只能投入一种货币。在规定时间内(500 单位时钟内)可以连续投币,并计算投币总额,先找零再出货,超时返回开始状态,规定时间投币不足,退币并返回开始状态。
如图1所示,自动售货机在上一次出售完商品回到空状态,顾客按键选择所购商品,然后确认所选商品,判断所选商品是否售罄,售罄返回到空状态,没有售罄开始计时在500 时间单位内计算投币总额,如果规定时间内没有投币,则返回空状态,判断投币总额和所选商品价格关系,当投币总额等于商品价格,出货并返回空状态,当投币总额大于所选商品价格,先找零再出货并返回空状态,当投币金额小于所选商品价格,通过找零出口退币并返回空状态。
图1:售货机工作流程图
针对电路工作流程,将电路分为8 个状态,系统定义8 个状态,分别是空状态(S_idle)、商品选择状态(S_select)、商品确认状态(S_confirm)、商品是否售罄状态(S_allsell)、等待投币状态(S_money input)、投币金额和所选商品价格关系状态(S_confirm)、找零状态(S_change)和出货状态(S_out)。各状态之间转移关系及动作如图2所示。
系统程序输入端口:时钟端口1 个、投币端口2 个(纸币投币口和硬币投币口)、商品选择端口4 个、确认和取消端口各1 个。输出端口:找零端口和出货端口各1 个。
(1)商品选择模块:每次只能选择1 种商品,不允许一次选择多种商品。将4 个商品选择按键组成二进制编码。
(2)确认模块:每次只能按下“确认”或“取消”任意一个按键,同时按下2 个按键按照取消功能处理。
(3)判断所选商品是否充足模块:如果所选商品无货,则返回空状态,如果所选商品有货,则转入等待投币状态。left0、left1、left2、left3 代表编号从0001 到1000 商品剩余数量为零时信号,售货机每次出售1 个商品,内部机械装置将后一个商品输送到最前端,等待下次出货,当最后一个商品售出,由于商品自身重力作用,对应leftx=0(x 为0 到3),当某种商品没有售罄时leftx!=0,,
图2:状态转移图
(4)等待投币状态,在等待500 个时间单位周期内接受投币,超时投币不算,这个模块分两部分:1.货币识别:投币识别器分纸币和硬币两部分,我国目前市场流行小面额纸币分别是1 元、5 元和10 元和硬币1 元。纸币识别器包括主控部分、传感器部分、驱灯组件、AD 转换、外币存储器、电机电源等部件组成,硬币识别器相对纸币识别器简单,所以在找零环节只退硬币。纸币投币端口只能一次接收一张纸币,可以连续投币,硬币端口类似。但是1 元纸币和1 元硬币对电路输入信号是相同,货币识别器将每种货币转换为BCD 8421 码,送给主控模块。2.规定时间内投币总额计算。
(5)判断投币总额与所选商品价格关系模块:在投币模块计算出投币总额减掉所选商品价格,差值不等于零,转入找零模块。差值等于零,说明投币总额等于所选商品价格,没有找零,直接转入出货状态。
(6)找零模块:找零分两种情况:
1.投币总额大于商品价格;2.投币总额小于商品价格,退币从找零端口输出。
针对自动售货机的3 种工作状态分别做如下仿真:(说明为了调整仿真图能放在1 张图上完整显示仿真效果,调整投币等待时间,从原来500 单位时间等待,缩减到25 单位时间,其他参数不变。商品编号从右向左依次0-1-2-3,价格从右向左依次2、3、4 和5 元)
(1)找零情况仿真:一次投币金额大于所选商品价格,选择编号为0010 商品价格3 元,投入5 元纸币。从图3看到,选择0010 商品,确认,等待投币5 元,先找3 元,然后出货编号0010,仿真结果正确。
图3:找零仿真
(2)连续投币情况仿真:选择编号为1 商品价格3 元,连续投入3 次1 元,没有找零,出货编号0010,仿真结果如图4所示。
图4:连续投币仿真
(3)投币不足情况仿真:选择编号为1 商品价格3 元,连续投入2 次1 元,投币总金额小于所选商品价格,不能购买该商品,仿真结果如图5所示,退币2 元,没有出货。
图5:退币仿真
当所选商品售罄时,利用商品自身重力作用给电路信号,left0、left1、left2 和left3 分别代表编号0-1-2-3 剩余量信号,某个商品售罄时,对应剩余量信号低电平,所选商品无法购买。
找零不足,在初始状态时,机器内部存有硬币足够找零,所以找零不足情况可以不用考虑。
采用Verilog HDL 语言,利用状态机模块化思想,可以在每个阶段仿真验证,保证设计正确性,降低设计成本,缩短设计周期,同时体现模块化、易修改等特点[4]。在大规模数字系统设计凸显出更多优势,使设计更加合理。从仿真结果分析,电路设计满足要求,系统允许规定纸币和硬币使用,能够完成售货、找零和退币等功能,因此具有一定实用价值。
目前随着无线支付方式的便捷性和消费者广泛使用,本设计只需在付款方式增加无线付款方式,用户扫描售货机界面付款码并成功支付,支付宝或微信后台收款并反馈给商家后台,商家返回给售货机付款成功信号,售货机就能完成出货动作。本文设计方法还可以应用在共享充电桩、共享洗衣机等设备的设计上。