北邮数字电路实验自动售货机Word格式文档下载.docx
- 文档编号:4530831
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:56
- 大小:2.08MB
北邮数字电路实验自动售货机Word格式文档下载.docx
《北邮数字电路实验自动售货机Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《北邮数字电路实验自动售货机Word格式文档下载.docx(56页珍藏版)》请在冰点文库上搜索。
(b)总体框图
图1、总体设计框图
如图:
1:
Disp5disp4(数码管组1)投入的钱数,上限99
2:
Disp1disp0(数码管组2)退回的钱数,上限99
3:
Btn2btn1btn0(按钮)钱数十元五元一元
4:
Btn5btn4btn3(按钮)甲(3元)乙(8元)丙(12元)三种商品
5:
蜂鸣器
6:
发光二极管
7:
Btn7(按钮)退出
8:
点阵图案
(c)模块划分(简化,未标蜂鸣器,二极管)
如上图所示,主要分为分频模块,控制模块,点阵显示模块和数码显示模块。
1)分频模块:
输入50Mhz信号后分别分为clk_10(10hz),clk_50k(50khz)。
其中,clk_10用来控制电路基本运算,clk_50k用于点阵及数码管的刷新显示。
2)控制模块:
控制其他各个模块,使功能能得到实现。
3)点阵显示模块:
对应相应的用户操作显示相应点阵动画。
4)数码管显示模块:
对输入结果译码后在数码管上进行显示。
(d)控制流程图(简化,未标蜂鸣器、二极管)
(e)状态转移图
钱不足
退出
钱足够
Out_A2_L:
出货品,动画2
Add_A1_S:
投入钱,动画1
Back_A3:
退钱,动画3
Exit:
2、原始基本思路的补充或改进
(a)为实现提高要求,加上提取货物这一模块,这样就会多一个状态,系统变为5个状态。
此时显示货物数目也需要数码管,因而用disp3、disp2来显示数目。
这样原本显示商品种类的数码管会被占用,此时考虑将这两个数码管的显示数值设成4项循环显示。
(b)同时循环显示甲乙丙三种货物数目需要加一个循环模块。
(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:
剩余退回的钱数(disp1与0的显示)。
money:
售货机中已投入钱数(disp5与4显示)。
goodtype:
购买商品的种类。
状态:
s1:
表示投币成功。
s2:
表示购买成功。
s3:
表示退钱。
s4:
表示退出。
s5:
表示缺货。
(a)运行开始,先进货。
为迎合中国大众的消费心理需求,设定的是价格3元、8元、12元的货物每次分别提货数量30、20、10。
第一次进货仿真如下,此时货源充足,s5=0。
注:
由于加了防抖电路,所以在后一个时钟上升沿到来时,货物数才增加。
具体语句如下页所示。
(b)按键进行投币和购买,每次投币,money数会相应增加(状态s1);
每次购买货物,若购买成功,则money减少、相应货物数减小、、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分频,模块程序中的三个clk与该仿真原理相同,代码写法也相同。
3、循环模块仿真。
如下图所示,此模块可实现三个状态的循环。
4、数码管显示模块仿真。
输入时钟。
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,此时对应状态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动画中的一个动画进行讨论。
(a)如下,当s无明确状态,t循环变化时可循环显示甲乙丙。
下图依次为两个甲、两个乙、两个丙。
形如下图
(b)下图为s1投钱时的动画。
四、功能说明
本实验最终完成了简易售货机的设计任务,成功下载并使用。
到目前为止,实验要求中的基本要求和提高要求都可实现。
可以进行随时投币和购买,在钱数不够或小于3时会退款。
但此时系统并未退出,此时若投钱可继续购买。
若按退出则系统会自动退钱并退出。
其中还有货物管理,包括提货、货物数量显示、缺货提示。
且各步操作都有相应的点阵动画显示和蜂鸣器鸣响。
验收时,未能考虑到的上限99元和没有剩余数码管显示用户所购买的的货物种类的问题也得到了解决。
这两项在波形分析里有具体说明。
五、原件清单及资源利用情况
1、使用元器件
芯片
EPM1270T144C5
数码管
6个
按键
7个
Led点阵
8*8个单元
1个
2、资源利用情况
(a)资源利用情况概述
如上图所示,总共利用的逻辑单元864个,资源利用率68%;
利用管教个数为39,占总数的34%。
(b)优化方法
本实验由于要实现的功能很多,所以在编程中进行优化显得尤为重要。
1)化简设计方案中的逻辑结构,保证使用最简单的逻辑方案来编程。
2)优化逻辑算法,保证使用最简单的算法来编程。
例如在对两位十进制数进行译码时,开始时用了冗长的if语句对其十位数为多少的情况进行了讨论,然后再确定个位数。
而简化后用两个语句就可以实现。
其中,(m/10)可确定十位数大小,(mmod10)可确定个位数大小。
这样,少用了92个逻辑单元。
3)用并行设计,将所用到的三个时钟在一个模块里进行分频。
4)对可以复用的单元进行复用,例如对if语句进行合并。
5)在不追求速度时可以在assignments中将optimizationtechnique选项选为area,即面积优先,在牺牲一定速度的情况下使用更少的面积。
六、故障及问题分析
1、对99的上限问题的理解错误
问题描述:
开始时认为上限的意思是数码管显示数值不再变化,但是可继续投币,此时系统的记忆是正确的,只不过显示是错误的,这样一来就可以增加购买的次数。
经过老师的指正后,才想到这样会让用户看不到钱数>
99后投入的真实钱数而给其造成困扰,使用户界面不友好。
解决办法:
将算法改成了如果即将投入的钱数会使投钱总值money>
99则不接受这次投币。
两次对比仿真对比如下。
图a.money达到96后又投入10元,系统接受钱数,money变为106。
图b.money达到96后又投入10元,系统不接受钱数,money保持96不变。
2、商品购买类型的显示
由于想实现提高要求中循环显示甲乙丙的数量,而这个显示会占用原本基本要求中显示商品类型的数码管。
而验收前时间紧迫,未能对程序进行大的修改,因而暂时放弃了实现基本功能中显示购买商品的类型这一功能。
之后又对程序进行了修改,即通过添加循环状态来实现这四项的成功显示。
修改后的代码如下所示,其中goodtype为“00”时,循环显示三种商品数量;
goodtype为“01”“10”“11”时分别对应三种货物类型。
3、钱数小于3系统退出导致无法再投币
在想实现功能随时输入货币时,发现当钱数小于3系统退钱退出时,无法再投币继续购买。
不再将退钱和退出两个状态绑定在一起,即退钱后系统不会退出。
若再投钱,当前money为三项(刚投入的钱数、原money、原change)相加,而change值在每次投钱时赋“0”。
这样仅通过状态转移和投币算法的细微修改就实现了这一功能。
4、分频方面的问题
关于分频,开始是进行了多次调试后决定将输入的50Mhz频率分成clk_10和clk_50k两个时钟频率,后来需要甲乙丙的剩余数量循环显示时,发现这两个分频都不合适。
再分频模块中增加了一个分频clk_1,使循环显示的图像每1s刷新一次,也便于人眼观察并捕捉显示的信息。
5、两位十进制计数
开始时,在实现显示两位十进制计数时遇到了瓶颈,不知道该如何更好地实现这一功能。
首先将译码和显示分开考虑,由于显示很容易实现,于是只考虑译码就可以了。
最先想用的译码方法为冗长的if语句,该算法实现个位的显示如下:
(......)
以上算法需要对10位进行分析才能得出个位数值。
这样3组两位十进制数的代码长度就非常凶残。
后来想到用mod函数简化,于是将个位的显示用mod函数进行了优化。
网上说mod函数在“IEEE.NUMERIC_STD.all”库中,后来发现不用这个库也可以调用。
6、防抖电路
本来觉得防抖电路不一定能用上,仿真时没有它也没出现什么问题,然后在调板子的时候充分体会到了它的不可或缺性。
由于再分一个模块的话,需要修改的部分比较多,容易出现错误。
于是直接在主程序中进行了语句的添加,在7个按键输入上直接加了防抖,将程序经过细微的修改就可达到预想结果。
六、总结和结论
本次实验使我们熟悉并掌握了数字系统设计的基本步骤,让我们在有相应功能需求时,能利用vhdl语言编写相应程序,用EDA技术下载到可编程逻辑器件上完成简单数字系统的设计和实现。
通过这次实验,我们能够更加自如地使用vhdl进行编程,将上学期学的简单电路的编程语言整合起来,实现一整个系统完整的功能。
实验中要有层次观念和模块观念。
这次实验加深了我们队系统层次的理解,也让我们感受到了分模块编程的优越性。
它使编程变得有针对性,也更简单,同时也使得程序的修改和调试变得更加便捷。
此外,分模块编程结束后,在进行系统整合时要有整体观念,既要考虑整体又要协调部分之间的联系。
可以说这次实验给了我们一个数字电路系统设计的方向,让我们能通过自学和努力朝着那个方向实现设计要求。
通过实验,我们扩充了更多之前没有教授的vhdl、数字电路设计等的相应知识。
编程是有趣的,有时又像是千丝万缕捉不到头绪而让人觉得焦躁。
因此遇到问题时一定要有耐心,多思考,将问题一步步分解细化,逐个击破。
可以说在实验过程中,兴趣会驱动我们,但是最后让我们走完整个过程取得最后成功的诸多因素中,一定会有耐心细致的实验精神。
感谢这次实验能给我们提供这样一个独立思考、自主学习的机会,同时也感谢老师在实验课中对我们的细心指导和严格要求,让我们能真正地从实验中积累经验、学到东西。
七、附录(源程序)
1、主程序模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitynewselleris
port(clk:
instd_logic;
--clk_10
a1,a2,a3:
instd_logic;
--inputmoney1,5or10yuan
b1,b2,b3:
--respectgood1(jia),good2(yi),good3(bing)
e:
--exit
insert:
--inputnewgoods
money:
outintegerrange0to99;
--theamountofmoneyinput
change:
--theamountofchange
goodstype:
outstd_logic_vector(1downto0);
c1,c2,c3:
--therestnumberofthegoods
s1,s2,s3,s4,s5:
outstd_logic);
--s1:
inputtingmoney;
s2:
buyinggoods
endnewseller;
--s3:
backmoney;
s4:
exit;
s5:
goodsarenotenough
architecturesellofnewselleris
signala1true,a2true,a3true,b1true,b2true,b3true,etrue,inserttrue:
std_logic;
signalcount:
integerrange0to9;
signalgoodstypetmp:
std_logic_vector(1downto0);
begin
p0:
process(a1,a2,a3,b1,b2,b3,e,insert,clk)
variabletmp11,tmp12,tmp13,tmp14,q11,q12:
variabletmp21,tmp22,tmp23,tmp24,q21,q22:
variabletmp31,tmp32,tmp33,tmp34,q31,q32:
variabletmp41,tmp42,tmp43,tmp44,q41,q42:
variabletmp51,tmp52,tmp53,tmp54,q51,q52:
variabletmp61,tmp62,tmp63,tmp64,q61,q62:
variabletmp71,tmp72,tmp73,tmp74,q71,q72:
variabletmp81,tmp82,tmp83,tmp84,q81,q82:
ifclk'
eventandclk='
1'
then--avoidshaking
tmp12:
=tmp11;
tmp11:
=a1;
q12:
=q11;
q11:
=(tmp11andtmp12);
a1true<
=q11andnot(q12);
tmp22:
=tmp21;
tmp21:
=a2;
q22:
=q21;
q21:
=(tmp21andtmp22);
a2true<
=q21andnot(q22);
tmp32:
=tmp31;
tmp31:
=a3;
q32:
=q31;
q31:
=(tmp31andtmp32);
a3true<
=q31andnot(q32);
tmp42:
=tmp41;
tmp41:
=b1;
q42:
=q41;
q41:
=(tmp41andtmp42);
b1true<
=q41andnot(q42);
tmp52:
=tmp51;
tmp51:
=b2;
q52:
=q51;
q51:
=(tmp51andtmp52);
b2true<
=q51andnot(q52);
tmp62:
=tmp61;
tmp61:
=b3;
q62:
=q61;
q61:
=(tmp61andtmp62);
b3true<
=q61andnot(q62);
tmp72:
=tmp71;
tmp71:
=e;
q72:
=q71;
q71:
=(tmp71andtmp72);
etrue<
=q71andnot(q72);
tmp82:
=tmp81;
tmp81:
=insert;
q82:
=q81;
q81:
=(tmp81andtmp82);
inserttrue<
=q81andnot(q82);
endif;
endprocessp0;
p1:
process(a1true,a2true,a3true,b1true,b2true,b3true,etrue,inserttrue,clk)
variablem,n,x,y,z:
integerrange0to99;
if(clk'
)then
----
ifcount=9thengoodstypetmp<
="
00"
;
count<
=0;
--whichgoodtypehasbeenchose
else
if(goodstypetmp="
01"
orgoodstypetmp="
10"
11"
)thencount<
=count+1;
elsegoodstypetmp<
endif;
----------------------------------------------------------------------------------
if(inserttrue='
)then--inputnewgoods
x:
=x+30;
y:
=y+20;
z:
=z+10;
s5<
='
0'
goodstype<
--goodsareenough
elsex:
=x;
=y;
=z;
ifetrue='
thens4<
--notexit
if(a1true='
)thenm:
=m+1+n;
n:
s1<
--input1yuan
elsif(a2true='
=m+5+n;
--input5yuan
elsif(a3true='
=m+10+n;
--input10yuan
-----------------------------------------------------------------------------------
elsif(b1true='
)thengoodstypetmp<
--buyingb1
if(x=0)thens5<
--goodsarenotenough
elses5<
if(m>
5)thenm:
=m-3;
x:
=x-1;
s2<
--succeed
elsif(m>
2)thenm:
=m;
m:
s3<
--money<
3,backmoney
elsen:
--notsucceed,backmoney
elsif(b2true='
--buyingb2
if(y=0)thens5<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字电路 实验 自动 售货