北邮数字电路实验自动售货机.doc

上传人:风**** 文档编号:969771 上传时间:2024-03-19 格式:DOC 页数:44 大小:3.54MB
下载 相关 举报
北邮数字电路实验自动售货机.doc_第1页
第1页 / 共44页
北邮数字电路实验自动售货机.doc_第2页
第2页 / 共44页
北邮数字电路实验自动售货机.doc_第3页
第3页 / 共44页
北邮数字电路实验自动售货机.doc_第4页
第4页 / 共44页
北邮数字电路实验自动售货机.doc_第5页
第5页 / 共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组两位十进制数的代码长度就非常凶残。后来想

18、到用mod函数简化,于是将个位的显示用mod函数进行了优化。网上说mod函数在“IEEE.NUMERIC_STD.all”库中,后来发现不用这个库也可以调用。6、防抖电路问题描述:本来觉得防抖电路不一定能用上,仿真时没有它也没出现什么问题,然 后在调板子的时候充分体会到了它的不可或缺性。解决办法:由于再分一个模块的话,需要修改的部分比较多,容易出现错误。于是直接在主程序中进行了语句的添加,在7个按键输入上直接加了防抖,将程序经过细微的修改就可达到预想结果。六、总结和结论 本次实验使我们熟悉并掌握了数字系统设计的基本步骤,让我们在有相应功能需求时,能利用vhdl语言编写相应程序,用EDA技术下载

19、到可编程逻辑器件上完成简单数字系统的设计和实现。 通过这次实验,我们能够更加自如地使用vhdl进行编程,将上学期学的简单电路的编程语言整合起来,实现一整个系统完整的功能。实验中要有层次观念和模块观念。这次实验加深了我们队系统层次的理解,也让我们感受到了分模块编程的优越性。它使编程变得有针对性,也更简单,同时也使得程序的修改和调试变得更加便捷。此外,分模块编程结束后,在进行系统整合时要有整体观念,既要考虑整体又要协调部分之间的联系。 可以说这次实验给了我们一个数字电路系统设计的方向,让我们能通过自学和努力朝着那个方向实现设计要求。通过实验,我们扩充了更多之前没有教授的vhdl、数字电路设计等的相

20、应知识。编程是有趣的,有时又像是千丝万缕捉不到头绪而让人觉得焦躁。因此遇到问题时一定要有耐心,多思考,将问题一步步分解细化,逐个击破。可以说在实验过程中,兴趣会驱动我们,但是最后让我们走完整个过程取得最后成功的诸多因素中,一定会有耐心细致的实验精神。 感谢这次实验能给我们提供这样一个独立思考、自主学习的机会,同时也感谢老师在实验课中对我们的细心指导和严格要求,让我们能真正地从实验中积累经验、学到东西。七、附录(源程序)1、主程序模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ne

21、wseller isport(clk: in std_logic; -clk_10 a1,a2,a3:in std_logic; -input money 1,5 or 10yuan b1,b2,b3:in std_logic; -respect good1(jia),good2(yi),good3(bing) e:in std_logic; -exit insert:in std_logic; -input new goods money:out integer range 0 to 99; -the amount of money input change:out integer rang

22、e 0 to 99; -the amount of change goodstype:out std_logic_vector(1 downto 0); c1,c2,c3:out integer range 0 to 99; -the rest number of the goods s1,s2,s3,s4,s5:out std_logic); -s1:inputting money;s2:buying goodsend newseller; -s3:back money;s4:exit;s5:goods are not enough architecture sell of newselle

23、r issignal a1true,a2true,a3true,b1true,b2true,b3true,etrue,inserttrue:std_logic;signal count:integer range 0 to 9;signal goodstypetmp:std_logic_vector(1 downto 0);beginp0:process(a1,a2,a3,b1,b2,b3,e,insert,clk)variable tmp11,tmp12,tmp13,tmp14,q11,q12:std_logic;variable tmp21,tmp22,tmp23,tmp24,q21,q2

24、2:std_logic;variable tmp31,tmp32,tmp33,tmp34,q31,q32:std_logic;variable tmp41,tmp42,tmp43,tmp44,q41,q42:std_logic;variable tmp51,tmp52,tmp53,tmp54,q51,q52:std_logic;variable tmp61,tmp62,tmp63,tmp64,q61,q62:std_logic;variable tmp71,tmp72,tmp73,tmp74,q71,q72:std_logic;variable tmp81,tmp82,tmp83,tmp84,

25、q81,q82:std_logic;beginif clkevent and clk=1 then -avoid shaking tmp12:=tmp11;tmp11:=a1;q12:=q11;q11:=(tmp11 and tmp12); a1true=q11 and not(q12); tmp22:=tmp21;tmp21:=a2;q22:=q21;q21:=(tmp21 and tmp22); a2true=q21 and not(q22); tmp32:=tmp31;tmp31:=a3;q32:=q31;q31:=(tmp31 and tmp32); a3true=q31 and no

26、t(q32); tmp42:=tmp41;tmp41:=b1;q42:=q41;q41:=(tmp41 and tmp42); b1true=q41 and not(q42); tmp52:=tmp51;tmp51:=b2;q52:=q51;q51:=(tmp51 and tmp52); b2true=q51 and not(q52); tmp62:=tmp61;tmp61:=b3;q62:=q61;q61:=(tmp61 and tmp62); b3true=q61 and not(q62); tmp72:=tmp71;tmp71:=e;q72:=q71;q71:=(tmp71 and tm

27、p72); etrue=q71 and not(q72); tmp82:=tmp81;tmp81:=insert;q82:=q81;q81:=(tmp81 and tmp82); inserttrue=q81 and not(q82); end if;end process p0;p1:process(a1true,a2true,a3true,b1true,b2true,b3true,etrue,inserttrue,clk)variable m,n,x,y,z:integer range 0 to 99;beginif(clkevent and clk=1)then- if count=9

28、then goodstypetmp=00;count=0; -which goodtype has been chose else if (goodstypetmp=01 or goodstypetmp=10 or goodstypetmp=11)then count=count+1; else goodstypetmp=00; end if; end if; - if (inserttrue=1)then -input new goods x:=x+30;y:=y+20;z:=z+10;s5=0;goodstype=00; -goods are enough else x:=x;y:=y;z

29、:=z;goodstype=00; end if; if etrue=0 then s4=0; -not exit if(a1true=1)then m:=m+1+n;n:=0;s1=1; -input 1yuan elsif (a2true=1)then m:=m+5+n;n:=0;s1=1; -input 5yuan elsif (a3true=1)then m:=m+10+n;n:=0;s1=1; -input 10yuan - elsif (b1true=1)then goodstypetmp=01; -buying b1 if(x=0)then s5=1; -goods are no

30、t enough else s55)then m:=m-3;x:=x-1;s22)then m:=m-3;x:=x-1;s2=1;n:=m;m:=0;s3=1;-money3,back money else n:=m;m:=0;s2=0;s3=1; -not succeed,back money end if; end if; elsif (b2true=1)then goodstypetmp=10; -buying b2 if(y=0)then s5=1; -goods are not enough else s510)then m:=m-8;y:=y-1;s27)then m:=m-8;y

31、:=y-1;s2=1;n:=m;m:=0;s3=1; -money3,back money else n:=m;m:=0;s3=1; -not succeed,back money end if; end if; elsif (b3true=1)then goodstypetmp=11; -buying b3 if(z=0)then s5=1; -goods are not enough else s514)then m:=m-12;z:=z-1;s211)then m:=m-12;z:=z-1;s2=1;n:=m;m:=0;s3=1;-money3,back money else n:=m;

32、m:=0;s3=1; -not succeed,back money end if; end if; - else m:=m;n:=n;s1=0;s2=0;s3=0;s4=0;s5=0;-stay end if; - else n:=m;m:=0;s4=1;goodstypetmp=00; end if; money=m;change=n;c1=x;c2=y;c3=z;goodstype=goodstypetmp;end if;end process p1;end sell;-2、分频模块library ieee;use ieee.std_logic_1164.all;use ieee.std

33、_logic_unsigned.all;entity div isport(clk: in std_logic; -50Mhz clkout_50k:out std_logic; -50khz clkout_10: out std_logic; -10hz clkout_1: out std_logic); -1hzend div;architecture d1 of div issignal tmp0:integer range 0 to 999;signal tmp1:integer range 0 to 4999999;signal tmp2:integer range 0 to 499

34、99999;beginprocess(clk) begin if(clkevent and clk=1)then - if tmp0=999 then -clk_50k tmp0=0; else tmp0499 then clkout_50k=1; else clkout_50k=0; end if; - if tmp1=4999999 then -clk_10 tmp1=0; else tmp12499999 then clkout_10=1; else clkout_10=0; end if; - if tmp2=49999999 then -clk_1 tmp2=0; else tmp2

35、24999999 then clkout_1=1; else clkout_1t=00;statet=01;statet=10;state=d0;end case;end if;end process;end xunhuan;-4、数码管显示模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity shumaguan isport(clk: in std_logic; -clk m:in integer range 0 to 99; -inputted money n:in integer range 0 to 99; -change goodstype: in std_logic_vector(1 downto 0); c1,c2,c3:in integer range 0 to 99; -the rest number of good1,2,3 t:in std_logic_vector(1 downto 0); -recycling to display the a

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 教学课件 > 中学教案课件 > 初中(七年级)课件教案

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922