基于FPGA的交通灯控制器设计报告.doc
- 文档编号:144207
- 上传时间:2023-04-28
- 格式:DOC
- 页数:19
- 大小:2.14MB
基于FPGA的交通灯控制器设计报告.doc
《基于FPGA的交通灯控制器设计报告.doc》由会员分享,可在线阅读,更多相关《基于FPGA的交通灯控制器设计报告.doc(19页珍藏版)》请在冰点文库上搜索。
电子技术课程设计报告
********大学
*******学年第二学期
电子技术基础课程设计
——交通灯控制器
院系:
***
学号:
***
姓名:
***
专业:
***
指导老师:
***
目录
目录 II
第1章绪论 -1-
1.1课程设计背景 -1-
1.2课程设计题目 -1-
1.3课题功能补充 -2-
第2章系统设计 -3-
2.1系统设计思路 -3-
2.2系统框架设计 -3-
2.3输入输出设计 -4-
2.4模块设计过程 -5-
2.4.1分频模块 -5-
2.4.2时间设置模块 -5-
2.4.3状态转换模块 -6-
2.4.4时间显示模块 -6-
2.4.5LED信号灯显示模块 -7-
2.4.6LCD同步显示模块 -7-
2.4.7数码管显示模块 -7-
2.5模块描述 -8-
2.5.1分频模块 -8-
2.5.2时间设置模块 -8-
2.5.3状态转换模块 -9-
2.5.4时间显示模块 -9-
2.5.5LED信号灯显示模块 -9-
2.5.6LCD同步显示模块 -10-
2.6.7数码管显示模块 -10-
2.6整体电路图 -11-
第3章系统仿真 -12-
3.1运行功能 -12-
3.2设置功能 -12-
3.3暂停/复位功能 -13-
3.4LCD屏显示功能 -14-
第4章实验总结 -15-
4.1心得体会 -15-
4.2待改进的问题 -16-
4.3结束语 -16-
-11-
电子技术课程设计报告
第1章绪论
1.1课程设计背景
经过两个学期的电子线路设计测试实验,我们从基础的模电、数电典型电路的设计和实现做起,从PSpice和MAXⅡ的设计与仿真,到面包板搭建电路的实践与测试,在不断的学习和积累中,了解了电子技术设计的基本过程和基础知识。
在本学期,我们迎来了电子技术课程设计,这是一次将理论付诸实践的宝贵机会,是提升我们运用电子技术设计手段实现实际问题的能力的良好机遇。
在选题阶段,我踌躇满志的和另一个同学选择了SD卡音乐播放器这个选做题,但是由于没有足够地去深入了解相关的技术问题,致使在开题时没有通过曾老师的验收,只能十分遗憾的选择了基础题,改做交通灯控制器了。
虽然有些遗憾,因为当初觉得自己有能力完成那样一个选做题,但是这也给了我一个深刻的教训,在机遇和挑战面前,再有信心也要做好充足的准备来证明你的实力。
另一方面给我的启示就是,尽管一个相同的题目前人做了很多工作,给我们提供了一个很好的平台,但是如果我们只是去读懂和使用它们,仅限在这样一个层次是远远不够了,要学会从前人的研究成果中寻找新的突破点,利用自己已掌握的知识或者所具备的能力,在原有的基础上实现更加丰富的功能,这才应该是我们做课程设计的最终目的。
仅仅看懂别人的设计思路和代码并不是能力的体现,而真正锻炼我们能力的是在充分掌握前人设计手段的基础上,融会贯通地使原有的设计更加结合实际,更加完善。
尽管没能做成选做题,但我对于这个交通灯控制器的设计还是兴趣十足。
毕竟我们是控制系的学生,在不久前也学习过利用PLC控制器实现智能交通灯的方法,感觉这个题目上手应该比较快。
加上前两个学期的积累,譬如数字钟的设计,就已经用到了分频、计数等等功能的设计模块,将它们移植过来加以改善,应该能够实现题目要求的基本功能了。
之后我查阅了一些相关设计论文,发现大多数基于FPGA利用Verilog进行设计的交通灯控制器的原理都是状态转换,于是该题目设计的主题思想——基于状态转换,就这样确定了。
1.2课程设计题目
设计一个十字路口交通信号灯的控制电路。
要求红、绿灯按照一定的要求亮和灭,并在亮灯期间进行倒计时,且将运行时间用数码管显示出来。
要求主干道每次通行时间为TX秒,支干道每次通行时间为TY秒。
每次变换运行车道前绿灯闪烁,持续时间为5秒。
即车道要由X转换为Y时,X在通行时间只剩下5秒钟时,绿灯闪烁显示,Y仍为红灯。
可以对X、Y方向上的交通灯运行时间进行重新设置。
1.3课题功能补充
在原有题目功能要求的基础上,我对交通灯控制器的功能在设计方面进行了补
充,主要体现在:
(1)增加主、次干道左转红绿信号灯;
(2)增加主、次干道左转运行时间倒计时,并用数码管显示;
(3)增加LCD同步显示当前运行状态功能,即用LCD显示信号灯状态;
(4)增加主、次干道左转运行时间重新设置功能。
功能增加了,可以说任务量也增加了不少。
就最为关键的时间设置和显示方面,由于增加了两个左转方向的运行时间,虽然只是增加了两个状态,但是同时显示四个方向的等待和通行的倒计时,确实在开始设计时,我有些茫然,觉得无从下手。
我花了很长时间在网上查阅实际中的交通灯到底是如何计时和运行的,也到学校周围的路口实地调查过几种十字路口交通灯的设置,慢慢的从实际设置需求中理清头绪,具体的设计思路将在后面的部分详细说明。
第2章系统设计
2.1系统设计思路
前面讲到,基于状态机的方法可以轻松实现交通灯的控制,而状态转换利用Verilog中的case和循环语句很容易实现。
我将四种状态的转换顺序设置为:
主直→主左→次直→次左→主直→……(依次循环),每个状态在设置时间的基础上由倒计时进行状态的变换。
以上都是比较容易实现的,也是很多经典的例子上有讲解过的,下面我着重说明下如何实现四个方向同时进行等待和通行的倒计时。
用四组数码管来显示主、次干道直行和左转倒计时,首先需要了解这四组数码管显示的规律,也就是显示计数的规律。
在网上查阅资料的时候,通过观看一段视频,我茅塞顿开。
这个视频展示的是基于51单片机实现的交通灯控制器的实物功能演示,它也是利用了四组数码管分别显示四个方向的倒计时。
通过反复观看我发现,其实在四个方向中,一个是通行倒计时,另外三个是等待倒计时,而等待倒计时又是它之前状态通行时间之和,在显示的效果上就是总会有两组倒计时数值是相同的,即相邻状态的那两个是相同的,一个是正在通行,一个是等待上一状态通行的结束。
这之后的两个状态显示的倒计时是累加上之前未通行状态的设置时间和正在通行状态的剩余时间之和。
如图所示:
图1状态转换图
图2倒计时显示方式(以主干道正在通行为例)
2.2系统框架设计
通过以上分析,可以较为清晰地看出在系统设计状态转换和一些实现方式的设计思路,下面说明系统的框架整体设计思路。
整体框架思路为:
首先将DE2教学实验板提供的50MHZ时钟信号分频,转换为可利用的1HzCP信号,同时为了实现绿灯在1s内闪烁一次,再转换出一个2Hz的CP信号提供给需要闪烁的绿灯。
然后是设置时间的功能模块,通过开关可以分别设置四个方向的运行时间,并将设置的时间传送到状态转换模块中。
在状态转换功能模块中,通过前面传送来的设定通行时间进行倒计时和转换状态,并输出当前方向通行剩余时间和四向使能EN信号。
在时间显示功能模块中,接收到前面的设置时间、剩余时间、使能信号,运用前面说明的现实方式的逻辑,计算出等待时间,在该向通行时显示剩余时间,在该向等待时显示等待时间,最终将时间信号输出到数码管显示模块;另外,由于数码管数量的限制,只能一次性显示8个(即四组),那么究竟是显示倒计时还是显示设置时间就需要一个开关信号来区分,于是设置一个输入信号来判别是否进入设置模式,并且只能在设置模式下设置时间。
LED信号灯显示功能模块则将状态转换模块输出的EN使能信号和2Hz的CP信号以及当前剩余时间作为输入,根据状态点亮相应的LED信号灯。
LCD显示功能模块的原理和LED信号灯显示模块类似,也是根据同步状态EN使能信号,通过刷新字符的方式,改变和显示当前通行状态。
最后,数码管显示功能模块是结合DE2教学开发板数码管的编码规则将BCD码转换为七段码,在译码后显示出来。
图3系统框图
上图所示的系统框图只是大致说明系统的框架和流程,没有具体到每个模块的输入和输出,在前面的文字描述中有所说明,更加详细的设计说明将在后面模块功能说明的详细介绍。
2.3输入输出设计
根据功能需要,输入设计采用拨动开关,共10个。
其中,设置四向时间用8个,另外两个分别用于暂停和复位,即分频的nCR和状态装换的nCR输入。
时钟信号输入为50MHz的时钟频率振荡器。
(在这里补充说明一点,DE2教学开发板的按键弹起为高电平,按下为低电平,我在实验中发现不适合作为设置开关,所以没有采用;其实拨动开关更能在测试时较好地显示状态和反应问题,便于寻找错误点。
)
输入设计采用8个数码管用于显示倒计时,8个LED灯作为交通信号灯,LCD屏同步显示运行状态。
图4输入输出设计
50MHz晶振
LCD屏显示
数码管显示
时间设置开关
暂停/复位/模式开关
LED信号灯
2.4模块设计过程
2.4.1分频模块
该模块实现的是对50MHz晶振时钟信号的分频功能,采用传统的“一半就翻转”的计数技巧,这一功能在很多资料上都能查找到相关代码,就不再赘述。
为了实现绿灯在1s内闪烁一次,需要一个2Hz的CP信号,这里一次性产生两种信号:
1Hz和2Hz,便于之后模块的使用。
2Hz的CP信号产生实际就是在1Hz分频的基础上,改变每次移位的位数,使每次移位为1Hz的两倍,这样产生信号的周期就缩短了一倍,自然形成了2Hz的CP信号。
2.4.2时间设置模块
该模块的位置靠前,主要是实现对四个方向通行时间的设置,其设置的结果,最为此后模块的输入,故置于前端。
该模块根据时间设置拨动开关的情况,采用累加计数方式设定通行时间,为了便于置数,采用十位、个位分别置数的方式,即十位和个位在设置拨动开关有效时,按照从0到9的顺序累加,到9又返0(当然与程序中设置的初始时间有关)。
每次先读取十位是否需要置数,如果需要,开始进行十位的置数累加;如果没有十位置数请求,则读取个位置数开关信号,开始个位置数累加。
注意:
不能同时对两位进行置数,这在实际中也避免了操作错误的出现。
关于置数累加所需的CP信号,可以采用高于1Hz的时钟信号,这样可以提高置数效率;但是我在实际操作调试的过程中发觉,由于拨动开关没有去抖功能,如果CP信号的频率过快,容易产生错误的时间跳变,增加了控制的准确性,反而影响了设置时间的效率,于是我仍旧采用了1Hz的CP信号作为该模块的时钟信号输入。
为了防止在正常运行情况下没有显示设置时间就可以通过拨动开关进行置数,这里设置了模式信号,即只能在数码管显示为设置时间的时候,才能通过拨动开关进行置数操作,否则开关操作无效。
2.4.3状态转换模块
该模块是控制器的核心部分,但是原理其实很简单,只是输入输出量很多,获取的信息多,处理后输出的信息也多。
前文已说明了状态转换的思想是该控制器实现的主要思路,那么如何处理好这么多输入输出的关系就成为了重点需要解决的问题了。
输入部分的关键是四向设定通行时间的传入,这可以从时间设置模块的输出获取。
这四个设定时间传入的时间需要选择好,即选择恰当的时机读取新的设置通行时间,因为设置时间的操作可能发生在任何运行时间,如果不能选择很好的时机来读入新的设置通行时间,可能造成逻辑上的混乱,致使状态不能按照正常的顺序进行转移,也给实际的交通信号控制造成了一定的影响。
在这里,我选取了在每个状态运行结束的同时来读取新的设置通行时间,这样在任意状态时刻设置时间,将会在下一个状态到来时切换到新的通行时间上去运行,一方面不会使设置的效果延时太长,另一方面也不会出现如果恰巧在该方向上设置时间,那么该方向可能一直显示通行而不能正常转换状态的逻辑错误。
输出部分的关键是四个方向的EN使能信号和通行倒计时时间。
根据所在的状态,可以对四个方向的EN使能信号进行赋值输出,用于控制信号灯显示和LCD同步状态显示等。
通行时间倒计时是为了数码管能够显示出通行剩余时间和等待通行时间,这个显示的方式在前文也有描述,这里不再赘述。
通行剩余时间就是状态转换过程所依据的倒计时时间,在状态转换中需要根据各向通行时间在每个通行状态进行减计数倒计时,当计数到01时切换状态,而这个倒计时的时间正好是该方向通行的剩余时间,输出后经过显示方式的逻辑处理,就可以变成其它禁止方向的等待通行时间了。
2.4.4时间显示模块
基于前文描述的显示方式,该功能模块实现的就是显示该方向通行剩余时间,其它三个方向等待通行的时间以及设置时间模式下四个方向的通行时间。
可以看出,在只有四组数码管的前提下,只能通过增加一个模式开关来区分显示的是运行时间还是设置时间。
该模块的难点就是在逻辑上,在下文的整体电路图中会发现,此部分的连线较为复杂,如图2所示,在过程中需要传递和获取很多个时间,有正在通行方向的剩余时间,这个可以从状态转换模块之间获取,有该方向和正在通行方向之间的所有状态的通行时间之和(即等待通行时间)。
为了模块化,我并没有做大范围的集成,而是把这个逻辑体现在了电路的连接上面,虽然看起来有些繁杂,但是却能比较直观的显示出其中的逻辑关系,即是如何累加的,这样在逻辑出错时,便于纠错。
在等待通行时间的累加上,采用了依次传值的方式,按照状态顺序的高低,从上往下依次传送自己的等待通行时间,高位状态传送给低位状态自己需要等待的时间和该高位状态通行时间,低位状态将这两个时间求和后得到该低位状态的等待通行时间。
如果高位状态正在通行,则将该高位状态通行的剩余时间传送给其下的低位状态,该低位状态直接将该剩余时间作为自己的等待通行时间显示出来。
2.4.5LED信号灯显示模块
该功能模块就是实现用LED灯模拟交通信号灯的显示,根据题目要求设置红灯和绿灯,绿灯在倒数5s开始闪烁。
DE2教学开发板上面的LED灯是共阳极的,所以给低电平就能点亮相应的灯。
为了实现绿灯闪烁的效果,可以在倒计时5s时开始对绿灯的EN使能信号进行自取反,使用2Hz的CP信号就能实现较好的闪烁效果了。
这里说明一下没有增加黄灯显示的原因,虽然黄灯在实际的交通灯中使用较广泛,但是黄灯显示的时间很短暂,却要在各方向各增加一个状态,这就给倒计时显示增加了难度。
我在网上看到过一个有黄灯的视频展示,它就是出现了黄灯也要倒计时的情况,感觉实用性不大,反而容易造成视觉上的困扰,因为黄灯的时间太短了。
鉴于我没有充分考虑好解决的方案,所以暂时没有增加黄灯的显示功能。
2.4.6LCD同步显示模块
该功能模块实现的就是用LCD屏显示当前的交通灯运行状态,在LCD屏上显示字符“<”表示允许左转,“∧”表示允许直行,“×”表示禁止通行,用“M”和“B”来区分主、次干道,采用ASCII码的编码方式显示相应字符。
该模块建立在DE2底层模块的基础上,由于其显示和刷新的原理比较复杂,我也花费了很长的时间慢慢去看懂这些底层的代码。
在这个过程中我遇到的最大困难就是如何实现刷新,既然要同步显示通行的状态,肯定要根据EN使能信号来选择在LCD屏上显示什么样的字符表示相应的状态。
可是底层函数的调用只能显示一次字符,即不能刷新,这样一来就无法完成设计目的了。
于是我在底层函数中慢慢测试,看看哪些语句可以控制实现刷新功能,尝试了很多种方式,终于在LCD_TEST中找到了可以实现刷新的地方,其实原理很简单,就是在每次读取完整屏信息后,读取位置地址归零,在下个读取信号到来时再次进行读取字符进行显示。
2.4.7数码管显示模块
该功能模块同样建立在DE2底层函数调用基础上,实现四组8个数码管的时间显示。
根据DE2教学开发板上数码管的七段编码规则,将输入时间的8位BCD码转换为七段码显示出来,我根据实际需要修改了底层函数,使得调用更加方便和集成化。
根据数码管七段的位置进行编码,每个段位的管子仍然是共阳极的,所以高电平实现熄灭管子,低电平实现点亮管子。
小数点在物理上没有连接,所以无法使用。
图5七段数码管的原理图和每段的标识位置
该功能在实现上,只要有输入就会有相应的输出,所以原理上比较简单,只要编码正确不会出现问题,所以不再赘述。
2.5模块描述
2.5.1分频模块
input _50MHzIn,nCR; //输入50MHz的晶振时钟信号,暂停时钟信号
output _1HzOut,_2HzOut; //输出1Hz和2Hz的CP信号
2.5.2时间设置模块
input nCR,CP,HSet,LSet,Key; //输入复位,时钟,十位、个位设置,设置模式
output Time; //输出设置后的通行时间
说明:
该功能模块共有4个,用于分别设置初始的四项通行时间,给出的图示是设置主干道直行通行时间的例子,由于功能结构类似,不再列举其他3个模块。
2.5.3状态转换模块
input CP,nCR; //时钟,复位信号输入
input [7:
0]MainTime,MainLeftTime,BranchTime,BranchLeftTime; //各向设置时间输入
output MainEN,MainLeftEN,BranchEN,BranchLeftEN,TimeCur; //各向使能信号输出
2.5.4时间显示模块
input EN,Key; //输入各向使能信号,设置模式
input [7:
0]TimeCur,Time,TimeIn; //输入剩余时间,高位状态剩余时间,等待时间
output TimeOut,TimeShow; //输出等待时间,数码管显示时间
2.5.5LED信号灯显示模块
input [7:
0]TimeCur; //输入通行剩余时间
input CP,MainEN,MainLeftEN,BranchEN,BranchLeftEN; //输入时钟,各向使能信号
output LightRedMain,LightGreenMain,LightRedBranch,LightGreenBranch,LightRedMainL,LightGreenMainL,LightRedBranchL,LightGreenBranchL; //输出8个LED信号灯信号
2.5.6LCD同步显示模块
input MainEN,MainLeftEN,BranchEN,BranchLeftEN; //输入各向使能信号
input CLOCK_50; //输入50MHz时钟信号
//////////////////// LCDModule16X2 //////////////////////(LCD屏各控制量输出)
inout [7:
0] LCD_DATA; // LCDDatabus8bits
output LCD_ON; // LCDPowerON/OFF
output LCD_BLON; // LCDBackLightON/OFF
output LCD_RW; //LCDRead/WriteSelect,0=Write,1=Read
output LCD_EN; // LCDEnable
output LCD_RS; // LCDCommand/DataSelect,0=Command,1=Data
2.6.7数码管显示模块
input [7:
0] iDIG; //8位时间BCD码输入
output [6:
0] oSEG0,oSEG1; //转换成2个数码管输出
2.6整体电路图
将上面设计的各功能模块依据逻辑思路,结合输入输出设计搭建成如下图所示的整体电路图。
说明:
由于原电路图较大,在文档中只能缩小显示,电子档报告可以选择显示比例在250%以上来查看细节。
原图参见附件中的.bdf文件。
第3章系统仿真
下面分别仿真各项功能,由于50MHz的分频在仿真中不易观察和实现,故分频部分只在实际下载后进行验证,除去分频模块后,使用普通的CP信号驱动整个电路进行仿真。
LCD屏输出需要在50MHz的频率下才能显示。
3.1运行功能
开始时,系统初始全部为零,在nCR为高时,开始读入程序中的初始值,nCR为低后,系统开始运行。
下图所显示的就是,四向初始通行时间为30s,10s,20s,10s,初始主干道直行方向已经运行结束,转换为主干道左转运行,其他三向等待通行时间为40s,10s,30s。
由于使用的是相同频率的CP信号,绿灯只能在两个周期内闪烁一次。
下图所示的是一个完整的运行周期。
3.2设置功能
只有当Key(高有效)有效时,才能进行各向通行时间的设置。
下图所示,在Key为低时,设置无效,在Key为高时,分别设置次干道直行十位、个位一次,即加计数一次,从原来的20s变为31s,同时数码管显示的也是设置时间而不是运行时间。
设置所有方向的通行时间,仿真如下图,注意:
不能同时设置多个数位。
3.3暂停/复位功能
暂停功能是通过将分频模块置零来实现的,因为去除了分频装置,这里无法仿真。
复位信号nCR有效时,系统重新装入程序预置值,如下图所示。
3.4LCD屏显示功能
由于LCD屏显示需要50MHz的时钟信号,仿真时间较长,故没有把所有情况全部仿真出来,只以下图为例。
为了更好的展示我所做的各项功能,包括很多未能在仿真中演示的,我特地制作了一段3m左右的视频。
附:
功能展示视频-DE2交通灯.flv
第4章实验总结
4.1心得体会
看着手边不断变换的交通信号灯以及倒计时显示的数码管,回顾这5周以来为课设所做的所有努力,感慨良多。
只有亲身去努力尝试,才回收获真正的知识和能力。
为了找到切合实际的解决方案,我采用实地调查和网络搜集;为了寻找可能存在的BUG,我反复测试下载后的DE2板子,尽量穷尽各种可能出现的特殊情况,发现问题及时修改。
值得欣慰的是,所有的努力没有白费,到目前为止所做出的成果还是比较令我满意的。
在这里,要感谢曾喻江老师的教诲,感谢学校开设这门课程设计,给我们了一次充分锻炼,将理论知识付诸实践的机会。
书上的知识再多,都是死的,即使你完全记住,也无法在实际使用中游刃有余地去利用它们,不能让知识为我所用。
同时,在解决问题的时候,会发现自己依旧欠缺的知识,需要我们耐心地去查阅资料,不断补充新的领域的知识。
这样的一种锻炼,可以帮助我们形成一种习惯,在今后工作学习中,自然地去运用相同的方法解决不同的问题。
很多同学说,本科期间做项目找实习的机会太少,其实他们忽略了像课程设计这样的宝贵机会。
大学三年,我们学习了很多工程技术的知识,但却经常性的忽视在这些课程中的课程设计这个关键环节,认为它们只不过是走过场,抄抄代码,写写报告就够了。
其实不然,课程设计本身就是一次做项目的经历,它要求你严格按照项目规程操作,在时间和进度上,都要有项目意识。
曾老师在课程开始的第一节课,就花了大量的时间讲述项目的做法,但是当时很多同学并没有在意,包括我。
虽然我学习过信息系统等软件开发的流程和方法,但是与实际运用严重脱节,没有那种清晰而强烈的工程思想,而是沿用做一步看一步的原始想法。
这也直接导致了我在当初选择选做题开题失利的结果,现在想来,就是因为选定题目后,没有做足够充分的可行性研究和系统概要设计,没有明确自己到底可以实现哪些功能,哪些功能可能还有困难。
在开题说明的时候,我们被曾老师的几个问题打住了,说实话,当时我们心里很不服气,很多选择相同题目的同学其实并没有太多的去进行可行性研究,只是一味的夸大自己的功能,但是我们自己也确实没有底气,因为毕竟没有仔细地去论证每个功能实现的可能性和存在的难点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 交通灯 控制器 设计 报告