《基于FPGA的交通灯控制器设计报告.docx》由会员分享,可在线阅读,更多相关《基于FPGA的交通灯控制器设计报告.docx(31页珍藏版)》请在三一办公上搜索。
1、基于FPGA的交通灯控制器设计报告电子技术课程设计报告 *大学 *学年第二学期 电子技术基础课程设计 交通灯控制器 院 系:* 学 号:* 姓 名:* 专 业:* 指导老师: * I 电子技术课程设计报告 目 录 目 录 . 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时间设
2、置模块 . - 5 - 2.4.3状态转换模块 . - 6 - 2.4.4时间显示模块 . - 6 - 2.4.5 LED信号灯显示模块 . - 7 - 2.4.6 LCD同步显示模块 . - 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.5 LED信号灯显示模块 . - 9 - 2.5.6 LCD同步显示模块 . - 10 - 2.6.7数码管显示模块 . - 10 - 2.6整体电路图 . -
3、 11 - 第3章 系统仿真 . - 12 - 3.1运行功能 . - 12 - 3.2设置功能 . - 12 - 3.3暂停/复位功能 . - 13 - 3.4 LCD屏显示功能 . - 14 - II 电子技术课程设计报告 第4章 实验总结 . - 15 - 4.1心得体会 . - 15 - 4.2待改进的问题 . - 16 - 4.3结束语 . - 16 - III 电子技术课程设计报告 第1章 绪论 1.1课程设计背景 经过两个学期的电子线路设计测试实验,我们从基础的模电、数电典型电路的设计和实现做起,从PSpice和MAX的设计与仿真,到面包板搭建电路的实践与测试,在不断的学习和积累
4、中,了解了电子技术设计的基本过程和基础知识。在本学期,我们迎来了电子技术课程设计,这是一次将理论付诸实践的宝贵机会,是提升我们运用电子技术设计手段实现实际问题的能力的良好机遇。 在选题阶段,我踌躇满志的和另一个同学选择了SD卡音乐播放器这个选做题,但是由于没有足够地去深入了解相关的技术问题,致使在开题时没有通过曾老师的验收,只能十分遗憾的选择了基础题,改做交通灯控制器了。虽然有些遗憾,因为当初觉得自己有能力完成那样一个选做题,但是这也给了我一个深刻的教训,在机遇和挑战面前,再有信心也要做好充足的准备来证明你的实力。另一方面给我的启示就是,尽管一个相同的题目前人做了很多工作,给我们提供了一个很好
5、的平台,但是如果我们只是去读懂和使用它们,仅限在这样一个层次是远远不够了,要学会从前人的研究成果中寻找新的突破点,利用自己已掌握的知识或者所具备的能力,在原有的基础上实现更加丰富的功能,这才应该是我们做课程设计的最终目的。仅仅看懂别人的设计思路和代码并不是能力的体现,而真正锻炼我们能力的是在充分掌握前人设计手段的基础上,融会贯通地使原有的设计更加结合实际,更加完善。 尽管没能做成选做题,但我对于这个交通灯控制器的设计还是兴趣十足。毕竟我们是控制系的学生,在不久前也学习过利用PLC控制器实现智能交通灯的方法,感觉这个题目上手应该比较快。加上前两个学期的积累,譬如数字钟的设计,就已经用到了分频、计
6、数等等功能的设计模块,将它们移植过来加以改善,应该能够实现题目要求的基本功能了。 之后我查阅了一些相关设计论文,发现大多数基于FPGA利用Verilog进行设计的交通灯控制器的原理都是状态转换,于是该题目设计的主题思想基于状态转换,就这样确定了。 1.2课程设计题目 设计一个十字路口交通信号灯的控制电路。要求红、绿灯按照一定的要求亮和灭,并在亮灯期间进行倒计时,且将运行时间用数码管显示出来。 要求主干道每次通行时间为TX秒,支干道每次通行时间为TY秒。每次变换运行车道前绿灯闪烁,持续时间为5秒。即车道要由X转换为Y时,X在通行时间只剩下5秒钟时,绿灯闪烁显示,Y仍为红灯。 可以对X、Y方向上的
7、交通灯运行时间进行重新设置。 - 1 - 电子技术课程设计报告 1.3课题功能补充 在原有题目功能要求的基础上,我对交通灯控制器的功能在设计方面进行了补 充,主要体现在: 增加主、次干道左转红绿信号灯; 增加主、次干道左转运行时间倒计时,并用数码管显示; 增加LCD同步显示当前运行状态功能,即用LCD显示信号灯状态; 增加主、次干道左转运行时间重新设置功能。 功能增加了,可以说任务量也增加了不少。就最为关键的时间设置和显示方面,由于增加了两个左转方向的运行时间,虽然只是增加了两个状态,但是同时显示四个方向的等待和通行的倒计时,确实在开始设计时,我有些茫然,觉得无从下手。我花了很长时间在网上查阅
8、实际中的交通灯到底是如何计时和运行的,也到学校周围的路口实地调查过几种十字路口交通灯的设置,慢慢的从实际设置需求中理清头绪,具体的设计思路将在后面的部分详细说明。 - 2 - 电子技术课程设计报告 第2章 系统设计 2.1系统设计思路 前面讲到,基于状态机的方法可以轻松实现交通灯的控制,而状态转换利用Verilog中的case和循环语句很容易实现。我将四种状态的转换顺序设置为:主直主左次直次左主直,每个状态在设置时间的基础上由倒计时进行状态的变换。以上都是比较容易实现的,也是很多经典的例子上有讲解过的,下面我着重说明下如何实现四个方向同时进行等待和通行的倒计时。 用四组数码管来显示主、次干道直
9、行和左转倒计时,首先需要了解这四组数码管显示的规律,也就是显示计数的规律。在网上查阅资料的时候,通过观看一段视频,我茅塞顿开。这个视频展示的是基于51单片机实现的交通灯控制器的实物功能演示,它也是利用了四组数码管分别显示四个方向的倒计时。通过反复观看我发现,其实在四个方向中,一个是通行倒计时,另外三个是等待倒计时,而等待倒计时又是它之前状态通行时间之和,在显示的效果上就是总会有两组倒计时数值是相同的,即相邻状态的那两个是相同的,一个是正在通行,一个是等待上一状态通行的结束。这之后的两个状态显示的倒计时是累加上之前未通行状态的设置时间和正在通行状态的剩余时间之和。如图所示: 图1 状态转换图 主
10、干道直行主干道左转次干道直行次干道左转图2 倒计时显示方式 主直剩余时间主直剩余时间主左通行时间主直剩余时间主左通行时间次直通行时间主干道直行通行时间主干道左转等待时间次干道直行等待时间次干道左转等待时间2.2系统框架设计 通过以上分析,可以较为清晰地看出在系统设计状态转换和一些实现方式的设计思路,下面说明系统的框架整体设计思路。 - 3 - 电子技术课程设计报告 整体框架思路为:首先将DE2教学实验板提供的50MHZ时钟信号分频,转换为可利用的1Hz CP信号,同时为了实现绿灯在1s内闪烁一次,再转换出一个2Hz的CP信号提供给需要闪烁的绿灯。然后是设置时间的功能模块,通过开关可以分别设置四
11、个方向的运行时间,并将设置的时间传送到状态转换模块中。在状态转换功能模块中,通过前面传送来的设定通行时间进行倒计时和转换状态,并输出当前方向通行剩余时间和四向使能EN信号。在时间显示功能模块中,接收到前面的设置时间、剩余时间、使能信号,运用前面说明的现实方式的逻辑,计算出等待时间,在该向通行时显示剩余时间,在该向等待时显示等待时间,最终将时间信号输出到数码管显示模块;另外,由于数码管数量的限制,只能一次性显示8个,那么究竟是显示倒计时还是显示设置时间就需要一个开关信号来区分,于是设置一个输入信号来判别是否进入设置模式,并且只能在设置模式下设置时间。LED信号灯显示功能模块则将状态转换模块输出的
12、EN使能信号和2Hz的CP信号以及当前剩余时间作为输入,根据状态点亮相应的LED信号灯。LCD显示功能模块的原理和LED信号灯显示模块类似,也是根据同步状态EN使能信号,通过刷新字符的方式,改变和显示当前通行状态。最后,数码管显示功能模块是结合DE2教学开发板数码管的编码规则将BCD码转换为七段码,在译码后显示出来。 图3 系统框图 分频 1Hz/2HzCP信号时间显示数码管显示四向时间设置设定时间运行时间状态转换EN使能信号LED信号灯显示LCD显示上图所示的系统框图只是大致说明系统的框架和流程,没有具体到每个模块的输入和输出,在前面的文字描述中有所说明,更加详细的设计说明将在后面模块功能说
13、明的详细介绍。 2.3输入输出设计 根据功能需要,输入设计采用拨动开关,共10个。其中,设置四向时间用8个,另外两个分别用于暂停和复位,即分频的nCR和状态装换的nCR输入。时钟信号输入为50MHz的时钟频率振荡器。 输入设计采用8个数码管用于显示倒计时,8个LED灯作为交通信号灯,LCD屏同步显示运行状态。 - 4 - 电子技术课程设计报告 图4 输入输出设计 LCD屏显示 50MHz晶振 数码管显示 LED信号灯 时间设置开关 暂停/复位/模式开关 2.4模块设计过程 2.4.1分频模块 该模块实现的是对50MHz晶振时钟信号的分频功能,采用传统的“一半就翻转”的计数技巧,这一功能在很多资
14、料上都能查找到相关代码,就不再赘述。为了实现绿灯在1s内闪烁一次,需要一个2Hz的CP信号,这里一次性产生两种信号:1Hz和2Hz,便于之后模块的使用。2Hz的CP信号产生实际就是在1Hz分频的基础上,改变每次移位的位数,使每次移位为1Hz的两倍,这样产生信号的周期就缩短了一倍,自然形成了2Hz的CP信号。 2.4.2时间设置模块 该模块的位置靠前,主要是实现对四个方向通行时间的设置,其设置的结果,最为此后模块的输入,故置于前端。该模块根据时间设置拨动开关的情况,采用累加计数方式设定通行时间,为了便于置数,采用十位、个位分别置数的方式,即十位和个位在设置拨动开关有效时,按照从0到9的顺序累加,
15、到9又返0。每次先读取十位是否需要置数,如果需要,开始进行十位的置- 5 - 电子技术课程设计报告 数累加;如果没有十位置数请求,则读取个位置数开关信号,开始个位置数累加。注意:不能同时对两位进行置数,这在实际中也避免了操作错误的出现。关于置数累加所需的CP信号,可以采用高于1Hz的时钟信号,这样可以提高置数效率;但是我在实际操作调试的过程中发觉,由于拨动开关没有去抖功能,如果CP信号的频率过快,容易产生错误的时间跳变,增加了控制的准确性,反而影响了设置时间的效率,于是我仍旧采用了1Hz的CP信号作为该模块的时钟信号输入。为了防止在正常运行情况下没有显示设置时间就可以通过拨动开关进行置数,这里
16、设置了模式信号,即只能在数码管显示为设置时间的时候,才能通过拨动开关进行置数操作,否则开关操作无效。 2.4.3状态转换模块 该模块是控制器的核心部分,但是原理其实很简单,只是输入输出量很多,获取的信息多,处理后输出的信息也多。前文已说明了状态转换的思想是该控制器实现的主要思路,那么如何处理好这么多输入输出的关系就成为了重点需要解决的问题了。 输入部分的关键是四向设定通行时间的传入,这可以从时间设置模块的输出获取。这四个设定时间传入的时间需要选择好,即选择恰当的时机读取新的设置通行时间,因为设置时间的操作可能发生在任何运行时间,如果不能选择很好的时机来读入新的设置通行时间,可能造成逻辑上的混乱
17、,致使状态不能按照正常的顺序进行转移,也给实际的交通信号控制造成了一定的影响。在这里,我选取了在每个状态运行结束的同时来读取新的设置通行时间,这样在任意状态时刻设置时间,将会在下一个状态到来时切换到新的通行时间上去运行,一方面不会使设置的效果延时太长,另一方面也不会出现如果恰巧在该方向上设置时间,那么该方向可能一直显示通行而不能正常转换状态的逻辑错误。 输出部分的关键是四个方向的EN使能信号和通行倒计时时间。根据所在的状态,可以对四个方向的EN使能信号进行赋值输出,用于控制信号灯显示和LCD同步状态显示等。通行时间倒计时是为了数码管能够显示出通行剩余时间和等待通行时间,这个显示的方式在前文也有
18、描述,这里不再赘述。通行剩余时间就是状态转换过程所依据的倒计时时间,在状态转换中需要根据各向通行时间在每个通行状态进行减计数倒计时,当计数到01时切换状态,而这个倒计时的时间正好是该方向通行的剩余时间,输出后经过显示方式的逻辑处理,就可以变成其它禁止方向的等待通行时间了。 2.4.4时间显示模块 基于前文描述的显示方式,该功能模块实现的就是显示该方向通行剩余时间,其它三个方向等待通行的时间以及设置时间模式下四个方向的通行时间。可以看出,在只有四组数码管的前提下,只能通过增加一个模式开关来区分显示的是运行时间还是设置时间。 该模块的难点就是在逻辑上,在下文的整体电路图中会发现,此部分的连线较为复
19、杂,如图2所示,在过程中需要传递和获取很多个时间,有正在通行方向的剩余时间,这个可以从状态转换模块之间获取,有该方向和正在通行方向之间的所有状态的通行时间之和。为了模块化,我并没有做大范围的集成,而是把这个逻辑体现在了电路的连接上面,虽然看起来有些繁杂,但是却能比较直观的显示出其中的逻辑关系,即是如何累加的,这样在逻辑出错时,便于纠错。在等待通行时- 6 - 电子技术课程设计报告 间的累加上,采用了依次传值的方式,按照状态顺序的高低,从上往下依次传送自己的等待通行时间,高位状态传送给低位状态自己需要等待的时间和该高位状态通行时间,低位状态将这两个时间求和后得到该低位状态的等待通行时间。如果高位
20、状态正在通行,则将该高位状态通行的剩余时间传送给其下的低位状态,该低位状态直接将该剩余时间作为自己的等待通行时间显示出来。 2.4.5 LED信号灯显示模块 该功能模块就是实现用LED灯模拟交通信号灯的显示,根据题目要求设置红灯和绿灯,绿灯在倒数5s开始闪烁。DE2教学开发板上面的LED灯是共阳极的,所以给低电平就能点亮相应的灯。为了实现绿灯闪烁的效果,可以在倒计时5s时开始对绿灯的EN使能信号进行自取反,使用2Hz的CP信号就能实现较好的闪烁效果了。 这里说明一下没有增加黄灯显示的原因,虽然黄灯在实际的交通灯中使用较广泛,但是黄灯显示的时间很短暂,却要在各方向各增加一个状态,这就给倒计时显示
21、增加了难度。我在网上看到过一个有黄灯的视频展示,它就是出现了黄灯也要倒计时的情况,感觉实用性不大,反而容易造成视觉上的困扰,因为黄灯的时间太短了。鉴于我没有充分考虑好解决的方案,所以暂时没有增加黄灯的显示功能。 2.4.6 LCD同步显示模块 该功能模块实现的就是用LCD屏显示当前的交通灯运行状态,在LCD屏上显示字符“”表示允许左转,“”表示允许直行,“”表示禁止通行,用“M”和“B”来区分主、次干道,采用ASCII码的编码方式显示相应字符。 该模块建立在DE2底层模块的基础上,由于其显示和刷新的原理比较复杂,我也花费了很长的时间慢慢去看懂这些底层的代码。在这个过程中我遇到的最大困难就是如何
22、实现刷新,既然要同步显示通行的状态,肯定要根据EN使能信号来选择在LCD屏上显示什么样的字符表示相应的状态。可是底层函数的调用只能显示一次字符,即不能刷新,这样一来就无法完成设计目的了。于是我在底层函数中慢慢测试,看看哪些语句可以控制实现刷新功能,尝试了很多种方式,终于在LCD_TEST中找到了可以实现刷新的地方,其实原理很简单,就是在每次读取完整屏信息后,读取位置地址归零,在下个读取信号到来时再次进行读取字符进行显示。 2.4.7数码管显示模块 该功能模块同样建立在DE2底层函数调用基础上,实现四组8个数码管的时间显示。根据DE2教学开发板上数码管的七段编码规则,将输入时间的8位BCD码转换
23、为七段码显示出来,我根据实际需要修改了底层函数,使得调用更加方便和集成化。 根据数码管七段的位置进行编码,每个段位的管子仍然是共阳极的,所以高电平实现熄灭管子,低电平实现点亮管子。小数点在物理上没有连接,所以无法使用。 图5 七段数码管的原理图和每段的标识位置 - 7 - 电子技术课程设计报告 该功能在实现上,只要有输入就会有相应的输出,所以原理上比较简单,只要编码正确不会出现问题,所以不再赘述。 2.5模块描述 2.5.1分频模块 DividedFrequency_50MHzInnCR_1HzOut_2HzOutinstinput _50MHzIn,nCR; output _1HzOut,_
24、2HzOut; /输入50MHz的晶振时钟信号,暂停时钟信号 /输出1Hz和2Hz的CP信号 2.5.2时间设置模块 SetMainTimenCRCPHSetLSetKeyinst1Time7.0PaV00Uninput nCR,CP,HSet,LSet,Key; /输入复位,时钟,十位、个位设置,设置模式 output Time; /输出设置后的通行时间 说明:该功能模块共有4个,用于分别设置初始的四项通行时间,给出的图示是设置主干道直行通行时间的例子,由于功能结构类似,不再列举其他3个模块。 - 8 - 电子技术课程设计报告 2.5.3状态转换模块 TimeSetCPnCRMainTime
25、7.0MainLeftTime7.0BranchTime7.0BranchLeftTime7.0MainENMainLeftENBranchENBranchLeftENTimeCur7.0inst8input CP,nCR; /时钟,复位信号输入 input 7:0MainTime,MainLeftTime,BranchTime,BranchLeftTime; 时间输入 output MainEN,MainLeftEN,BranchEN,BranchLeftEN,TimeCur; 信号输出 /各向设置/各向使能2.5.4时间显示模块 TimeShowENTimeCur7.0TimeIn7.0T
26、ime7.0Keyinst10TimeOut7.0TimeShow7.0input EN,Key; /输入各向使能信号,设置模式 input 7:0TimeCur,Time,TimeIn; /输入剩余时间,高位状态剩余时间,等待时间 output TimeOut,TimeShow; /输出等待时间,数码管显示时间 2.5.5 LED信号灯显示模块 TrafficLight_4TimeCur7.0CPMainENMainLeftENBranchENBranchLeftENLightRedMainLightGreenMainLightRedBranchLightGreenBranchLightRe
27、dMainLLightGreenMainLLightRedBranchLLightGreenBranchLinst15- 9 - 电子技术课程设计报告 input 7:0TimeCur; /输入通行剩余时间 input CP,MainEN,MainLeftEN,BranchEN,BranchLeftEN; /输入时钟,各向使能信号 output LightRedMain,LightGreenMain,LightRedBranch,LightGreenBranch,LightRedMainL,LightGreenMainL,LightRedBranchL,LightGreenBranchL; /
28、输出8个LED信号灯信号 2.5.6 LCD同步显示模块 LCD_ShowMainENMainLeftENBranchENBranchLeftENCLOCK_50LCD_ONLCD_BLONLCD_RWLCD_ENLCD_RSLCD_DATA7.0inst6input 信号 input / inout 7:0 output output output 1 = Read output output Command, 1 = Data MainEN,MainLeftEN,BranchEN,BranchLeftEN; CLOCK_50; LCD Module 16X2 LCD_DATA; LCD_O
29、N; LCD_BLON; LCD_RW; LCD_EN; LCD_RS; /输入各向使能 /输入50 MHz时钟信号 / / LCD Data bus 8 bits / LCD Power ON/OFF / LCD Back Light ON/OFF / LCD Read/Write Select, 0 = Write, / LCD Enable / LCD Command/Data Select, 0 = 2.6.7数码管显示模块 SEG7_LUT_2iDIG7.0oSEG06.0oSEG16.0inst20input 7:0 output 6:0 iDIG; oSEG0,oSEG1; /8
30、位时间BCD码输入 /转换成2个数码管输出- 10 - 电子技术课程设计报告 2.6整体电路图 将上面设计的各功能模块依据逻辑思路,结合输入输出设计搭建成如下图所示的整体电路图。 说明:由于原电路图较大,在文档中只能缩小显示,电子档报告可以选择显示比例在250%以上来查看细节。 原图参见附件中的.bdf文件。TimeShowSEG7_LUT_2ENTimeCur7.0TimeIn7.0Time7.0SW2INPUTVCCTimeOut7.0TimeShow7.0iDIG7.0oSEG06.0oSEG16.0OUTPUTOUTPUTHEX46.0HEX56.0KeyDividedFrequenc
31、yinst10_1HzOut_2HzOutSetMainTimenCRinst5CPHSetLSetTime7.0PIN_P25CLOCK_50INPUTVCCINPUTVCCinst18SEG7_LUT_2iDIG7.0oSEG06.0oSEG16.0OUTPUTOUTPUT_50MHzInnCRPIN_N2PIN_N25SW0HEX66.0HEX76.0ParameterValueTypeDTime00110000Unsigned BinaryTimeShowENTimeCur7.0TimeIn7.0TimeOut7.0TimeShow7.0inst19SEG7_LUT_2iDIG7.0o
32、SEG06.0oSEG16.0OUTPUTOUTPUTSW1INPUTVCCKeyinst1HEX06.0HEX16.0PIN_N26SetMainLeftTimeSW14INPUTVCCINPUTVCCParameterValueTypeMainDTime00000000Unsigned BinaryTime7.0Keyinst11inst20SEG7_LUT_2iDIG7.0oSEG06.0oSEG16.0OUTPUTOUTPUTnCRCPHSetLSetKeyinst2Time7.0PIN_U3SW13PIN_T7PIN_V2PIN_V1ParameterValueTypeDTime00
33、010000Unsigned BinaryTimeSetCPnCRMainTime7.0MainLeftTime7.0BranchTime7.0BranchLeftTime7.0MainENMainLeftENBranchENBranchLeftENTimeCur7.0ENTimeCur7.0TimeIn7.0Time7.0inst8Keyinst12TimeOut7.0TimeShow7.0TimeShowinst21HEX26.0SW17SW16SW8SW7SW10SW9INPUTVCCINPUTVCCINPUTVCCINPUTVCCINPUTVCCINPUTVCCHEX36.0SetBr
34、anchTimenCRCPHSetLSetKeyinst3Time7.0PIN_B13PIN_C13PIN_N1ParameterValueTypeDTime00100000Unsigned BinaryTrafficLight_4TimeCur7.0CPMainENMainLeftENBranchENBranchLeftENLightRedMainLightGreenMainLightRedBranchLightGreenBranchLightRedMainLLightGreenMainLLightRedBranchLTimeOut7.0TimeShow7.0OUTPUTOUTPUTOUTP
35、UTPIN_U9PIN_U1PIN_T2PIN_U2PIN_P6PIN_T4PIN_P7PIN_R7PIN_T9PIN_R6PIN_R5PIN_T3PIN_R4PIN_R2PIN_R3PIN_P4PIN_L3PIN_P3PIN_L2PIN_M2PIN_L9PIN_M3PIN_L6PIN_M5PIN_L7PIN_M4PIN_P9PIN_AF10PIN_N9PIN_AB12PIN_V20PIN_AC12PIN_V21PIN_AD11PIN_W21PIN_AE11PIN_Y22PIN_V14PIN_AA24PIN_V13PIN_AA23PIN_AB23PIN_AB24PIN_V22PIN_Y23PIN_AC25PIN_AA25PIN_AC26PIN_AA26PIN_AB26PIN_Y26PIN_AB25PIN_Y25PIN_Y24PIN_U22PIN_W24LEDR14LEDR13LEDR