目录
前言
本次数电的课程设计是设计一款基于FPGA的自动售货控制系统,因为手上暂时没有FPGA的板子,所以先采用proteus仿真进行设计,观察系统效果,等之后FPGA板子下发,再移到quartus上调试和下载。同样是自己第一次自主设计电路系统,可能在功能上不完整或者逻辑上有错误,大家多多包涵,欢迎沟通交流。
一、设计要求与指标
本课设设计的是自动售货机控制系统,此系统有以下几方面的功能:
- 系统启动后要初始化,商家够投放商品和设置价格;
- 顾客能够选择自己所需的商品并点击确认;
- 顾客能够完成所选商品的支付付款;
- 自动售货机系统能够根据顾客的支付面额进行找零和商品的掉落,以及低于商品价格时,退还顾客的支付面额;
- 在找零支付和退还结束后以及顾客在30秒内未完成商品的付款,自动返回商品选择界面,重新选择商品;
- 系统自检报错。
二、原理总框图和设计思路说明
1、原理总框图
2、设计思路说明
整个系统分为六部分,分别是:系统初始化、顾客选择商品、顾客支付、找零和退还判别、倒计时以及系统自检部分。
1)系统初始化部分:在商家权限开启时,能够设置商品价格和投放商品,设置完成后,商家能够锁定,使商品编号以及对应的价格无法发生变动,完成系统的初始化设置。
器件选型:此部分采用7475集成D锁存器、74161二进制同步加法计数器、74247共阳数码管显示译码器、74138三线-八线译码器、74151 8选1数据选择器以及或非门、与非门构成。
2)顾客选择商品部分:在系统初始化完成后,顾客可以选择自己想要的商品,并从存储模块中调出相关编号的商品价格并显示出来,点击确定后,购买该编号的商品,进而进入支付模块并且此时商品的价格无法发生变动。
器件选型:此部分采用7475集成D锁存器、74247共阳数码管显示译码器构成。
3)顾客支付部分:在顾客选择完想要的商品后,进行投币并且显示相应的投币金额,在完成支付后,触发支付成功,此时投币金额被锁定无法改变。
器件选型:此部分采用7475集成D锁存器、74247共阳数码管显示译码器和非门构成。
4)找零和退还判别部分:在顾客支付完成时,自动进入找零和退还判别部分,把投币的金额信息和商品的价格信息输入到此模块中,先通过比较器进行比较,判别投币金额和商品价格的大小,当投币金额大于等于商家价格时,自动显示找零的金额信息,反之,则不显示找零信息,LED灯亮起,自动退还顾客的付款金额,在上述完成后自动进入倒计时模块。
器件选型:此部分采用7485数据比较器、74283超前进位加法器、74247共阳数码管显示译码器和若干与门、或门、非门构成。
5)倒计时部分:在顾客选择完商品确认后,进入30秒的倒计时,顾客需在30秒内完成对选择商品的支付,未支付成功,则返回商品选择界面重新选择商品;在找零和退还阶段结束时,自动进入10秒倒计时,10秒后自动返回商品选择界面重新选择商品。
器件选型:此部分采用74192异步可预置计数器、74247共阳数码管显示译码器、分频器以及若干个逻辑门电路构成。
6)系统自检部分:本系统的工作流程是在系统初始化后,顾客可以选择商品并且确认,进行商品支付,未在30秒内完成支付的,自动进入商品选择界面重新选择商品;支付成功后,自动找零或者退还结束时,触发10秒倒计时,10秒结束后自动返回商品选择界面重新选择商品。当系统运行出错时,系统自动报警,此时管理员(商家)检查系统错误。
器件选型:此部分采用与门、与非门、或门、或非门和非门构成。
三、各部分模块的设计与实现
1、选择模块的设计与实现
模块实现电路:
模块封装:
模块仿真结果:
说明:
选择模块主要设置三个按键,按键上接有上拉电阻,当未按下时,输出为高电平,按下后电平拉低,输出为低电平。按键一设置商品的价格(spjg),按键二选择商品的编号(spbh),按键三设置投币面额(tbme),当按键按下时,输入为低电平,7475采用输出口的反相高电平,而74161 cp端是上升沿触发,按键按下后74161上升沿触发开始计数,商品价格和投币面额采用74161的十进制8421BCD码计数,商品编号选择采用八进制8421BCD码计数,商品编号选择按键控制着数码管显示和74138选择商品的编号。从模块仿真结果来看,选择模块能够正常实现商品价格、商品编号和投币面额的选择和设置。把选择模块进行封装成一个模块,命名为initopt1。
2、存储模块的设计与实现
模块实现电路:
模块封装:
说明:
存储模块主要采用8块7475和4块74151进行设计,能存储8款商品的价格和编号信息。此模块设置了管理员权限,当管理员权限为低电平时,商家开始设置价格和投放商品,此刻二输入或非门处于全0为1状态,每个存储单元能够存储对应的商品价格和对应的编号信息,当选中设置下一个商品的信息时,上一个商品被锁定,无法修改上一个商品的信息,当设置完全部的商品信息后,管理员权限锁定为高电平,存储模块被锁定,无法修改商品信息,这样商品的信息就被记忆下来,而4块74151是用来输出的是每个商品的二进制价格。把存储模块进行封装成一个模块,命名为initopt2。
3、顾客选择商品确定模块的设计与实现
模块实现电路:
模块封装:
模块仿真结果:
说明:
顾客选择确定模块,顾客可以选择自己想要的商品,此时顾客每按下一个商品的编号,74247就会驱动数码管显示一种商品编号的价格,当顾客选择好后,按下确定键,此时商品价格锁定,不再变动,进入支付模块,并且向找零和退还判别模块输送二进制商品价格数据,同时C5、C6向倒计时模块输送确定(高电平)信息。从模块仿真结果来看,顾客选择确定模块能够正确显示数码管、控制等信息,并且在锁定商品价格后,不管如何选择商品编号,改变商品价格,此模块锁定的价格依旧没变化,一直保持在锁定状态。把顾客选择确定模块进行封装成一个模块,命名为zxoksys1。
4、投币模块的设计与实现
模块实现电路:
模块封装:
模块仿真结果:
说明:
投币模块在顾客选择好商品确认后工作,在顾客投币时7475锁存器开启,74247能够实时显示顾客的投币金额,当顾客付款成功时(确定),7475锁存器锁定,付款金额无法变动,并把付款信息传输给找零和退还判别模块进行比较。从模块仿真结果来看,投币模块能够正常显示投入的金额信息,并且在支付成功时,能够锁定付款金额信息,再次调整付款金额,投币模块显示信息无法改变。把支付模块进行封装成一个模块,命名为tbsys1。
5、找零和退还判别模块的设计与实现
模块实现电路:
模块封装:
模块仿真结果:
说明:
找零和退还判别模块在顾客支付完成时,自动触发C3为高电平,使投入金额和商品价格输入到模块中,进入投入金额和商品价格的判别阶段,此阶段采用7485比较器,比较两者数据的大小,找零采用的是74283加法器构成的减法电路,当投入金额大于等于商品价格时,减法电路工作,输出找零的金额,反之,因为减法电路输出的负数是混乱的,所以采用LED灯输出高电平(亮起)和熄灭找零显示的反馈形式,退还顾客投入金额,在正常有找零的情况下,LED灯为低电平(熄灭),在完成判别后输出一个结束信号和自动触发C3为高电平一起输入到倒计时模块中。从模块仿真结果来看,找零和退还判别模块能够正常反馈找零和退还信息,并且反馈结束信号。把找零和退还判别模块进行封装成一个模块,命名为zlandthsys1。
6、倒计时模块的设计与实现
模块实现电路:
模块封装:
说明:
1)触发30秒倒计时逻辑部分
倒计时模块通过分频器,将FPGA板子中的50MHz的时钟信号分频成1Hz的时钟信号输入到触发30秒倒计时逻辑部分中,此部分逻辑真值表如下:A为1Hz的时钟信号、B为30秒倒计时74192级联十位的(BO)’端,C(C1)为支付确定是否按下(1-按下;0-未按下)结果的反相值。
C | B | A | Y | Y' |
---|---|---|---|---|
0 | 0 | 0 | 0 | 1 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 0 |
商品确认按键按下前,30秒倒计时模块一直锁定在“29”的界面,未启动,(BO)’端保持在高电平状态。商品确认按键按下后,倒计时30秒的(LD)’端输入高电平,倒计时启动,当支付确定键未按下时(低电平),倒计时30秒一直走,当倒计时走到“00”时,(BO)’端输出低电平,此时无论时钟信号如何变化,输出Y一直保持在低电平状态,倒计时不再走动,且Y的状态输入到自动返回逻辑部分中,开始再一次重新选择商品;当支付确定按下时(高电平),30秒倒计时停止,(BO)’端一直保持在高电平状态,C1输出低电平,使投币模块的金额界面锁定,无论1Hz的时钟信号如何变化,输出Y一直输出低电平。
2)触发10秒倒计时逻辑部分
触发10秒倒计时逻辑部分中,此部分逻辑真值表如下:B(over1)为支付确定是否按下(1-按下;0-未按下)、A(over2)为找零和判别模块的输出结果。
B | A | Y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 1 |
1 | 1 | 1 |
当支付确定按键按下后,无论此部分处在找零或者退还状态,Y都输出为高电平,触发十秒倒计时开始,反之,则锁定在倒计时开始时“9”的状态。
3)自动返回逻辑部分
自动返回逻辑部分中,此部分逻辑真值表如下:A为10秒倒计时的(BO)’端、B为30秒倒计时74192级联十位的(BO)’端、C(C5)为商品选择确定键是否按下、D(C2)为支付确定键是否按下(1-按下;0-未按下)。
D | C | B | A | Y |
---|---|---|---|---|
0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 1 | X |
0 | 0 | 1 | 0 | X |
0 | 0 | 1 | 1 | X |
0 | 1 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | X |
0 | 1 | 1 | 0 | 1 |
0 | 1 | 1 | 1 | X |
1 | 0 | 0 | 0 | X |
1 | 0 | 0 | 1 | X |
1 | 0 | 1 | 0 | X |
1 | 0 | 1 | 1 | X |
1 | 1 | 0 | 0 | 0 |
1 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 0 |
1 | 1 | 1 | 1 | 1 |
在系统的运作中,应满足以下其中工作状态:0000、0100、0110、1100、1101、1110、1111,其中0000、0110、1101和1111四种状态为系统自动返回重新选择商品的状态,而0100、1100和1110是选择的商品信息锁定状态。当未能满足以上七种状态视为系统报错,报错输出信息为X(这里当X=0),此时模块向系统自检模块传输系统报错信息,由系统自检模块进行解读和报警,反之,则系统继续运作。
7、系统自检模块的设计与实现
模块实现电路:
模块封装:
模块仿真结果:
说明:
系统自检模块是对系统的错误工作状态进行报错,提醒商家系统出错。根据上述系统状态中,0001、0010、0011、0101、0111、1000、1001、1010和1011皆为系统出错状态,当系统出现异常后,此模块对错误信息进行解读,并作出报警提醒,反之,则忽略系统正常的信息。
四、总电路图、调试实现、作品图片展示和说明
1、总电路图
Initopt1是选择模块,initopt2是存储模块,zxoksys1是顾客选择商品确定模块,tbsys1是投币模块,zlandthsys1是找零和退还判别模块,djssys1是倒计时模块以及xtzjsys1是系统自检模块。
2、调试实现
图中A数码管显示商品的价格,B数码管显示商品编号,C数码管显示投币面额,DE数码管显示30秒倒计时,F显示找零;A开关是管理员权限,B开关是商品确定,C开关是支付确定;A灯是退还提示,B灯是系统报错提示,C灯是结束提示灯;A按键是设置商品价格,B按键是选择商品的编号,C按键是投币。
系统上电启动界面如上图,按键AB和数码管AB是系统初始化商家设置和显示商品信息,设置完成后,拨动开关A,管理员权限锁定,顾客可以开始选择通过按键B选择商品商品,选择完毕后,拨动开关B进行确定,这时数码管DE开始启动30秒倒计时,在30秒内通过按键C完成支付并且拨动开关C进行确定,数码管C显示投币价格,这时数码管F就会显示找零,当投币面额小于商品价格时灯A亮,反之则熄灭,结束后灯C亮起,进入重新选择,开关BC拨动到低电平,当系统异常时,灯B亮起,反之熄灭。
3、作品图片展示
1)系统初始化商家设置商品信息界面
2)商家设置完商品信息后,管理员权限锁定界面
3)顾客选择商品后确认,30秒倒计时开始界面
4)顾客支付确定后显示的找零界面
5)系统异常时的报错提示界面
五、列举自己遇到的问题和如何解决的
在选择模块的设计时,考虑到要输入商品信息和投币金额,需要用到拨码开关进行拨码输入,但考虑到FPGA板子上的拨码开关数量没有这么多,就改用按键计数器的方式,输入商品和投币金额信息;
在找零部分的设计时,由于没有专门的减法器芯片,所以考虑了很久,在翻阅书籍和笔记后发现加法器可以通过特定的电路变成减法器,从而进行运算,输出找零金额;
在退还金额舍设计和倒计时10秒设计时,因为数码数量不够,不能显示数据,因此采用亮灯的方式进行倒计时结束和退还金额的提示;
在设计倒计时模块中的自动返回部分时,发现逻辑电路有明显的漏洞,就是在系统正常的几个状态下,也存在系统异常的状态,考虑了一下,解决方案,就是在设计一个系统自检模块,当系统出现异常状态下,能够进行异常提示,从而避免系统异常的状态。
评论记录:
回复评论: