基于FPGA的自动售货机的课设说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1 引言 (1)
2 VHDL介绍 (2)
2.1 硬件描述语言VHDL (2)
2.2 VHDL语言的特点 (3)
3 QuartusII软件简介 (4)
3.1软件介绍 (4)
3.2界面介绍 (4)
3.2.1代码输入界面 (4)
3.2.2功能仿真界面 (5)
3.2.3波形仿真界面 (6)
4 自动售货机控制器设计与仿真 (7)
4.1硬件电路设计 (7)
4.2状态转换图 (7)
4.3时序仿真结果 (10)
5引脚锁定及下载 (12)
5.1引脚锁定 (12)
5.2下载 (12)
5.3结果分析 (12)
6设计总结 (14)
参考文献 (15)
附录 (16)
1 引言
VHDL的英文全名是VHSIC(Very High Speed Integrated Circuit)Hardware Descriptiong Language,诞生于1982年。
1987年底,VHDL被美国国防部确认为标准硬件描述语言。
自IEEE公布了VHDL的标准版本,IEEE-1076之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本。
现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。
有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。
VHDL的英文全写(Very-High-Speed Integrated Circuit HardwareDescription Language)翻译成中文就是超高速集成电路硬件描述语言。
因此它的应用主要是应用在数字电路的设计中。
目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。
当然在一些实力较为雄厚的单位,它也被用来设计ASIC。
随着EDA技术的高速发展,电子系统的设计技术和工具发生了深刻的变化,大规模可编程逻辑器件CPLD/FPGA的出现,给设计人员带来了诸多方便。
利用它进行产品开发,不仅成本低、周期短、可靠性高,而且具有完全的知识产权。
利用VHDL语言设计自动售货机,使其实现自动售货,找零钱等功能,突出了其作为硬件描述语言的良好的可读性、可移植性和易读性等优点。
此程序通过下载到特定芯片后,可应用于实际的自动售货机系统中。
本文基于FPGA开发系统,在QuartusII 7.2软件平台上,完成了自动售货机控制器的设计和与仿真,并下载到试验箱进行硬件实现。
首先,本文介绍了QuartusII 7.2软件的基本使用方法和VHDL硬件描述语言的特点,采用VHDL 硬件描述语言描述自动售货机控制器,完成对电路的功能仿真。
在设计过程中,重点探讨了自动售货机控制器的设计思路和功能模块划分。
然后,初步探讨了电路逻辑综合的原理,该软件对自动售货机控制器电路进行了逻辑综合。
最后,使用EDA实验开发系统进行电路的下载和验证。
验证结果表明设计的自动售货机控制器完成了预期的功能。
2 VHDL介绍
2.1 硬件描述语言VHDL
硬件描述语言(HDL)是一种用于设计硬件电子系统的计算机语言,它用软件编程的方式来描述电子系统的逻辑功能、电路结构和连接形式,与传统的门级描述方式相比,它更适合大规模系统的设计。
例如一个32位的加法器,利用图形输入软件需要输人500至1000个门,而利用VHDL语言只需要书写一行“A=B+C” 即可。
而且VHDL语言可读性强,易于修改和发现错误。
早期的硬件描述语言,如ABEL、HDL、AHDL,由不同的EDA厂商开发,互不兼容,而且不支持多层次设计,层次间翻译工作要由人工完成。
为了克服以上不足,1985年美国国防部正式推出了高速集成电路硬件描述语言VHDL,1987年IEEE采纳VHDL为硬件描述语言标准(IEEE-STD-1076)。
VHDL是一种全方位的硬件描述语言,包括系统行为级。
寄存器传输级和逻辑门多个设计层次,支持结构、数据流和行为三种描述形式的混合描述,因此VHDL 几乎覆盖了以往各种硬件俄语言的功能,整个自顶向下或由下向上的电路设计过程都可以用VHDL来完成。
VHDL还具有以下优点:
(1)VHDL的宽范围描述能力使它成为高层进设计的核心,将设计人员的工作重心提高到了系统功能的实现与调试,而花较少的精力于物理实现。
(2)VHDL可以用简洁明确的代码描述来进行复杂控制逻辑设计,灵活且方便,而且也便于设计结果的交流、保存和重用。
(3)VHDL的设计不依赖于特定的器件,方便了工艺的转换。
(4)VHDL是一个标准语言,为众多的EDA厂商支持,因此移植性好。
[6]
传统的硬件电路设计方法是采用自下而上的设计方法,即根据系统对硬件的要求,详细编制技术规格书,并画出系统控制流图;然后根据技术规格书和系统控制流图,对系统的功能进行细化,合理地划分功能模块,并画出系统的功能框图;接着就进行各功能模块的细化和电路设计;各功能模块电路设计、调试完成后,将各功能模块的硬件电路连接起来再进行系统的调试,最后完成整个系统的硬件设计。
采用传统方法设计数字系统,特别是当电路系统非常庞大时,设计者必须具备较好的设计经验,而且繁杂多样的原理图的阅读和修改也给设计者带来诸多的不便。
为了提高开发的效率,增加已有开发成果的可继承性以及缩短开发周期,各ASIC研制和生产厂家相继开发了具有自己特色的电路硬件描述语言(Hardware Description Language,简称HDL)。
但这些硬件描述语言差异很大,各自只能在自己的特定设计环境中使用,这给设计者之间的相互交流带来了极大的困难。
因此,开发一种强大的、标准化的硬件描述语言作为可相互交流的设计环境已势在必行。
于是,美国
于1981年提出了一种新的、标准化的HDL,称之为VHSIC(Very High Speed Integrated Circuit) Hardware Description Language,简称VHDL。
这是一种用形式化方法来描述数字电路和设计数字逻辑系统的语言。
设计者可以利用这种语言来描述自己的设计思想,然后利用电子设计自动化工具进行仿真,再自动综合到门电路,最后用PLD实现其功能。
2.2 VHDL语言的特点
具有良好的可读性,即容易被计算机接受,也容易被读者理解。
使用期长,不会因工艺变化而使描述过时。
因为VHDL的硬件描述与工艺无关,当工艺改变时,只需修改相应程序中的属性参数即可。
当电路系统采用VHDL语言设计其硬件时,与传统的电路设计方法相比较,具有如下的特点:
第一层次是行为描述。
所谓行为描述,实质上就是对整个系统的数学模型的描述。
一般来说,对系统进行行为描述的目的是试图在系统设计的初始阶段,通过对系统行为描述的仿真来发现设计中存在的问题。
在行为描述阶段,并不真正考虑其实际的操作和算法用何种方法来实现,而是考虑系统的结构及其工作的过程是否能到达系统设计的要求。
第二层次是RTL方式描述。
这一层次称为寄存器传输描述(又称数据流描述)。
如前所述,用行为方式描述的系统结构的程序,其抽象程度高,是很难直接映射到具体逻辑元件结构的。
要想得到硬件的具体实现,必须将行为方式描述的VHDL语言程序改写为RTL方式描述的VHDL语言程序。
也就是说,系统采用RTL方式描述,才能导出系统的逻辑表达式,才能进行逻辑综合。
第三层次是逻辑综合。
即利用逻辑综合工具,将RTL方式描述的程序转换成用基本逻辑元件表示的文件(门级网络表)。
此时,如果需要,可将逻辑综合的结果以逻辑原理图的方式输出。
此后可对综合的结果在门电路级上进行仿真,并检查其时序关系。
由自上而下的设计过程可知,从总体行为设计开始到最终的逻辑综合,每一步都要进行仿真检查,这样有利于尽早发现设计中存在的问题,从而可以大大缩短系统的设计周期。
由于目前众多制造PLD芯片的厂家,其工具软件均支持VHDL语言的编程。
所以利用VHDL语言设计数字系统时,可以根据硬件电路的设计需要,自行利用PLD设计自用的ASIC芯片,而无须受通用元器件的限制。
3 QuartusII软件简介
3.1软件介绍
Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD 设计流程。
Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA 工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
Maxplus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。
目前Altera已经停止了对Maxplus II 的更新支持,Quartus II 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。
Altera在Quartus II 中包含了许多诸如SignalTap II、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC 和HardCopy设计流程,并且继承了Maxplus II 友好的图形界面及简便的使用方法。
Altera Quartus II 作为一种可编程逻辑的设计环境, 由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。
3.2界面介绍
3.2.1代码输入界面
代码输入界面如图3.1所示:
图3.1 代码输入界面3.2.2功能仿真界面
功能仿真界面如图3.2所示:
图3.2 功能仿真界面
3.2.3波形仿真界面
波形仿真界面如图3.3所示:
图3.3 波形仿真界面
4 自动售货机控制器设计与仿真
4.1硬件电路设计
根据要求:自动售货机能出售1元、5元、10元三种商品。
出售哪种商品可由顾客按动相应的一个按键即可,并同时用数码管显示出此商品的价格;顾客投入硬(纸)币的钱数也是有1元、5元、10元三种,但每次只能投入其中的一种币,此操作通过按动相应的一个按键来模拟,并同时用数码管将投币额显示出来;顾客投币后,按一次确认键,如果投币额不足时则报警,报警时间3秒。
如果投币额足够时自动送出货物(送出的货物用相应不同的指示灯显示来模拟),同时多余的钱应找回,找回的钱数用数码管显示出来;顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,此时才允许顾客进行下一次购货操作;此售货机要设有一个由商家控制的整体复位控制;所以系统顶层框图设计如下图4.1所示:
图4.1 系统顶层框图
其中,sel1、sel5、sel10分别控制选择1元、5元、10元三种商品,put1、put5、put10分别是顾客投入硬(纸)币的钱数1元、5元、10元,sure是确认输入,rst 是由商家控制的整体复位控制输入;jing是警告输出,out1、out,out10分别是1元、5元、10元三种商品输出指示,digit用于显示顾客投币钱数和找零钱数。
4.2状态转换图
状态转换图如图4.2所示:
图4.2 状态转换图
共分为21个状态,S0为初始状态,当顾客选择1元、5元或10元三种商品时分别跳转至S1、S2、S3状态,否则停留在S0状态,选择货物的钱数在数码管上显示出来,程序代码如下所示:
when s0=>jing<='0';out1<='0';out5<='0';out10<='0';digit<=0;
if sel1='1' and sel5='0' and sel10='0' then
ns<=s1;
elsif sel1='0' and sel5='1' and sel10='0' then
ns<=s2;
elsif sel1='0' and sel5='0' and sel10='1' then
ns<=s3;
else
ns<=s0;
end if;
当顾客投币为1元、5元或10元时,若当前为S1状态,则分别跳转至S4、S5、S6三种状态,投币钱数显示在数码管上,否则停留在S1状态,程序如下所示:when s1=>digit<=1;
if put1='1' and put5='0' and put10='0' then
ns<=s4;
elsif put1='0' and put5='1' and put10='0' then
ns<=s5;
elsif put1='0' and put5='0' and put10='1' then
ns<=s6;
else
ns<=s1;
end if;
当顾客投币为1元、5元或10元时,若当前为S2状态,则分别跳转至S7、S8、S9三种状态,投币钱数显示在数码管上,否则停留在S2状态,程序如下所示:when s2=>digit<=5;
if put1='1' and put5='0' and put10='0' then
ns<=s7;
elsif put1='0' and put5='1' and put10='0' then
ns<=s8;
elsif put1='0' and put5='0' and put10='1' then
ns<=s9;
else
ns<=s2;
end if;
当顾客投币为1元、5元或10元时,若当前为S3状态,则分别跳转至S10、S11、S12三种状态,投币钱数显示在数码管上,否则停留在S3状态,程序如下所示:
when s3=>digit<=10;
if put1='1' and put5='0' and put10='0' then
ns<=s10;
elsif put1='0' and put5='1' and put10='0' then
ns<=s11;
elsif put1='0' and put5='0' and put10='1' then
ns<=s12;
else
ns<=s3;
end if;
当按下确认键时,则按状态转移图跳到相应的下一个状态,否则停留在当前状态,执行售货、找钱、警告、3秒后复位等功能。
4.3时序仿真结果
当所选货物钱数与投币钱数相等时波形仿真结果图如图4.3所示:
图4.3 投币正好波形仿真图
由波形仿真结果可以看到:当按下选择5元货物时,digit输出为5,当投币为5元时,digit输出为5,当按下确认后digit输出为0,并且显示5元商品输出,三个上升沿即3秒后复位,所有输出为0;
当所选货物钱数比投币钱数多时波形仿真结果图如图4.4所示:
图4.4 投币不足波形仿真图
由波形仿真结果可以看到:当按下选择5元货物时,digit输出为5,当投币为
1元时,digit输出为1,当按下确认后digit输出为1,即找回1元并且无商品输出,警告经过3个上升沿即3秒后复位,所有输出为0。
当所选货物钱数比投币钱数少时波形仿真结果图如图4.5所示:
图4.5 投币富余波形仿真图
由波形仿真结果可以看到:当按下选择5元货物时,digit输出为5,当投币为10元时,digit输出为10,当按下确认后digit输出为5,即找回5元并且商品输出,经过3个上升沿即3秒后复位,所有输出为0。
5引脚锁定及下载
5.1引脚锁定
选择Assignments菜单下的Pins命令,引脚锁定图如图5.1所示:
图5.1 引脚锁定图
如果是下载到实验箱上则需连续按“模式选择”按钮选择模式5,再按“系统复位”按钮。
进行引脚锁定,查阅附表,分别点“location”选择引脚号。
引脚锁定后再编译。
如同此前进行过的。
编译成功后点确定。
5.2下载
选择Tools菜单下的Programmer命令,然后在Program/Configure下打上钩选中,点“start”按钮开始下载,“Progress”进度条显示下载进度。
下载完后就可以在实验箱上查看并验证结果。
5.3结果分析
通过上面的步骤将程序代码下载到实验箱的FPGA芯片中,并验证了在仿真中的结果的正确性。
自动售货机能出售1元、5元、10元三种商品。
出售哪种商品可由顾客按动相应的一个按键即可,并同时用数码管显示出此商品的价格;顾客投入硬(纸)币的钱数也是有1元、5元、10元三种,但每次只能投入其中的一种币,此操作通过按动相应的一个按键来模拟,并同时用数码管将投币额显示出来;顾客投币后,按一次确认键,如果投币额不足时则报警,报警时间3秒。
如果投币额足够时自动送出货物(送出的货物用相应不同的指示灯显示来模拟),同时多余的钱
应找回,找回的钱数用数码管显示出来;顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,此时才允许顾客进行下一次购货操作;此售货机设有一个由商家控制的整体复位控制,当整体复位信号有效时,所有输出均为零。
6设计总结
一周的课设过去的太快了,自动售货机控制器的设计已按计划如期全部完成,能按预期的效果进行自动售货,找零,复位,警告等功能,并设计数码管显示所选商品价格、投币数目和应当找回顾客的钱数。
课设时先按要求画出状态转换图,然后再根据状态转换图及要求逐一设计。
最后再将它们组合成完整的自动售货机控制器。
课设过程中遇到一个主要问题是,延时三秒如何实现。
这个问题让我两天晚上没有睡好,经自己的多次分析和程序调试,最后在和同学在骑车的路上的讨论中共同解决了这个问题,并得出结论:即便是百分之九十九的正确性都是不正确的,必须确保百分之百的正确率,还有一个人的力量往往是不如人多智慧多!
在这次课设中使我更加熟悉了对这门课程的了解并且加深了同学间合作的默契,总之,这次课程设计很愉快!
最后,非常感谢郭老师和戴老师对我们认真细心的教导和耐心的指导,谢谢老师们的关心。
参考文献
[1].V oknei A.Pedroni.VHDL数字电路设计教程.电子工业出版社,2008.5
[2].潘松,黄继业.EDA技术实用教程(第二版).科学出版社,2005.2
[3].焦素敏.EDA应用技术.清华大学出版社,2002.4
[4].张昌凡等.可编程逻辑器件及VHDL设计技术[M].广州:华南理工大学出版社,2001
[5].曾繁泰,陈美金.VHDL程序设计[M].北京:清华大学出版社,2001
附录
library ieee;--库声明
use ieee.std_logic_1164.all;
entity guo is
port(sel1,sel5,sel10,put1,put5,put10,sure,clk,rst:in std_logic;
jing,out1,out5,out10:out std_logic;
digit:out integer range 0 to 15);
end guo;--实体
architecture bhv of guo is
type state is(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,
s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21);--结构体,定义21个状态signal ps,ns:state;
signal a,b:std_logic;--声明a,b两个信号,用于延时
begin
process(clk,rst)
variable temp:integer range 0 to 3;
begin
if rst='1'then
ps<=s0;--当复位信号有效时,s0赋给现态
elsif clk'event and clk='1' then
ps<=ns;--当上升沿到来时,次态赋值给现态
if(a='1')then
temp:=temp+1;
if(temp=3)then
b<='1';
else
b<='0';
end if;
else
temp:=0;
end if;
end if;--延时程序
end process;
process(sel1,sel5,sel10,put1,put5,put10,sure,b,ps)
begin
if((ps=s0)or(ps=s1)or(ps=s2)or(ps=s3)or(ps=s4)or(ps=s5)or(ps=s6)or(ps=s7)or(ps=s8)or( ps=s9)or(ps=s10)or(ps=s11)or(ps=s12))then
a<='0';
else
a<='1';
end if;--对控制延时信号a赋值
case ps is
when s0=>jing<='0';out1<='0';out5<='0';out10<='0';digit<=0;--状态及状态转换情况if sel1='1' and sel5='0' and sel10='0' then
ns<=s1;
elsif sel1='0' and sel5='1' and sel10='0' then
ns<=s2;
elsif sel1='0' and sel5='0' and sel10='1' then
ns<=s3;
else
ns<=s0;
end if;
when s1=>digit<=1;
if put1='1' and put5='0' and put10='0' then
ns<=s4;
elsif put1='0' and put5='1' and put10='0' then
ns<=s5;
elsif put1='0' and put5='0' and put10='1' then
ns<=s6;
else
ns<=s1;
end if;
when s4=>digit<=1;
if sure='1' then
ns<=s13;
else
ns<=s4;
end if;
when s5=>digit<=5;
if sure='1' then
ns<=s14;
else
ns<=s5;
end if;
when s6=>digit<=10;
if sure='1' then
ns<=s15;
else
ns<=s6;
end if;
when s2=>digit<=5;
if put1='1' and put5='0' and put10='0' then ns<=s7;
elsif put1='0' and put5='1' and put10='0' then ns<=s8;
elsif put1='0' and put5='0' and put10='1' then ns<=s9;
else
ns<=s2;
end if;
when s7=>digit<=1;
if sure='1' then
ns<=s16;
else
ns<=s7;
end if;
when s8=>digit<=5;
if sure='1' then
ns<=s17;
else
ns<=s8;
end if;
when s9=>digit<=10;
if sure='1' then
ns<=s18;
else
ns<=s9;
end if;
when s3=>digit<=10;
if put1='1' and put5='0' and put10='0' then ns<=s10;
elsif put1='0' and put5='1' and put10='0' then ns<=s11;
elsif put1='0' and put5='0' and put10='1' then ns<=s12;
else
ns<=s3;
end if;
when s10=>digit<=1;
if sure='1' then
ns<=s19;
else
ns<=s10;
end if;
when s11=>digit<=5;
if sure='1' then
ns<=s20;
else
ns<=s11;
end if;
when s12=>digit<=10;
if sure='1' then
ns<=s21;
else
ns<=s12;
end if;
when s13=>out1<='1';out5<='0';out10<='0';jing<='0';digit<=0; if b='1' then
ns<=s0;--延时控制
else
ns<=s13;
end if;
when s14=>out1<='1';out5<='0';out10<='0';jing<='0';digit<=4; if b='1' then
ns<=s0;
else
ns<=s14;
end if;
when s15=>out1<='1';out5<='0';out10<='0';jing<='0';digit<=9; if b='1' then
ns<=s0;
else
ns<=s15;
end if;
when s16=>out1<='0';out5<='0';out10<='0';jing<='1';digit<=1; if b='1' then
ns<=s0;
else
ns<=s16;
end if;
when s17=>out1<='0';out5<='1';out10<='0';jing<='0';digit<=0; if b='1' then
ns<=s0;
else
ns<=s17;
end if;
when s18=>out1<='0';out5<='1';out10<='0';jing<='0';digit<=5; if b='1' then
ns<=s0;
else
ns<=s18;
end if;
when s19=>out1<='0';out5<='0';out10<='0';jing<='1';digit<=1;
if b='1' then
ns<=s0;
else
ns<=s19;
end if;
when s20=>out1<='0';out5<='0';out10<='0';jing<='1';digit<=5;
if b='1' then
ns<=s0;
else
ns<=s20;
end if;
when s21=>out1<='0';out5<='0';out10<='1';jing<='0';digit<=0;
if b='1' then
ns<=s0;
else
ns<=s21;
end if;
end case;
end process;
end bhv;。