基于FPGA下的交通灯控制器毕业设计.docx
- 文档编号:5819604
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:31
- 大小:1.83MB
基于FPGA下的交通灯控制器毕业设计.docx
《基于FPGA下的交通灯控制器毕业设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA下的交通灯控制器毕业设计.docx(31页珍藏版)》请在冰豆网上搜索。
基于FPGA下的交通灯控制器毕业设计
基于FPGA下的交通灯控制器毕业设计
引言
第一章软件介绍
1.1QuartusⅡ介绍
本次毕业设计是基于FPGA下的设计,FPGA是现场可编程门阵列,FPGA开发工具种类很多、智能化高、功能非常的强大。
可编程QuartusⅡ是一个为逻辑器件编程提供编程环境的软件,它能够支持VHDL、VerilogHDL语言的设计。
在该软件环境下,设计者可以实现程序的编写、编译、仿真、图形设计、图形的仿真等许许多多的功能。
在做交通灯控制器设计时选择的编程语言是VHDL语言。
在这里简单的介绍一下QuartusⅡ的基本部分。
图1-1-1是一幅启动界面的图片。
在设计前需要对软件进行初步的了解,在图中已经明显的标出了每一部分的名称。
图1-1-1启动界面
开始设计前我们需要新建一个工程,首先要在启动界面上的菜单栏中找到File,单击它选择它下拉菜单中的“NewProjectWizard”时会出现图1-1-2所显示的对话框,把项目名称按照需要填好后单击Next,便会进入图1-1-3显示的界面。
图1-1-2创建工程框
图1-1-3芯片选择框
根据自己选择的实验设备选择好相应的芯片型号点击Next,进入下一个步骤当出现图1-1-5时,点击“Finish”后这个工程就建立好了。
图1-1-4仿真器选择框
图1-1-5对话框
建好工程后开始进行设计,首先在图1-1-6中单击file后选择new,接着会出现图1-1-7,在交通灯控制器的设计中我们选择的是VHDLFile,当出现图1-1-8时就可以把编辑的程序敲入编辑器中。
图1-1-6工程建好后的界面
图1-1-7新建文件类型选择框
图1-1-8程序编辑框
在第一章中对QuartusⅡ软件的使用做一个简单介绍,设计中的编译和仿真步骤在后面的几章中会做出介绍。
第二章交通灯控制器设计的概述
2.1控制器设计描述
2.1.1设计任务
要求设计交通灯控制器,分别在四个方向都安装红、黄、绿三种颜色的交通指示灯,红灯表示停止,绿灯表示通行,黄灯表示左转和直行将要禁止通行,四个方向分别还安装有倒计时的计时器。
2.1.2设计要求
东西方向和南北方向各有组指示灯,红灯亮的时间为20S,黄灯亮的时间为5S,绿灯亮的时间为25S。
三种灯亮灭的顺序为红灯、绿灯、黄灯。
第三章交通灯控制器的设计过程
3.1设计方案
本设计课题用FPGA来实现智能交通灯的设计,本设计现要研究的问题主要有:
智能交通灯的设计方案;各功能模块的设计与实现;如何用VHDL编写源程序以及进行系统仿真。
3.1.1框图设计
交通灯控制器设计的框图中包括控制器、分频器、显示器、指示灯、译码器、位选器。
当倒计时为零时,控制器改变交通灯的颜色,同时倒计时开始进入下一个倒计时。
当有紧急情况出现的时候,四面的交通灯都会变为红灯,紧急情况的处理在设计中是依靠HOLD键来实现的。
图3-1-1-1是交通灯设计的设计框图
图3-1-1-1交通灯设计的设计框图
系统的红、黄、绿灯显示的总时间为50s,具体的亮灯时间和亮灯顺序看表3-1-1-2
表3-1-1-2交通灯亮灯顺序与亮灯时间安排
东西方向
(A灯)
A绿灯亮
(20s)
A黄灯亮
(21—25s)
A红灯亮
(26—50s)
南北方向
(B灯)
B红灯亮
(0—25s)
B绿灯亮
(26—45s)
B黄灯亮
(46—50s)
3.1.2工程流程图
图3-1-2工程流程图
3.1.3时序图的假象
在时序图中,上升沿有效,即为“1”时灯亮,好比RedA为上升沿(“1”)时A方向的红灯是亮的,相对的GreenB也为上升沿(“1”)B方向上绿灯是亮的。
具体的时序显示见图3-2时序图。
图3-2时序图
3.2模块设计
3.2.1主控制器模块
在QuartusⅡ按照1-1中的方法新建一个工程并新建一个文件项目后,在图1-1-8程序编辑框中将主控制器的程序输入后保存。
接着需要对主控制器的程序进行编译,编译的步骤是点击Project→SetasTop将文件置顶,具体的参考图3-2-1-1置顶,接着点击图3-2-1-2的StartCompilation进行编译。
图3-2-1-1置顶
图3-2-1-2编译
在编译的过程中,出现了一些错误,在我编译主控制器的程序时,出现的错误是没有将CLOCK放入PROCESS()中,将程序中的错误一一改正后有时还会出现些Warning,有些Warning并不会影响后面的设计步骤。
将上面的错面都改正后,就会显示图3-2-1-3所显示的对话框。
下一步就是对程序进行时序仿真,
图3-2-1-3编译成功
程序编译无措后在当前的工程下面新建一个文件,点击File出现图3-2-1-4新建文件对话框,选择图中显示蓝色的选项就会出现我们想要的界面,把鼠标移在图3-2-1-5时序仿真编辑框中左边的空白处,然后点击右键,选择INSERT→INSERTNODEORBUS选项出现另一个对话框,选择对话框中的NODEFINDER后就会产生新的对话框,点击LIST是在左下角的空白处会出现很多的引脚,我们选中需要的引脚后确定后,我们需要的引脚就会出现在时序仿真编辑中左边的空白处,我们对输入信号进行设定,若想让输出信号显示为十六进制数,我们可以选中输出信号然后点击鼠标的右键选择VALUE→COUNTVALUE后出现的对话框中可以选择自己需要显示的进制类型和进制数的定时等。
对输出输入信号编辑完成后保存。
在菜单工具栏中选择PROCESSING→SIMULATOORTOOL,出现图3-2-1-6的对话框,按照对话框显示的进行设定,点击QENERATFUNCTIONAL…→START→REPORT,就会得出我们想要的图3-2-1-7主控制器时序仿真图。
图3-2-1-4新建文件对话框
图3-2-1-5仿真编辑框
图3-2-1-6仿真工具对话框
图3-2-1-7主控制器的仿真图
图3-2-1-7中显示的仿真结果和设计前预计的时序仿真图的结果是相符合的。
时序图中的HOLD是保持信号,当HOLD信号为有效信号(“1”)时,则四个方向的路灯都是红灯亮,当HOLD无效时,四个方向的信号灯会正常工作。
RESET信号有效时,计数器的显示就会重新从零开始。
图中四个方向的指示灯的亮灭顺序是正确的。
图3-2-1-8主控制器的模块
主控制器的时序仿真完成后,一个程序的设计、仿真就已经暂时结束了,下一步还要进行图形的设计,在总的图形设计前,需要先将每个程序都生成模块,为之后的设计做好准备。
点击File→Create\Updade→CreateSymbolFilesforCurrentFile,完成这个操作过程后便会生成主控制器的模块,具体的看图3-2-1-8主控制器的模块。
模块中主要有CLOCK、RESET、HOLD、NUMA、NUMB和六个指示灯的输出。
3.2.2分频器模块
设计中需要用到1秒钟的脉冲,分频这个模块就是为了改变频率脉冲波,使20Mhz的频率最终变为1hz的脉冲,这样就可以得到一个周期是1秒钟的脉冲,分频器的程序见附录。
具体的程序编译过程和仿真的过程和主控制模块中谈到的过程是相同的。
按照上面谈的步骤完成后就会得到图3-2-2-1分频模块的时序仿真图。
图3-2-2-1分频模块的仿真图
图3-2-2-2分频模块
分频的程序经过编译和时序仿真图后生成的模块是图3-2-2-2分频模块所显示的20mhz的脉冲通过第一模块时变为10hz,再经过第二个模块后变成1hz的脉冲。
3.2.3提取显示值模块
提取显示值的功能是在10hz的速度下提取显示值,得到的是显示时间值的十位和个位。
图3-2-3-1提取显示值的时序仿真图中NUMIN是主控制器的输出值,NUMA和NUMB两个输出端口是要显示的值的高位和低位。
高位的最大输出值是为二的四位二进制数,低位的最大输出值是为九的四位二进制数。
图3-2-3-2是提取显示值生成的模块。
提取显示值的程序见文章的附录。
图3-2-3-1提取显示值的仿真图
仿真图中,NUMB先从0开始计数,当计到9时NUMA计为1,NUMB重新从0开始计数,当计到9时NUMA会计为2,NUMB再次从0开始计数,当NUMA(高位)计数到2时,NUMB的最大值输出为5。
图3-2-3-2提取显示值的模块
3.2.4动态扫描模块
LED显示的工作原理是利用人类的视觉特性。
七段LED数字显示块是由“a、b、c、d、e、f、g、dp”这几段组成的,LED的显示原理就是要看这八段中的哪几段是亮的,那几段是灭的。
每段管子不是同时被点亮的并且点亮的时间都是极短的,又因为变化的时间很短暂,亮灭的过程中留下的余光会给人一种错觉,人的眼睛觉得是一组静态的显示灯。
具体的动态扫描的程序请看正文后的附录。
图3-2-4-1是动态扫描的时序仿真图,图3-2-4-2是动态扫描生成的模块。
图3-2-4-1动态扫描的时序仿真图
图3-2-4-2动态扫描的模块
3.2.5位选器模块
位选程序的输入和编译完成后,对程序进行仿真,仿真的步骤依然和上面谈到的一样,下面两幅图一张是位选程序的时序仿真图,另一幅是位选程序生成的模块。
见图3-2-5-1和图3-2-5-2。
图3-2-5-1位选时序仿真图
图3-2-5-2位选模块
3.2.6译码器模块
译码器是将要显示的数字转换成驱动七段数码管的信号,程序中的NUM与动态扫描模块相连,将四位二进制数转换为八位二进制数,再通过LED8输出。
译码器的程序编辑和编译步骤也和前面所说的相同。
当译码器编译成功后进行仿真,仿真的结果见图3-2-6-1译码器的时序仿真。
像时序仿真图中显示的一样,当NUM输入“0000”时LED8便会输出“00111111”显示数字“0”,当NUM输入“0001”时LED8输出“00000110”显示数字“1”。
图3-2-6-2是译码器程序生成的模块。
图3-2-6-1译码器的时序仿真图
图3-2-6-2译码器模块
3.3图形设计
3.3.1图形设计的生成
将每个程序都编译、仿真完成后,下一步就是要设计图形仿真,在进行图形的时序仿真前,要先进行图形的编辑和编译。
要建立一个新工程和图形编辑的文件的的过程是点击File→New→BlockDiagram/SchematicFile.(见图3-3-1-1)
图3-3-1-1新建一个文件的对话框
新建了一个文件以后,就要开始编辑图形了,要把每一个模块都找出来,选择Assignment→Settings后出现图3-3-1-2的对话框,在左边找到libraries,单击它以后会出现图3-3-1-2右边显示的内容,再点击
处可以找到之前生成的那些模块所在的文件夹,把它们一次性添加在libraries中,这样可以为后面图形设计做好准备,全部添加完成后点击“OK”,这样在元件库中就可以找到生成的那些模块了。
选择Edit→InsertSymbol后出现图3-3-1-3的对话框,在这里就可以显示出上面生成的模块和软件中原本存在的元器件,按照设计中的需要选出模块和元件。
图3-3-1-2libraries对话框
图3-3-1-3元件库对话框
图3-3-1-4编译对话框
图3-3-1-4中标明了每个快捷工具的用途,选择合适的工具把选择好的模块和元件连接起来。
然后将连接好的图形文件保存以后进行编译。
3.3.2仿真结果
图3-3-2-1图形设计的时序仿真图
图形设计编译完成以后按照程序的时序仿真的过程对图形设计进行时序仿真,给CLK适当的信号,并且要给输入值定义正确的值,开始仿真后会出现图3-3-2-1就是编译后的时序仿真图。
图形设计的时序仿真图中主要显示的是红、黄、绿灯之间的亮灭关系和LED8显示的数值变化过程,还有位选输出端的变化,时序图中可以很容易看出当计时数计数到某一个值的时候东西方向和南北方向是什么颜色的指示灯在工作。
当A路的绿灯亮时,B路的红灯亮,A路的绿灯亮20秒后,A路的黄灯亮5秒……由此可以很容易的看出指示灯的亮灭是正确的。
3.4管脚的锁定
管脚锁定是为了为硬件仿真做准备。
当所有的设计都完成后,接着要对图形设计进行管脚的锁定。
先确定设计时确定的器件类型和实际的硬件类型是不是一样,选择Assignments→Device,在出现的对话框中认真确定选择的器件是不是正确的。
接下来选择Assignments→Pins进入图3-4-1中,用鼠标双击Location就可以设定管脚了。
图3-4-2是在这次毕业设计中使用到的芯片ACEX1K-EP1K100QC208-3。
图3-4-3是完成编译、时序仿真、管脚锁定这些步骤后的图形设计。
图3-4-1管脚锁定对话框
图3-4-2芯片ACEX1K-EP1K100QC208-3
图3-4-3最终的图形设计
表3-4-1管脚和相应的功能
序号
名称
功能
管脚口
1
CLK
时钟信号
79
2
HOLD
保持键
7
3
RESET
复位键
8
4
RedA
A路口的红灯
11
5
GreenA
A路口的绿灯
13
6
YellowA
A路口的黄灯
15
7
RedB
B路口的红灯
12
8
GreenB
B路口的绿灯
14
9
YellowB
B路口的黄灯
16
10
LED8
LED数码管
24-31
11
SI
位选
36-39
在这次毕业设计中,我们用的芯片是ACEX1K-EP1K100QC208-3,图3-4-3就是设计所用的芯片,褐色小点是设计中锁定的管脚。
而表3-4-1是锁定的管脚和相应的功能。
结论
经过了两个多月的努力,毕业设计终于完成了。
这次的毕业设计是在大学期间完全没有接触过的知识,在两个月的时间里我已经对FPGA有了一定的认识,又学到了新的知识。
刚开始做这个课题时,我从知网和图书馆找了很多的资料,在对这些资料整理的过程中开始一点点的熟悉FPGA和VHDL语言,最初我连最基本的程序都看不懂,经过努力后,我不仅可以看懂程序还可以利用QuartusⅡ软件对程序进行编译、仿真。
这次毕业设计的经历提高了我的自学能力,当我遇到一个问题的时候,我会认真的查找出错的地方,然后想办法把它解决掉,一个程序的仿真结果出来后,我还会认真的查看仿真的结果是不是正确的。
在做硬件实验时,开始我反复琢磨了很久都没有做出来,通过和老师同学的交流,我终于成功的做出了硬件的仿真。
这次的毕业设计结果可以按照设计的正常运行。
这次毕业设计告诉我,只要努力、认真,再难再陌生的东西都能够做的出来。
参考文献
[1]李广军,孟宪元.可编程VHDL设计及应用.成都:
电子科技大学出版社,200334-35
[2]马义忠,常蓬彬,马浚.数字逻辑与数字系统.北京:
高等教育出版社,200522-24
[3]曾繁泰,王强,盛娜.EDA工程的理论与实践.北京:
电子工业出版社,2004
[4]邹彦,庄严.EDA.技术与数字系统设计.北京:
电子工业出版社,2007.4
[5]王丹,童如松.电子设计自动化(EDA)手册.北京:
电子工业出版社,2005.3
[6]辛春艳.VHDL硬件描述语言.北京:
国防工业出版社,2002
[7]
[8]王建坤.MAX+PLUSⅡ入门与提高.北京:
清华大学出版社,2004
[9]李洪伟,高斯华.基于QuartusⅡ的FPGA/CPLD设计.北京:
电子工业出版社,2006.4
[10]谭会生,张昌凡.EDA技术及应用.西安:
西安电子科技大学出版社,2004
[11]李景华,杜王远.可编程逻辑器件与EDA技术.东北大学出版社,2000
[12]CharlesH.Roth.数字体统设计与VHDL.电子工业出版社,2008
[13]
[14]路明礼.数字电子技术.武汉:
武汉理工大学出版社,2008.8
[15]VHDLLanguageReferenceGuide,AldecInc.HendersonNVUSA1999.
[16]AlteraCorporationDATABOOKAlteraCorporationSanJoseCA95134USA,2004.
[17]潘松,王国栋.VHDL实用教程.成都:
电子科技大学出版社,1999.12
[18]VanHWBroeck,SkudelnyHC,StankeGV.Analysisandrealizationofapulsewidthmodulatorbasedonvoltagespacevectors[J].IEEETransomIndustryApplications,1988,24
(1):
142-150.
附录
1.1主控制器的程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCZMKIS
PORT
(CLOCK:
INSTD_LOGIC;
RESET:
INSTD_LOGIC;
HOLD:
INSTD_LOGIC;
FLASH:
OUTSTD_LOGIC;
NUMA,NUMB:
OUTINTEGERRANGE0TO25;
RedA,GreenA,YellowA:
OUTSTD_LOGIC;
RedB,GreenB,YellowB:
OUTSTD_LOGIC
);
END;
ARCHITECTURECONTROLOFCZMKIS
SIGNALCOUNTNUM:
INTEGERRANGE0TO50;
BEGIN
PROCESS(CLOCK,RESET)
BEGIN
IFRESET='1'THEN
COUNTNUM<=0;
ELSIFRISING_EDGE(CLOCK)THEN
IFHOLD='1'THEN
FLASH<='1';
ELSE
FLASH<='0';
IFCOUNTNUM=49THEN
COUNTNUM<=0;
ELSE
COUNTNUM<=COUNTNUM+1;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLOCK)
BEGIN
IFRISING_EDGE(CLOCK)THEN
IFHOLD='1'THEN
RedA<='1';
RedB<='1';
GreenA<='0';
GreenB<='0';
YellowA<='0';
YellowB<='0';
ELSE
IFCOUNTNUM<=19THEN
NUMA<=20-COUNTNUM;
RedA<='0';
GreenA<='1';
YellowA<='0';
ELSIF(COUNTNUM<=24)THEN
NUMA<=25-COUNTNUM;
RedA<='0';
GreenA<='0';
YellowA<='1';
ELSE
NUMA<=50-COUNTNUM;
RedA<='1';
GreenA<='0';
YellowA<='0';
ENDIF;
IFCOUNTNUM<=24THEN
NUMB<=25-COUNTNUM;
RedB<='1';
GreenB<='0';
YellowB<='0';
ELSIFCOUNTNUM<=44THEN
NUMB<=45-COUNTNUM;
RedB<='0';
GreenB<='1';
YellowB<='0';
ELSE
NUMB<=50-COUNTNUM;
RedB<='0';
GreenB<='0';
YellowB<='1';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
END;
1.2分频器的程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYFREQUENCY10HZIS
PORT
(CLK20M:
INSTD_LOGIC;
CLK10HZ:
OUTSTD_LOGIC
);
END;
ARCHITECTURECOUNTOFFREQUENCY10HZIS
SIGNALTOUT:
INTEGERRANGE0TO777777;
SIGNALCLK:
STD_LOGIC;
BEGIN
PROCESS(CLK20M)
BEGIN
IFRISING_EDGE(CLK20M)THEN
IFTOUT=777777THEN
TOUT<=0;
CLK<=NOTCLK;
ELSETOUT<=TOUT+1;
ENDIF;
ENDIF;
ENDPROCESS;
CLK10HZ<=CLK;
END;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYFREQUENCYIS
PORT
(CLK10HZ:
INSTD_LOGIC;
CLK1HZ:
OUTSTD_LOGIC
);
END;
ARCHITECTURECOUNTOFFREQUENCYIS
SIGNALTOUT:
INTEGERRANGE0TO4;
SIGNALCLK:
STD_LOGIC;
BEGIN
PROCESS(CLK10HZ)
BEGIN
IFRISING_EDGE(CLK10HZ)THEN
IFTOUT=4THEN
TOUT<=0;
CLK<=NOTCLK;
ELSETOUT<=TOUT+1;
ENDIF;
ENDIF;
ENDPROCESS;
CLK1HZ<=CLK;
END;
1.3提取显示值的程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYTQXSZIS
PORT
(CLOCK:
INSTD_LOGIC;
NUMIN:
ININTEGERRANGE0TO25;
NUMA,NUMB:
OUTINTEGERRANGE0TO15
);
END;
ARCHITECTUREFENOFTQXSZIS
BEGIN
PROCESS(CLOCK)
BEGIN
IFRISING_EDGE(CLOCK)THEN
IFNUMIN>=20THEN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 交通灯 控制器 毕业设计