基于VHDL的自动售货机设计.docx
《基于VHDL的自动售货机设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL的自动售货机设计.docx(11页珍藏版)》请在冰点文库上搜索。
基于VHDL的自动售货机设计
北华大学
电子系统综合实习报告
学院:
电气信息工程学院
专业班级:
通信工程
姓名:
闫梦迪
学号:
指导老师:
董胜
实习时间:
—
1.实习题目……………………………………………………………P3
2.实习目的……………………………………………………………P3
3.实习技术要求………………………………………………………P3
4.实现过程……………………………………………………………P3
5.功能及代码…………………………………………………………P5
6.仿真及硬件测试……………………………………………………P9
7.实习心得…………………………………………………………P12
8.教师评语…………………………………………………………P14
一.实习题目
自动售货机设计
二.实习目的
通过本课题的研究,可以掌握电子控制系统的基本原理与其实现,通过对各个模块的编程及其仿真,对QuartusII软件的使用有所了解。
每个波形模块的VHDL实现加深了硬件描述语言的学习。
最终的顶层文件的调试,更是体现了综合知识的运用。
三.实习技术要求
本设计要实现自动售货机的基本功能,如货物信息存储、商品选择、进程控制、硬币处理、余额计算、显示等功能。
利用软件QuartusII平台,采用VHDL硬件描述语言编程的设计方法设计系统核心电路的硬件程序,与一般的软件开发不同,VHDL编程更需要熟悉一些底层的硬件知识,特别是数字逻辑电路的设计,因此VHDL编程的方法、思路都要更多的与硬件电路联系起来。
完成系统各个功能模块的硬件程序设计后,在软件平台上进行编译和电路仿真,最后生成的目标文件下载到实验台内的FPGA芯片以实现该系统,并在实验台上对设计进行验证。
四.实现过程
1)、根据设计要求实现过程分两部分:
a、面向客户端模块设计
基于Quartus2软件环境下,应用VHEDL语言进行程序设计。
以clk输入端口进行商品选择,coin1输入端口做钱数输入,Finish输入端口做确认,进而完成商品购买。
b、面向个体端模块设计
以Get端口进行对商品价格修改的确认,以ST端口进行选择要修改的商品种类,coin0作为单价输入端口。
2)、整体结构框图
3)、程序框图
(商品、价格设定模块)
(客户端模块程序框图)
五.功能及代码
功能:
顾客商品选择、付钱购买、找零,个体商户对商品种类及价格的修改,商品数量统计
代码:
libraryieee;
useS1is
port(clk:
instd_logic;--系统时钟
r,set,st,get,finish:
instd_logic;--设定、买、选择、完成信号
coin0,coin1:
instd_logic_vector(3downto0);--输入钱数
act0,act1:
outstd_logic_vector(3downto0);--显示、开关信号
y0,y1,y2,y3,y4:
outstd_logic_vector(6downto0));--输入钱数、商品价格、找零显示数据
endS1;
architecturebehavofS1is
signalitem0,item1:
std_logic_vector(1downto0);--商品种类
signalQ:
INTEGERRANGE20DOWNTO0;--找零
signalpri0,pri1,pri2,pri3:
std_logic_vector(3downto0);
signalquan0:
integer:
=9;
signalquan1:
integer:
=9;
signalquan2:
integer:
=9;
signalquan3:
integer:
=9;--数量
begin--设定部分
com0:
process(get,st,coin0)
variableC:
INTEGERRANGE20DOWNTO0;
begin
ifget='1'then
ifst'eventandst='1'thenitem0<=item0+1;--对商品进行shezhi
ifitem0="00"thenact0<="1000";pri0<=coin0;C:
=CONV_INTEGER(coin0);--shedingshi,自动售货机对4种商品的操作
elsifitem0="01"thenact0<="0100";pri1<=coin0;C:
=CONV_INTEGER(coin0);
elsifitem0="10"thenact0<="0010";pri2<=coin0;C:
=CONV_INTEGER(coin0);
elsifitem0="11"thenact0<="0001";pri3<=coin0;C:
=CONV_INTEGER(coin0);
endif;
endif;
elseact0<="0000";
endif;
ifr='1'C=0;
endif;
caseCis--设定价格
when0=>y3<="1000000";
when1=>y3<="1111001";
when2=>y3<="0100100";
when3=>y3<="0110000";
when4=>y3<="0011001";
when5=>y3<="0010010";
when6=>y3<="0000010";
when7=>y3<="1111000";
when8=>y3<="0000000";
when9=>y3<="0010000";
whenothers=>y3<="1111111";
endcase;
endprocesscom0;
com1:
process(coin1,clk,Q)--购买部分
variableA,B,D:
INTEGERRANGE20DOWNTO0;
begin
ifclk'eventandclk='1'thenitem1<=item1+1;--对商品进行循环选择
ifitem1="00"thenact1<="1000";B:
=CONV_INTEGER(pri0);--购买时,自动售货机对4种商品的操作
elsifitem1="01"thenact1<="0100";B:
=CONV_INTEGER(pri1);
elsifitem1="10"thenact1<="0010";B:
=CONV_INTEGER(pri2);
elsifitem1="11"thenact1<="0001";B:
=CONV_INTEGER(pri3);
endif;
endif;
A:
=CONV_INTEGER(coin1);
iffinish'eventandfinish='1'then
ifitem1="00"andcoin1>=pri0thenQ<=A-B;D:
=quan0-1;quan0<=quan0-1;
elsifitem1="01"andcoin1>=pri1thenQ<=A-B;D:
=quan1-1;quan1<=quan1-1;
elsifitem1="10"andcoin1>=pri2thenQ<=A-B;D:
=quan2-1;quan2<=quan2-1;
elsifitem1="11"andcoin1>=pri3thenQ<=A-B;D:
=quan3-1;quan3<=quan3-1;
elseQ<=A-B;
endif;
endif;
ifset='1'thenitem1<="00";act1<="0000";Q<=0;B:
=0;
endif;
casecoin1is--设定钱数
when"0000"=>y0<="1000000";
when"0001"=>y0<="1111001";
when"0010"=>y0<="0100100";
when"0011"=>y0<="0110000";
when"0100"=>y0<="0011001";
when"0101"=>y0<="0010010";
when"0110"=>y0<="0000010";
when"0111"=>y0<="1111000";
when"1000"=>y0<="0000000";
when"1001"=>y0<="0010000";
whenothers=>y0<="1111111";
endcase;
caseBis--单价钱数
when0=>y1<="1000000";
when1=>y1<="1111001";
when2=>y1<="0100100";
when3=>y1<="0110000";
when4=>y1<="0011001";
when5=>y1<="0010010";
when6=>y1<="0000010";
when7=>y1<="1111000";
when8=>y1<="0000000";
when9=>y1<="0010000";
whenothers=>y1<="1111111";
endcase;
caseQis--返还钱数
when0=>y2<="1000000";
when1=>y2<="1111001";
when2=>y2<="0100100";
when3=>y2<="0110000";
when4=>y2<="0011001";
when5=>y2<="0010010";
when6=>y2<="0000010";
when7=>y2<="1111000";
when8=>y2<="0000000";
when9=>y2<="0010000";
whenothers=>y2<="1111111";
endcase;
caseDis--剩余数量
when0=>y4<="1000000";
when1=>y4<="1111001";
when2=>y4<="0100100";
when3=>y4<="0110000";
when4=>y4<="0011001";
when5=>y4<="0010010";
when6=>y4<="0000010";
when7=>y4<="1111000";
when8=>y4<="0000000";
when9=>y4<="0010000";
whenothers=>y4<="1111111";
endcase;
endprocesscom1;
endbehav;
六.仿真及硬件测试
1)、引脚锁定
2)、RTL电路图
3)、时序仿真
4)、硬件测试
='1'设定内部价格
2.隐藏内部设定价格
3.输入8元单价3元找零5元显示剩余数量8个
7.实习心得
在这次实验中,通过老师的介绍和我们自己的学习,我们学会了VHDL程序的基本语法和操作,熟悉了程序的基本结构和设计,学会了quartus软件的操作和系统的功能仿真。
我们小组的组员进行了合理的分工和良好的沟通,这对程序的实验十分重要。
在这次的程序设计中,通过实验我们完成了程序,达到了学习的目的。
经过这次对自动售货机系统的设计,让我对EDA设计有了更一步的认识,同时也对EDA这门课程有了更深入的了解。
这次设计让我了解了关于自动售货机的原理与设计理念,要设计一个电路先进行软件模拟仿真再进行实际的硬件电路测试。
当然这个设计存在许多的不足,比如在预览商品时只能顺序浏览,而不能随机点击浏览,这也是为了排除程序的糅杂。
并且每次卖完一种商品都得复位,不能进行连续的购买,而且在购买时遇到的情况考虑不周到。
这次设计提高了我们的逻辑思维能力,使我们在程序的改写和运用上有了很大的进步。
加深了我们对VHDL硬件语言的认识,进一步增进了对一些常见器件的了解。
另外,我们还更加充分的认识到,EDA这门课程在科学发展中的至关重要性。
查阅参考书的独立思考的能力以及培养非常重要,我们在设计电路时,遇到很多不理解的东西,有的我们通过查阅参考书弄明白,有的通过网络查到,但由于时间和资料有限我们更多的还是独立思考。
相互讨论共同研究也是很重要的,经常出现一些问题,经过和同组同学讨论和资料的查询最终得到了解决。
锻炼了我们的团队合作精神及分工合作的能力。
在调试程序过程中遇到很多这样那样的问题,最后都解决了。
特此感谢老师和同学们对我的辛勤指导,能让我在困境中找到解决难题的办法,并且对EDA有了更深刻的认识。
8.教师评语
教师: