自动售货机控制系统设计与实现(基于VHDL开发) | 南锋

南锋

南奔万里空,脱死锋镝余

自动售货机控制系统设计与实现(基于VHDL开发)

这周完成一个课程任务,用VHDL语言写一个自动售货机的控制系统。使用的仿真器是MAX+plus。

设计说明

根据要求可自动出售两种货物,这里的自动售货机可销售cola和pepsi两种饮料:售货机可识别1元和0.5元两种货币,在一次购买过程中,可购买一个或者多个商品,系统会自动计算所需钱数和找零的钱数并自动找零。另外有3个发光二极管、6个LCD数码管:两个用来显示所需金额,两个用来显示已付金额,两个用来显示找零数。


流程说明

这里设计的自动售货机当通电时,表示一次销售的开始。顾客选择一种商品或多种商品后就进入投币状态。若不投币,则自动返回初始状态。投币后,系统自动计算所投钱数。若投币够,则出货并找零。若投币不够,如果顾客没有继续投币,则退币并回到初始状态。本系统的投币销售流程图如图所示:
流程图


各模块说明

本文设计的自动售货机总体分四个模块:总控模块、二进制译码模块、BCD码译码模块和顶层模块。

总控模块:总控模块是本系统最重要的模块,该模块大体有5个输入端口和6个输出端口。其输入端口包括clk、coin1(投入一元货币)、coin5(投入0.5元货币)、cola(选择cola)、pepsi(选择pepsi),输出端口有paid(已投入多少钱)、needed(还需多少钱)moneyout(找零)、success(灯亮表示交易成功)、failure(灯亮表示交易失败)、showmoneyout(灯亮表示正在找零)。该模块实现了本系统最重要的交易过程,包括选择商品、投入货币,计算剩余金额,找零出货等。

二进制译码模块:该模块有一个输入端口和两个输出端口。输入端口是一个8位的二进制数输出端口bcd0、bcd1是两个4位的BCD码。该模块的主要的功能是实现将主控模块输出的二进制数(paid、needed、moneyout)转换成BCD码,以便输出到七段数码管上显示出来。该模块的原理是将一个8位的二进制转换成2个4位的BCD码,分为高四位和低四位。

BCD码译码模块:该模块有一个输入端口和一个输出端口

顶层模块:该模块有五个输入和九个输出端口。其输入口包括clk1、P2(选择pepsi)、P1_5(选择cola)、C5(投入5毛)、C1(投入1块),输出端口有shuwout(退币指示灯)、s(交易成功指示灯)、f(交易失败指示灯)、paid_lcd0、paid_lcd1(已付金额)、needed_lcd0、needed_lcd1(需付金额)、mout__lcd0、mout_lcd1(退币金额)。


程序设计

主控模块完整程序
BCD译码模块完整程序
顶层模块完整程序
具体的代码见我的github网站(1自动售货机文档).

各模块连接

售货机主控系统和译码器模块图:
售货机主控系统和译码器模块图

售货机顶层模块:
顶层模块

波形仿真

主控模块的波形方真

这里写图片描述
上图表示顾客选择了pepsi饮料后,且投了2个一元的硬币。Success为高电平,代表售货机有饮料售出。且余额为0.

这里写图片描述
上图表示顾客选择了cola饮料后,且投2个一元的硬币。Success为高电平,代表有饮料售出,且找回顾客0.5元。

BCD译码仿真

这里写图片描述
上图表示自动售货机的译码系统,上图表示将8位数字转换成4位BCD码。

TOP文件的仿真

这里写图片描述
上图表示顾客选择了pepsi饮料后,且投了2个一元的硬币。Success为高电平,代表售货机有饮料售出。且余额为0。

总结

其实这个自动售货机控制系统老师很早之前就要我弄了,我自己一直拖,直到老师要考核才重视起来。
这个项目很多都是在网上找资料借鉴的别人的东西,自己就是把别人的代码读懂了,再将整个的流程走了一遍。收货还是很多的。自己为了第二天老师考核(答辩)的时候能够顺利通过,前一天晚上熬夜到三点。也算是体会到了做项目的艰辛。
在答辩的过程中,老师的一些问题,一些话语也是让我受益匪浅。做项目真的是让我收益很多。这里也希望这篇博客能给大家带来帮助,但是希望只是作为一个参考,更多的部分还是要自己去做,这才您才能真正学习到知识。

+