EDA实验报告自动售货机.docx
- 文档编号:30248143
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:12
- 大小:354.71KB
EDA实验报告自动售货机.docx
《EDA实验报告自动售货机.docx》由会员分享,可在线阅读,更多相关《EDA实验报告自动售货机.docx(12页珍藏版)》请在冰豆网上搜索。
EDA实验报告自动售货机
自动售货机的设计
一.实验内容:
本自动售货机系统,结合EDA技术,采用ALTERA公司可编程逻辑器件(CPLD)EPM7128SLC84-15芯片作为控制核心,再配以必要的外围电路从而实现只销售两种饮料,售价均为15元,可以找零和退币等功能的EDA应用系统。
芯片的设计是以MAX_PLUSII作为开发平台,VHDL语言作为开发语言,使用掌宇公司CIC_310CPLD/FPGA数字开发系统完成软件测试。
自己制作下载板与外围电路。
二.实验分析:
本自动售货机只销售两种罐装饮料。
售价均为15元。
顾客可以由两个不同投币孔分别投入3个5元硬币或2个10元硬币。
一次交易只能买一罐,且自动找零。
只要按下取消键就会马上无条件退币。
本设计的硬件电路用2个按键电路代替2个投币孔,以LED点亮的数量显示各币种的投入数量,在以4Hz闪烁的LED来显示退币种类与数量。
因为投币是计次电路,应先经过抖动消除电路处理。
本设计采用1000Hz的系统时钟信号来控制所有买卖行为。
系统中设计的复位键为管理人员所用,并未在用户界面中设计。
三.系统设计流程图:
四.自动售货机外观图:
(为指示灯)
五.电路原理图
六.PCB图:
根据PROTEL99画的系统原理图,成生PCB图。
然后进行布局与布线。
注意:
布线时将晶振这种易产生噪声的器件的输出端与芯片时钟输入端的连线尽量布为直线;将电源与地线的宽度定为30mil到100mil之间。
本系统的电流不是很大,所以不用将板子的两面分别布成电源与地。
七.系统实物图:
八.软件系统框图
九.源程序:
1.产生系统频率和退币信号电路
首先要根据硬件电路的晶振频率确定分频系数,先产生系统频率,在进一步分频产生退币信号。
由于掌宇公司的开发系统上的晶振频率为20MHz,所以要分频系数分别为20000(COUNT)和250(COUNT1)。
(注:
由于在自制的下载板上使用了1MHz的有源晶振,所以把程序中的COUNT的范围改为0到1000即可。
详见下面括号内部分)
return_clock:
block--input:
resetandclk,output:
return_clk
signalcount:
integerrange1to20000;(1to1000)
signalcount1:
integerrange1to250;---000;
signalf1hz:
std_logic;
begin
process(clk)
begin
ifrising_edge(clk)then
count<=count+1;
ifcount<=10000then(count<=500)
f1hz<='0';
elsif(count>10000andcount<=20000)then(count>500andcount<=1000)
f1hz<='1';
else
f1hz<='0';
count<=0;
endif;
endif;
endprocess;
process(f1hz)
begin
ifrising_edge(f1hz)then
count1<=count1+1;
ifcount1<=125then
return_clk<='0';
elsif(count1>125andcount1<=250)then
return_clk<='1';
else
return_clk<='0';
count1<=0;
endif;
endif;
endprocess;
endblockreturn_clock;
2.投入10或5元硬币处理电路
先对按键信号进行去抖动处理。
然后在投币信号到来时,先计算投币总量与总面值。
再对投币总量进行显示。
程序中用CASE语句将投币数量进行显示。
此处以10元硬币处理电路为例。
coin_10_counting:
block--input:
clk,reset,coin_10,output:
led_ten,total_amount_10
signalcoin10:
std_logic;--clearedcoin_10signal
signalno_coin_ten:
integerrange0to2;
begin
u1:
debounce
portmap(clk=>clk,touch=>coin_10,push_out=>coin10);
process(reset,coin10)
begin
ifreset='1'thentotal_amount_ten<=0;
no_coin_ten<=0;
led_ten<="00";
elsifrising_edge(coin10)then
total_amount_ten<=total_amount_ten+10;
no_coin_ten<=no_coin_ten+1;
endif;
caseno_coin_tenis
when0=>led_ten<="00";
when1=>led_ten<="01";
when2=>led_ten<="11";
endcase;
endprocess;
endblockcoin_10_counting;
3.退币处理电路
此模块先要判断局部信号total_amount是否为15,若大于等于15则输出全局信号money_ok。
在出货信号为1时,程序才开始判断应该退出何种硬币与数量。
如果按了取消键,必须立即执行退币处理。
此程序在投币后,但未按下确认键时,而是按下取消键,也可以实现退出何种货币与种数的精确显示。
另外,在按下确认键后,找零的硬币已经退出后,再按取消键,则又把原来投入的硬币退出。
导致退出的硬币比投入的还要多。
为了避免此情况发生,通过增加IF语句来把此中情况排除。
此处的不足是无法对退货进行管理。
coin_returned:
block--input:
clk,reset,total_amount_ten,total_amount_five,return_clk,cancel,cola_out,diet_out
--output:
money_ok,led_five_return,led_ten_return,cola_choice,diet_choice
signaltotal_amount:
integerrange0to35;
begin
process(reset,clk)
begin
ifreset='1'thentotal_amount<=0;
money_ok<='0';
led_five_return<=(others=>'0');
led_ten_return<=(others=>'0');
elsifrising_edge(clk)then
total_amount<=total_amount_ten+total_amount_five;
iftotal_amount>=15thenmoney_ok<='1';
elsemoney_ok<='0';
endif;
if(cancel='1')then
ifno_coin_five=3then
led_five_return
(2)<=return_clk;
led_five_return
(1)<=return_clk;
led_five_return(0)<=return_clk;
elsifno_coin_five=2then
led_five_return
(1)<=return_clk;
led_five_return(0)<=return_clk;
elsifno_coin_five=1then
led_five_return(0)<=return_clk;
endif;
ifno_coin_ten=2then
led_ten_return
(1)<=return_clk;
led_ten_return(0)<=return_clk;
elsifno_coin_ten=1then
led_ten_return(0)<=return_clk;
endif;
elsif(diet_out='1'orcola_out='1')then
casetotal_amountis
when0=>null;
when5=>led_five_return
(2)<=return_clk;
when10=>led_ten_return
(1)<=return_clk;
when15=>null;
when20=>led_five_return
(2)<=return_clk;
when25=>led_ten_return(0)<=return_clk;
when30=>led_five_return
(1)<=return_clk;
led_ten_return
(1)<=return_clk;
whenothers=>led_ten_return(0)<=return_clk;
led_ten_return
(1)<=return_clk;
endcase;
elsif((diet_out='1'orcola_out='1')andcancel='1')then
casetotal_amountis
when20=>led_five_return(0)<=return_clk;
led_ten_return(0)<=return_clk;
when25=>led_ten_return
(1)<=return_clk;
led_ten_return(0)<=return_clk;
when30=>led_ten_return
(1)<=return_clk;
led_ten_return(0)<=return_clk;
led_five_return(0)<=return_clk;
whenothers=>null;
endcase;
endif;
endif;
endprocess;
endblockcoin_returned;
4.出货并计算存货处理电路
当money_ok,ok,饮料选择都同时为1时,才进行出货处理。
先假定两种存货量分别为20。
当发生出货时进行递减计数处理。
为了节省硬件资源与功耗,此系统并未采用数码管实时的显示存货量。
而且初始货存由软件设定。
为了使系统更加的人性化。
所以在货存不足2时加以显示,以提醒顾客作出其他选择。
所编程序为:
give_check:
block--input:
money_ok,ok,cola_choice,diet_choice,reset
--output:
cola_out,diet_out,led_cola_out,led_diet_out,led_cola_ok,led_diet
signalno_cola:
integerrange0to20;
signalno_diet:
integerrange0to20;
begin
cola_out<='1'when(money_ok='1'andok='1'andcola_choice='1')
else'0';
led_cola_out<=cola_out;
diet_out<='1'when(money_ok='1'andok='1'anddiet_choice='1')
else'0';
led_diet_out<=diet_out;
cola:
process(reset,cola_out)
begin
ifreset='1'thenno_cola<=2;--colastoreamount
led_cola_ok<='1';
elsifrising_edge(cola_out)thenno_cola<=no_cola-1;
elsenull;
endif;
ifno_cola=0thenled_cola_ok<='0';
elsifno_cola=1thenled_cola_ok<=return_clk;
elseled_cola_ok<='1';
endif;
endprocesscola;
diet:
process(reset,diet_out)
begin
ifreset='1'thenno_diet<=20;--dietstoreamount
led_diet_ok<='1';
elsifrising_edge(diet_out)thenno_diet<=no_diet-1;
elsenull;
endif;
ifno_diet=0thenled_diet_ok<='0';
elsifno_diet=1thenled_diet_ok<=return_clk;
elseled_diet_ok<='1';
endif;
endprocessdiet;
endblockgive_check;
(完整程序在软盘上)
十.仿真管脚分配图:
十一.结束语
通过软件的设计调试,硬件电路的制作。
最后软硬相结合,制作出了自动售货机系统的核心电路。
它不仅完成了设计之初的基本要求,而且还增加了精确退币,存货报警,以及接受退货服务等功能。
但是,由于受到学习时间和芯片逻辑单元的限制,在退货和复位上面还有待完善,还无法达到成为产品的要求。
这次实验使我对EDA技术有了更加深刻的理解。
对电路板的设计和制作,及对Protel99的使用也更加熟练。
通过对设计中遇到困难的排除,我学到了很多书本上学不到的知识,也知道自己还有很大差距。
自己要多学习,更要勇于实践,争取有更大的进步。
这次实验是在老师的耐心指导下完成的。
她们在授课中,对我们所遇到的问题都做了耐心细致的讲解,并提出许多宝贵的建议,使我们受益匪浅。
在此,感谢老师的关心指导。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 实验 报告 自动 售货