北邮数字电路实验自动售货机.doc
《北邮数字电路实验自动售货机.doc》由会员分享,可在线阅读,更多相关《北邮数字电路实验自动售货机.doc(44页珍藏版)》请在沃文网上搜索。
1、数字电路与逻辑设计实验简易自动售货机 学院: 电子工程学院 班号: 学号: 姓名: 班内序号: 辅导老师: 时间:一、设计课题的任务要求1、 实验目的 1)进一步熟练掌握VHDL语言和Quartus软件的使用; 2) 理解状态机的工作原理和设计方法;2、实验内容设计一个简易的自动售货机,能够完成钱数处理、找零、显示、退币等功能。3、基本要求 1)用 2 个数码管(disp5,disp4)显示钱数,以元为单位。用3 个按键(btn0,btn1,btn2)分别表示一元、五元、十元,每按一次按键,增加一次相应的钱数,上限99元。 2)再用 3 个按键(btn3,btn4,btn5)分别对应3 种商品
2、,其中,商品甲售价3 元、商品乙售价8 元、商品丙售价12 元; 3)买东西时,先输入钱币,再按对应的商品键。每按一次商品键,钱数要相应地减少,同时有声光(蜂鸣器或发光二极管)提示购买成功。剩余钱数大于3 元可继续按商品键再次购买;当剩余钱数少于3 元时,表示钱数的数码管disp5,disp4 显示为零,同时用数码管disp0 显示退出的钱数。 4)买东西时,按下商品键,若输入的钱数少于商品的价格,表示钱数的数码管 disp5,disp4 显示为零,同时用数码管(disp1、disp0)显示退出的钱数,并用蜂鸣器或发光二极管闪烁表示购买失败。 5)按下商品键时,用数码管disp2 表示当前购买
3、的商品,1 代表商品甲,2 代表商品乙,3 代表商品丙。 6)用 btn7 做为退出功能键,退出键可以随时按下,按下后,数码管(disp5,disp4)显示为零,同时数码管(disp1、disp0)显示退出的钱数,表示结束购买,钱款全部退出。4、提高要求: 1)用点阵设计显示投币动画、出货动画,购买成功/失败动画; 2)允许随时输入钱币,购买时,钱款不足有声光报警并等待追加钱币或选择别的商品; 3)商品数量管理,有缺货提示; 4)用点阵动态显示商品名称和库存数量等。 5)自拟其它功能。二、设计思路及原理框图1、原始设计思路及框图(a)实验设计思路用户可投入三种面值的钱,选择相应商品进行购买,若
4、钱数足够,二极管亮,商品调出;若钱数不够,蜂鸣器响,商品不会调动,此时可继续投币,直到钱数够了商品才会调出,期间若钱数小于等于3元,系统会退回钱币,一次购买结束。若任何一阶段用户点击退出,系统也会退回钱币,一次购买结束。具体思路简述:投入钱(动画1),计数,按键购买。1、钱不够(动画1),蜂鸣器,可继续投钱 2、钱够(动画2),二极管发光,减数值。每次减数值进行计算,3时,维持原状态。按7退出,显示退钱数(动画4),其他显示为0,结束。(b)总体框图12347568 图1、总体设计框图如图:1:Disp5 disp4 (数码管组1) 投入的钱数,上限99 2:Disp1 disp0 (数码管组
5、2) 退回的钱数,上限99 3: Btn2 btn1 btn0 (按钮)钱数 十元 五元 一元 4:Btn5 btn4 btn3 (按钮)甲(3元)乙(8元)丙(12元)三种商品 5:蜂鸣器 6:发光二极管 7:Btn7 (按钮)退出 8:点阵图案(c)模块划分(简化,未标蜂鸣器,二极管)如上图所示,主要分为分频模块,控制模块,点阵显示模块和数码显示模块。1)分频模块:输入50Mhz信号后分别分为clk_10(10hz),clk_50k(50khz)。其中,clk_10用来控制电路基本运算,clk_50k用于点阵及数码管的刷新显示。2)控制模块:控制其他各个模块,使功能能得到实现。3)点阵显示
6、模块:对应相应的用户操作显示相应点阵动画。4)数码管显示模块:对输入结果译码后在数码管上进行显示。(d)控制流程图(简化,未标蜂鸣器、二极管) (e)状态转移图钱不足退出退出退出钱足够钱不足Out_A2_L:出货品,动画2Add_A1_S:投入钱,动画1Back_A3:退钱,动画3Exit:退出2、原始基本思路的补充或改进(a)为实现提高要求,加上提取货物这一模块,这样就会多一个状态,系统变为5个状态。此时显示货物数目也需要数码管,因而用disp3、disp2来显示数目。这样原本显示商品种类的数码管会被占用,此时考虑将这两个数码管的显示数值设成4项循环显示。(b)同时循环显示甲乙丙三种货物数目
7、需要加一个循环模块。(c)为了使购买过程操作错误或其他情况导致退钱后,用户可以继续购买,设定按btn7才完全退出。即第一次错误或退出会到退钱的状态,再按一次btn7才是完全退出。一次错误或退钱后再加入货币还可继续与原货币累加并继续购买。最后所得各个模块连接图如下三、仿真波形及波形分析1、售货机主程序模块仿真分析说明:clk:时钟(上升沿有效)。e:退出。insert:进货。 a1:投入1元。a2:投入5元。a3:投入10元。 b1:购买甲(3元)。b2:购买乙(8元)。b3:购买丙(12元)。 c1,c2,c3分别表示甲、乙、丙三种商品剩余数量。(disp3与2显示) change:剩余退回的
8、钱数(disp1与0的显示)。 money:售货机中已投入钱数(disp5与4显示)。 goodtype:购买商品的种类。状态:s1:表示投币成功。 s2:表示购买成功。 s3:表示退钱。 s4:表示退出。 s5:表示缺货。 (a)运行开始,先进货。为迎合中国大众的消费心理需求,设定的是价格3元、8元、12元的货物每次分别提货数量30、20、10。第一次进货仿真如下,此时货源充足,s5=0。注:由于加了防抖电路,所以在后一个时钟上升沿到来时,货物数才增加。具体语句如下页所示。(b)按键进行投币和购买,每次投币,money数会相应增加(状态s1);每次购买货物,若购买成功,则money减少、相应
9、货物数减小、goodtype显示商品种类,状态为s2。当选择商品价格大于投入钱币时,系统退钱,money变为0,change变为原money数,状态变为s3。(c)最大限额为99的限定。当投入钱数会大于99时,系统不接受该投币。(d)剩余钱数小于3时,系统退钱,money为0,change为原来money值。s2成功的同时到s3。(e)退出后系统退钱,需要退钱后再加钱还可以购买的仿真。(f)缺货提示,货物为0时,购买不成功,状态s5显示缺货。2、分频模块仿真。 说明:该模块中实际分出了三个时钟clk_1,clk_10,clk_50k。为了仿真的便捷性,此处只仿真一个简单5分频,模块程序中的三个
10、clk与该仿真原理相同,代码写法也相同。3、循环模块仿真。如下图所示,此模块可实现三个状态的循环。4、数码管显示模块仿真。说明:clk:输入时钟。 m,n分别为:money和change。 c1、c2、c3分别为甲乙丙的数量。 cat控制六个数码管哪个亮(低电平有效)。 X:正在亮的数码管显示的数值。 Goodtype:商品类型。4个状态,00时分别显示甲乙丙商品数;01、10、11时分别代表购买的是甲或乙或丙。 t:4个循环状态,00,01,10分别控制显示甲乙丙的数量。11无显示。(a)goodtype为00时,受t的控制循环显示甲乙丙的商品数。如下图所示,x显示的48,95为16,此时对
11、应状态t3,表示其显示c3的商品数。(b)如下图所示,当goodtype循环变化,对应数码管显示商品种类121-3,109-2,48-1。(c)下面x显示的为16、32、00,16、32、00,.即m,n,c1的值。此时goodtype为00,t为00(对应c1)。5、点阵显示模块仿真。说明:clk_1、clk_2:输入时钟。 s1、s2、s3、s4、s5:分别对应投币动画,出货动画,钱数不足动画,成功退出动画和缺货提示动画。 Col:动画或图像的点阵显示。 Row:控制哪一排的点阵可以亮。 t:循环状态。00:显示甲,01:显示乙,10:显示丙。此处对循环显示的甲乙丙和5动画中的一个动画进行
12、讨论。(a)如下,当s无明确状态,t循环变化时可循环显示甲乙丙。下图依次为两个甲、两个乙、两个丙。形如下图 (b)下图为s1投钱时的动画。四、功能说明 本实验最终完成了简易售货机的设计任务,成功下载并使用。 到目前为止,实验要求中的基本要求和提高要求都可实现。可以进行随时投币和购买,在钱数不够或小于3时会退款。但此时系统并未退出,此时若投钱可继续购买。若按退出则系统会自动退钱并退出。其中还有货物管理,包括提货、货物数量显示、缺货提示。且各步操作都有相应的点阵动画显示和蜂鸣器鸣响。 验收时,未能考虑到的上限99元和没有剩余数码管显示用户所购买的的货物种类的问题也得到了解决。这两项在波形分析里有具
13、体说明。五、原件清单及资源利用情况1、使用元器件芯片EPM1270T144C5数码管6个按键7个Led点阵8*8个单元蜂鸣器1个2、资源利用情况(a)资源利用情况概述 如上图所示,总共利用的逻辑单元864个,资源利用率68%;利用管教个数为39,占总数的34%。(b)优化方法 本实验由于要实现的功能很多,所以在编程中进行优化显得尤为重要。 1)化简设计方案中的逻辑结构,保证使用最简单的逻辑方案来编程。 2)优化逻辑算法,保证使用最简单的算法来编程。例如在对两位十进制数进行译码时,开始时用了冗长的if语句对其十位数为多少的情况进行了讨论,然后再确定个位数。而简化后用两个语句就可以实现。其中,(m
14、/10)可确定十位数大小,(m mod 10)可确定个位数大小。这样,少用了92个逻辑单元。 3)用并行设计,将所用到的三个时钟在一个模块里进行分频。 4)对可以复用的单元进行复用,例如对if语句进行合并。 5)在不追求速度时可以在assignments中将optimization technique选项选为area,即面积优先,在牺牲一定速度的情况下使用更少的面积。六、故障及问题分析 1、对99的上限问题的理解错误问题描述:开始时认为上限的意思是数码管显示数值不再变化,但是可继续投币,此时系统的记忆是正确的,只不过显示是错误的,这样一来就可以增加购买的次数。经过老师的指正后,才想到这样会让用
15、户看不到钱数99后投入的真实钱数而给其造成困扰,使用户界面不友好。解决办法:将算法改成了如果即将投入的钱数会使投钱总值money99则不接受这次投币。两次对比仿真对比如下。图a.money达到96后又投入10元,系统接受钱数,money变为106。图b.money达到96后又投入10元,系统不接受钱数,money保持96不变。2、商品购买类型的显示问题描述:由于想实现提高要求中循环显示甲乙丙的数量,而这个显示会占用原本基本要求中显示商品类型的数码管。而验收前时间紧迫,未能对程序进行大的修改,因而暂时放弃了实现基本功能中显示购买商品的类型这一功能。解决办法:之后又对程序进行了修改,即通过添加循环
16、状态来实现这四项的成功显示。修改后的代码如下所示,其中goodtype为“00”时,循环显示三种商品数量;goodtype为“01”“10”“11”时分别对应三种货物类型。3、钱数小于3系统退出导致无法再投币问题描述:在想实现功能随时输入货币时,发现当钱数小于3系统退钱退出时,无法再投币继续购买。解决办法:不再将退钱和退出两个状态绑定在一起,即退钱后系统不会退出。若再投钱,当前money为三项(刚投入的钱数、原money、原change)相加,而change值在每次投钱时赋“0”。这样仅通过状态转移和投币算法的细微修改就实现了这一功能。4、分频方面的问题问题描述:关于分频,开始是进行了多次调试
17、后决定将输入的50Mhz频率分成clk_10和clk_50k两个时钟频率,后来需要甲乙丙的剩余数量循环显示时,发现这两个分频都不合适。解决办法:再分频模块中增加了一个分频clk_1,使循环显示的图像每1s刷新一次,也便于人眼观察并捕捉显示的信息。 5、两位十进制计数问题描述:开始时,在实现显示两位十进制计数时遇到了瓶颈,不知道该如何更好地实现这一功能。解决办法:首先将译码和显示分开考虑,由于显示很容易实现,于是只考虑译码就可以了。最先想用的译码方法为冗长的if语句,该算法实现个位的显示如下: (.) 以上算法需要对10位进行分析才能得出个位数值。这样3组两位十进制数的代码长度就非常凶残。后来想
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字电路 实验 自动 售货