当前位置:文档之家› 基于FPGA的交通灯控制器设计报告

基于FPGA的交通灯控制器设计报告

********大学

*******学年第二学期

电子技术基础课程设计——交通灯控制器

院系:***

学号:***

姓名:***

专业:***

指导老师: ***

目录

目录 .................................................................................................................................... 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.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整体电路图 (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)

第1章绪论

1.1课程设计背景

经过两个学期的电子线路设计测试实验,我们从基础的模电、数电典型电路的设计和实现做起,从PSpice和MAXⅡ的设计与仿真,到面包板搭建电路的实践与测试,在不断的学习和积累中,了解了电子技术设计的基本过程和基础知识。在本学期,我们迎来了电子技术课程设计,这是一次将理论付诸实践的宝贵机会,是提升我们运用电子技术设计手段实现实际问题的能力的良好机遇。

在选题阶段,我踌躇满志的和另一个同学选择了SD卡音乐播放器这个选做题,但是由于没有足够地去深入了解相关的技术问题,致使在开题时没有通过曾老师的验收,只能十分遗憾的选择了基础题,改做交通灯控制器了。虽然有些遗憾,因为当初觉得自己有能力完成那样一个选做题,但是这也给了我一个深刻的教训,在机遇和挑战面前,再有信心也要做好充足的准备来证明你的实力。另一方面给我的启示就是,尽管一个相同的题目前人做了很多工作,给我们提供了一个很好的平台,但是如果我们只是去读懂和使用它们,仅限在这样一个层次是远远不够了,要学会从前人的研究成果中寻找新的突破点,利用自己已掌握的知识或者所具备的能力,在原有的基础上实现更加丰富的功能,这才应该是我们做课程设计的最终目的。仅仅看懂别人的设计思路和代码并不是能力的体现,而真正锻炼我们能力的是在充分掌握前人设计手段的基础上,融会贯通地使原有的设计更加结合实际,更加完善。

尽管没能做成选做题,但我对于这个交通灯控制器的设计还是兴趣十足。毕竟我们是控制系的学生,在不久前也学习过利用PLC控制器实现智能交通灯的方法,感觉这个题目上手应该比较快。加上前两个学期的积累,譬如数字钟的设计,就已经用到了分频、计数等等功能的设计模块,将它们移植过来加以改善,应该能够实现题目要求的基本功能了。

之后我查阅了一些相关设计论文,发现大多数基于FPGA利用Verilog进行设计的交通灯控制器的原理都是状态转换,于是该题目设计的主题思想——基于状态转换,就这样确定了。

1.2课程设计题目

设计一个十字路口交通信号灯的控制电路。要求红、绿灯按照一定的要求亮和灭,并在亮灯期间进行倒计时,且将运行时间用数码管显示出来。

要求主干道每次通行时间为T X秒,支干道每次通行时间为T Y秒。每次变换运行车道前绿灯闪烁,持续时间为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时钟信号分频,转换为可利用的1Hz CP信号,同时为了实现绿灯在1s内闪烁一次,再转换出一个2Hz的CP信号提供给需要闪烁的绿灯。然后是设置时间的功能模块,通过开关可以分别设置四个方向的运行时间,并将设置的时间传送到状态转换模块中。在状态转换功能模块中,通过前面传送来的设定通行时间进行倒计时和转换状态,并输出当前方向通行剩余时间和四向使能EN信号。在时间显示功能模块中,接收到前面的设置时间、剩余时间、使能信号,运用前面说明的现实方式的逻辑,计算出等待时间,在该向通行时显示剩余时间,在该向等待时显示等待时间,最终将时间信号输出到数码管显示模块;另外,由于数码管数量的限制,只能一次性显示8个(即四组),那么究竟是显示倒计时还是显示设置时间就需要一个开关信号来区分,于是设置一个输入信号来判别是否进入设置模式,并且只能在设置模式下设置时间。LED信号灯显示功能模块则将状态转换模块输出的EN使能信号和2Hz的CP信号以及当前剩余时间作为输入,根据状态点亮相应的LED信号灯。LCD显示功能模块的原理和LED信号灯显示模块类似,也是根据同步状态EN使能信号,通过刷新字符的方式,改变和显示当前通行状态。最后,数码管显示功能模块是结合DE2教学开发板数码管的编码规则将BCD 码转换为七段码,在译码后显示出来。

图3 系统框图

分频 1Hz/2Hz

四向时间设置状态转换

时间显示

LED信号灯显示

数码管显示LCD显示

设定时间

运行时间EN使能信号

CP信号

上图所示的系统框图只是大致说明系统的框架和流程,没有具体到每个模块的输入和输出,在前面的文字描述中有所说明,更加详细的设计说明将在后面模块功能说明的详细介绍。

2.3输入输出设计

根据功能需要,输入设计采用拨动开关,共10个。其中,设置四向时间用8个,另外两个分别用于暂停和复位,即分频的nCR和状态装换的nCR输入。时钟信号输入为50MHz的时钟频率振荡器。(在这里补充说明一点,DE2教学开发板的按键弹起为高电平,按下为低电平,我在实验中发现不适合作为设置开关,所以没有采用;其实拨动开关更能在测试时较好地显示状态和反应问题,便于寻找错误点。)输入设计采用8个数码管用于显示倒计时,8个LED灯作为交通信号灯,LCD 屏同步显示运行状态。

图4 输入输出设计

2.4模块设计过程 2.4.1分频模块

该模块实现的是对50MHz 晶振时钟信号的分频功能,采用传统的“一半就翻转”的计数技巧,这一功能在很多资料上都能查找到相关代码,就不再赘述。为了实现绿灯在1s 内闪烁一次,需要一个2Hz 的CP 信号,这里一次性产生两种信号:1Hz 和2Hz ,便于之后模块的使用。2Hz 的CP 信号产生实际就是在1Hz 分频的基础上,改变每次移位的位数,使每次移位为1Hz 的两倍,这样产生信号的周期就缩短了一倍,自然形成了2Hz 的CP 信号。

2.4.2时间设置模块

该模块的位置靠前,主要是实现对四个方向通行时间的设置,其设置的结果,最为此后模块的输入,故置于前端。该模块根据时间设置拨动开关的情况,采用累加计数方式设定通行时间,为了便于置数,采用十位、个位分别置数的方式,即十位和个位在设置拨动开关有效时,按照从0到9的顺序累加,到9又返0(当然与程序中设置的初始时间有关)。每次先读取十位是否需要置数,如果需要,开始进行十位的置

50MHz 晶振

LCD 屏显示 数码管显示

时间设置开关

暂停/复位/模式开关

LED 信号灯

数累加;如果没有十位置数请求,则读取个位置数开关信号,开始个位置数累加。注意:不能同时对两位进行置数,这在实际中也避免了操作错误的出现。关于置数累加所需的CP信号,可以采用高于1Hz的时钟信号,这样可以提高置数效率;但是我在实际操作调试的过程中发觉,由于拨动开关没有去抖功能,如果CP信号的频率过快,容易产生错误的时间跳变,增加了控制的准确性,反而影响了设置时间的效率,于是我仍旧采用了1Hz的CP信号作为该模块的时钟信号输入。为了防止在正常运行情况下没有显示设置时间就可以通过拨动开关进行置数,这里设置了模式信号,即只能在数码管显示为设置时间的时候,才能通过拨动开关进行置数操作,否则开关操作无效。

2.4.3状态转换模块

该模块是控制器的核心部分,但是原理其实很简单,只是输入输出量很多,获取的信息多,处理后输出的信息也多。前文已说明了状态转换的思想是该控制器实现的主要思路,那么如何处理好这么多输入输出的关系就成为了重点需要解决的问题了。

输入部分的关键是四向设定通行时间的传入,这可以从时间设置模块的输出获取。这四个设定时间传入的时间需要选择好,即选择恰当的时机读取新的设置通行时间,因为设置时间的操作可能发生在任何运行时间,如果不能选择很好的时机来读入新的设置通行时间,可能造成逻辑上的混乱,致使状态不能按照正常的顺序进行转移,也给实际的交通信号控制造成了一定的影响。在这里,我选取了在每个状态运行结束的同时来读取新的设置通行时间,这样在任意状态时刻设置时间,将会在下一个状态到来时切换到新的通行时间上去运行,一方面不会使设置的效果延时太长,另一方面也不会出现如果恰巧在该方向上设置时间,那么该方向可能一直显示通行而不能正常转换状态的逻辑错误。

输出部分的关键是四个方向的EN使能信号和通行倒计时时间。根据所在的状态,可以对四个方向的EN使能信号进行赋值输出,用于控制信号灯显示和LCD同步状态显示等。通行时间倒计时是为了数码管能够显示出通行剩余时间和等待通行时间,这个显示的方式在前文也有描述,这里不再赘述。通行剩余时间就是状态转换过程所依据的倒计时时间,在状态转换中需要根据各向通行时间在每个通行状态进行减计数倒计时,当计数到01时切换状态,而这个倒计时的时间正好是该方向通行的剩余时间,输出后经过显示方式的逻辑处理,就可以变成其它禁止方向的等待通行时间了。

2.4.4时间显示模块

基于前文描述的显示方式,该功能模块实现的就是显示该方向通行剩余时间,其它三个方向等待通行的时间以及设置时间模式下四个方向的通行时间。可以看出,在只有四组数码管的前提下,只能通过增加一个模式开关来区分显示的是运行时间还是设置时间。

该模块的难点就是在逻辑上,在下文的整体电路图中会发现,此部分的连线较为复杂,如图2所示,在过程中需要传递和获取很多个时间,有正在通行方向的剩余时间,这个可以从状态转换模块之间获取,有该方向和正在通行方向之间的所有状态的通行时间之和(即等待通行时间)。为了模块化,我并没有做大范围的集成,而是把这个逻辑体现在了电路的连接上面,虽然看起来有些繁杂,但是却能比较直观的显示出其中的逻辑关系,即是如何累加的,这样在逻辑出错时,便于纠错。在等待通行时

间的累加上,采用了依次传值的方式,按照状态顺序的高低,从上往下依次传送自己的等待通行时间,高位状态传送给低位状态自己需要等待的时间和该高位状态通行时间,低位状态将这两个时间求和后得到该低位状态的等待通行时间。如果高位状态正在通行,则将该高位状态通行的剩余时间传送给其下的低位状态,该低位状态直接将该剩余时间作为自己的等待通行时间显示出来。

2.4.5 LED信号灯显示模块

该功能模块就是实现用LED灯模拟交通信号灯的显示,根据题目要求设置红灯和绿灯,绿灯在倒数5s开始闪烁。DE2教学开发板上面的LED灯是共阳极的,所以给低电平就能点亮相应的灯。为了实现绿灯闪烁的效果,可以在倒计时5s时开始对绿灯的EN使能信号进行自取反,使用2Hz的CP信号就能实现较好的闪烁效果了。

这里说明一下没有增加黄灯显示的原因,虽然黄灯在实际的交通灯中使用较广泛,但是黄灯显示的时间很短暂,却要在各方向各增加一个状态,这就给倒计时显示增加了难度。我在网上看到过一个有黄灯的视频展示,它就是出现了黄灯也要倒计时的情况,感觉实用性不大,反而容易造成视觉上的困扰,因为黄灯的时间太短了。鉴于我没有充分考虑好解决的方案,所以暂时没有增加黄灯的显示功能。

2.4.6 LCD同步显示模块

该功能模块实现的就是用LCD屏显示当前的交通灯运行状态,在LCD屏上显示字符“<”表示允许左转,“∧”表示允许直行,“×”表示禁止通行,用“M”和“B”来区分主、次干道,采用ASCII码的编码方式显示相应字符。

该模块建立在DE2底层模块的基础上,由于其显示和刷新的原理比较复杂,我也花费了很长的时间慢慢去看懂这些底层的代码。在这个过程中我遇到的最大困难就是如何实现刷新,既然要同步显示通行的状态,肯定要根据EN使能信号来选择在LCD屏上显示什么样的字符表示相应的状态。可是底层函数的调用只能显示一次字符,即不能刷新,这样一来就无法完成设计目的了。于是我在底层函数中慢慢测试,看看哪些语句可以控制实现刷新功能,尝试了很多种方式,终于在LCD_TEST中找到了可以实现刷新的地方,其实原理很简单,就是在每次读取完整屏信息后,读取位置地址归零,在下个读取信号到来时再次进行读取字符进行显示。

2.4.7数码管显示模块

该功能模块同样建立在DE2底层函数调用基础上,实现四组8个数码管的时间显示。根据DE2教学开发板上数码管的七段编码规则,将输入时间的8位BCD码转换为七段码显示出来,我根据实际需要修改了底层函数,使得调用更加方便和集成化。

根据数码管七段的位置进行编码,每个段位的管子仍然是共阳极的,所以高电平实现熄灭管子,低电平实现点亮管子。小数点在物理上没有连接,所以无法使用。

图5 七段数码管的原理图和每段的标识位置

该功能在实现上,只要有输入就会有相应的输出,所以原理上比较简单,只要编码正确不会出现问题,所以不再赘述。

2.5模块描述 2.5.1分频模块

_50MHzIn nCR

_1HzOut _2HzOut

Div idedFrequency

inst

input _50MHzIn,nCR; //输入50MHz 的晶振时钟信号,暂停时钟信号 output _1HzOut,_2HzOut; //输出1Hz 和2Hz 的CP 信号

2.5.2时间设置模块

00

Un

Pa

V nCR CP HSet LSet Key Time[7..0]

SetMainTime

inst1

input nCR,CP,HSet,LSet,Key; //输入复位,时钟,十位、个位设置,设置模式 output Time; //输出设置后的通行时间

说明:该功能模块共有4个,用于分别设置初始的四项通行时间,给出的图示是设置主干道直行通行时间的例子,由于功能结构类似,不再列举其他3个模块。

2.5.3状态转换模块

CP

nCR

MainTime[7..0] MainLef tTime[7..0] BranchTime[7..0] BranchLef tTime[7..0]

MainEN MainLef tEN

BranchEN BranchLef tEN TimeCur[7..0]

TimeSet

inst8

input CP,nCR; //时钟,复位信号输入

input [7:0]MainTime,MainLeftTime,BranchTime,BranchLeftTime; //各向设置时间输入

output MainEN,MainLeftEN,BranchEN,BranchLeftEN,TimeCur; //各向使能信号输出

2.5.4时间显示模块

EN

TimeCur[7..0] TimeIn[7..0] Time[7..0] Key

TimeOut[7..0] TimeShow[7..0]

TimeShow

inst10

input EN,Key; //输入各向使能信号,设置模式

input [7:0]TimeCur,Time,TimeIn; //输入剩余时间,高位状态剩余时间,等待时间

output TimeOut,TimeShow; //输出等待时间,数码管显示时间

2.5.5 LED信号灯显示模块

TimeCur[7..0] CP

MainEN MainLef tEN BranchEN BranchLef tEN

LightRedMain

LightGreenMain

LightRedBranch LightGreenBranch

LightRedMainL LightGreenMainL

LightRedBranchL LightGreenBranchL

Traf f icLight_4 inst15

input [7:0]TimeCur; //输入通行剩余时间

input CP,MainEN,MainLeftEN,BranchEN,BranchLeftEN; //输入时钟,各向使能信号

output

LightRedMain,LightGreenMain,LightRedBranch,LightGreenBranch,LightRedMainL, LightGreenMainL,LightRedBranchL,LightGreenBranchL; //输出8个LED信号灯信号

2.5.6 LCD同步显示模块

MainEN MainLef tEN BranchEN BranchLef tEN CLOCK_50

LCD_ON

LCD_BLON

LCD_RW

LCD_EN

LCD_RS LCD_DATA[7..0]

LCD_Show

inst6

input MainEN,MainLeftEN,BranchEN,BranchLeftEN; //输入各向使能信号

input CLOCK_50; //输入50 MHz时钟信号

//////////////////// LCD Module 16X2 //////////////////////(LCD屏各控制量输出)

inout [7:0] LCD_DATA; // LCD Data bus 8 bits

output LCD_ON; // LCD Power ON/OFF

output LCD_BLON; // LCD Back Light ON/OFF

output LCD_RW; // LCD Read/Write Select, 0 = Write, 1 = Read

output LCD_EN; // LCD Enable

output LCD_RS; // LCD Command/Data Select, 0 = Command, 1 = Data

2.6.7数码管显示模块

iDIG[7..0]oSEG0[6..0]

oSEG1[6..0]

SEG7_LUT_2

inst20

input [7:0] iDIG; //8位时间BCD码输入

output [6:0] oSEG0,oSEG1; //转换成2个数码管输出

电子技术课程设计报告

- 11 -

2.6整体电路图

将上面设计的各功能模块依据逻辑思路,结合输入输出设计搭建成如下图所示的整体电路图。

说明:由于原电路图较大,在文档中只能缩小显示,电子档报告可以选择显示比例在250%以上来查看细节。 原图参见附件中的.bdf 文件。

PIN_N2VCC CLOCK_50

INPUT PIN_N25

VCC

SW[0]

INPUT PIN_C13VCC SW[7]INPUT PIN_A13

VCC

SW[9]

INPUT PIN_U3

VCC SW[14]

INPUT PIN_T7VCC

SW[13]

INPUT PIN_V2VCC SW[17]INPUT

PIN_V1

VCC SW[16]INPUT PIN_B13VCC SW[8]INPUT PIN_N1

VCC SW[10]INPUT PIN_N26

VCC

SW[1]

INPUT

PIN_P25

VCC

SW[2]

INPUT PIN_L4LCD_ON OUTPUT PIN_K2LCD_BLON OUTPUT PIN_K4LCD_RW OUTPUT PIN_K3LCD_EN OUTPUT PIN_K1LCD_RS

OUTPUT

PIN_J1PIN_J2PIN_H1PIN_H2PIN_J4PIN_J3PIN_H4PIN_H3

LCD_DATA[7..0]

OUTPUT PIN_AF13

LEDR[14]OUTPUT PIN_AE15LEDR[13]OUTPUT PIN_AA14LEDR[8]

OUTPUT

PIN_AC21LEDR[7]OUTPUT PIN_AD12LEDR[17]

OUTPUT PIN_AE12LEDR[16]OUTPUT PIN_AA13LEDR[10]OUTPUT PIN_Y13

LEDR[9]

OUTPUT

PIN_U9

PIN_U1PIN_U2PIN_T4PIN_R7PIN_R6PIN_T3HEX4[6..0]OUTPUT PIN_T2PIN_P6PIN_P7PIN_T9PIN_R5PIN_R4PIN_R3HEX5[6..0]

OUTPUT

PIN_R2PIN_P4PIN_P3PIN_M2PIN_M3PIN_M5PIN_M4HEX6[6..0]OUTPUT PIN_L3PIN_L2PIN_L9PIN_L6PIN_L7PIN_P9PIN_N9HEX7[6..0]

OUTPUT

PIN_AF10PIN_AB12PIN_AC12PIN_AD11PIN_AE11PIN_V14PIN_V13HEX0[6..0]OUTPUT PIN_V20PIN_V21PIN_W21PIN_Y22PIN_AA24PIN_AA23PIN_AB24HEX1[6..0]

OUTPUT

PIN_AB23PIN_V22PIN_AC25PIN_AC26PIN_AB26PIN_AB25PIN_Y24HEX2[6..0]

OUTPUT PIN_Y23PIN_AA25PIN_AA26PIN_Y26PIN_Y25PIN_U22PIN_W24

HEX3[6..0]

OUTPUT

iDIG[7..0]

oSEG0[6..0]oSEG1[6..0]

SEG7_LUT_2

inst18iDIG[7..0]

oSEG0[6..0]oSEG1[6..0]

SEG7_LUT_2

inst19

iDIG[7..0]

oSEG0[6..0]oSEG1[6..0]

SEG7_LUT_2

inst20iDIG[7..0]

oSEG0[6..0]oSEG1[6..0]

SEG7_LUT_2

inst21

EN

TimeCur[7..0]TimeIn[7..0]Time[7..0]

Key

TimeOut[7..0]TimeShow[7..0]

TimeShow

inst10

EN

TimeCur[7..0]TimeIn[7..0]

Time[7..0]Key TimeOut[7..0]TimeShow[7..0]

TimeShow

inst11

EN

TimeCur[7..0]TimeIn[7..0]Time[7..0]

Key TimeOut[7..0]TimeShow[7..0]

TimeShow

inst12

EN

TimeCur[7..0]TimeIn[7..0]Time[7..0]Key TimeOut[7..0]TimeShow[7..0]

TimeShow

inst13

TimeCur[7..0]CP MainEN MainLef tEN BranchEN BranchLef tEN

LightRedMain LightGreenMain LightRedBranch LightGreenBranch

LightRedMainL LightGreenMainL LightRedBranchL

LightGreenBranchL

Traf f icLight_4

inst15

MainEN MainLef tEN BranchEN BranchLef tEN CLOCK_50

LCD_ON LCD_BLON LCD_RW LCD_EN LCD_RS

LCD_DATA[7..0]

LCD_Show

inst6

MainDTime 00000000Unsigned Binary

Parameter Value Type

CP nCR

MainTime[7..0]MainLef tTime[7..0]BranchTime[7..0]BranchLef tTime[7..0]

MainEN MainLef tEN BranchEN BranchLef tEN TimeCur[7..0]

TimeSet

inst8

DTime 00010000Unsigned Binary

Parameter Value Type nCR CP HSet LSet Key Time[7..0]

SetMainLef tTime

inst2

DTime 00010000Unsigned Binary

Parameter Value Type nCR CP HSet LSet Key Time[7..0]

SetBranchLef tTime

inst4

DTime 00100000Unsigned Binary

Parameter Value Type nCR CP HSet LSet Key Time[7..0]

SetBranchTime

inst3

DTime 00110000Unsigned Binary

Parameter Value Type nCR

CP HSet LSet

Key Time[7..0]

SetMainTime

inst1

_50MHzIn nCR

_1HzOut _2HzOut

Div idedFrequency

inst5

第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.4 LCD屏显示功能

由于LCD屏显示需要50MHz的时钟信号,仿真时间较长,故没有把所有情况全部仿真出来,只以下图为例。

为了更好的展示我所做的各项功能,包括很多未能在仿真中演示的,我特地制作了一段3m左右的视频。

附:功能展示视频- DE2交通灯.flv

第4章实验总结

4.1心得体会

看着手边不断变换的交通信号灯以及倒计时显示的数码管,回顾这5周以来为课设所做的所有努力,感慨良多。只有亲身去努力尝试,才回收获真正的知识和能力。为了找到切合实际的解决方案,我采用实地调查和网络搜集;为了寻找可能存在的BUG,我反复测试下载后的DE2板子,尽量穷尽各种可能出现的特殊情况,发现问题及时修改。值得欣慰的是,所有的努力没有白费,到目前为止所做出的成果还是比较令我满意的。

在这里,要感谢曾喻江老师的教诲,感谢学校开设这门课程设计,给我们了一次充分锻炼,将理论知识付诸实践的机会。书上的知识再多,都是死的,即使你完全记住,也无法在实际使用中游刃有余地去利用它们,不能让知识为我所用。同时,在解决问题的时候,会发现自己依旧欠缺的知识,需要我们耐心地去查阅资料,不断补充新的领域的知识。这样的一种锻炼,可以帮助我们形成一种习惯,在今后工作学习中,自然地去运用相同的方法解决不同的问题。

很多同学说,本科期间做项目找实习的机会太少,其实他们忽略了像课程设计这样的宝贵机会。大学三年,我们学习了很多工程技术的知识,但却经常性的忽视在这些课程中的课程设计这个关键环节,认为它们只不过是走过场,抄抄代码,写写报告就够了。其实不然,课程设计本身就是一次做项目的经历,它要求你严格按照项目规程操作,在时间和进度上,都要有项目意识。曾老师在课程开始的第一节课,就花了大量的时间讲述项目的做法,但是当时很多同学并没有在意,包括我。虽然我学习过信息系统等软件开发的流程和方法,但是与实际运用严重脱节,没有那种清晰而强烈的工程思想,而是沿用做一步看一步的原始想法。这也直接导致了我在当初选择选做题开题失利的结果,现在想来,就是因为选定题目后,没有做足够充分的可行性研究和系统概要设计,没有明确自己到底可以实现哪些功能,哪些功能可能还有困难。在开题说明的时候,我们被曾老师的几个问题打住了,说实话,当时我们心里很不服气,很多选择相同题目的同学其实并没有太多的去进行可行性研究,只是一味的夸大自己的功能,但是我们自己也确实没有底气,因为毕竟没有仔细地去论证每个功能实现的可能性和存在的难点。虽然现在我选择了基础题,但是我并不遗憾,因为我可以在较低的层次进行扩展,这倒也给我提供了一个较大的发挥空间,使得我有可以突破的地方,也是不错的锻炼机会。

下面谈谈我在其他方面的几点心得:

(1)做事不能眼高手低。就像我们在选择选做题的时候,虽然可以找到现成的代码,感觉应该不会太难,但是仅仅靠感觉是做不成事的,只有耐心细致

地去深入研究,进行充分论证,才能得出准确可靠的结果。尽管有现成的代

码,但最终能不能为我所用还要靠认真的研读,充分体会编程的思想,这样

别人的代码才能转化为自己的。

(2)要有工程的进度安排。对于时间的规划其实是我们最欠缺的,记得在软件开发的课程中学到过利用甘特图来划定开发进度,但是实际中我们却完全

没有按照它来实现。每次课程设计,大部分同学都是最后一段时间拼命赶,

在验收的前几天还在通宵写代码。以前我也是这样,不过这次有所改善了,

因为我大致规划了设计、实现和调试的时间,使得其他同学还在写程序进行

仿真的时候,我已经开始了逐步的下载测试和修改完善工作,这为我在功能

方面的完善提供了宝贵的时间。

(3)要敢于有所突破。DE2开发板上18个红色LED和8个绿色LDE灯分别各在一边,这样在信号灯的实现效果上就不那么理想了,于是我就想到了用

LCD屏来同步显示交通信号灯的指示状态。DE2底层的LCD显示程序虽然

较为完善,但是并不能满足我的设计要求,为了实现刷新的功能,我想了一

个晚上,做了很多仿真和测试工作。躺在床上,脑海里还是想着第二天早起

要做的哪几步测试,期间想过放弃,但是如果放弃了,就没有突破。终于在

第二天早上我找到了可以增加刷新的地方,当时真是万分高兴。

(4)要善于借鉴别人的想法。很多时候自己独立思考可以充分锻炼能力,但是汲取他人之所长会对自己的工作产生事倍功半的效果。但是借鉴要有限

度,要讲究方式方法。很多同学容易走两个极端,一种是埋头编程,中途遇

到很多困难其实前人也都遇到并且很好地解决了,但是他们还要继续重复地

探寻解决途径;另一种是照单全收,完全不明白作者的用意和初衷,只知道

看结果对就拿来用,没弄明白其所以然,显然是荒废了学习的机会。

(5)只有耐心调试才能更加完美。很多知名的程序在正式发布之前都会有α、β等测试版本,为的就是在反复的试验中发现那些程序员无法发现的小

BUG。在我将主体程序调试正常,下载到DE2板子上之后,花了两个晚上

的时间测试各种功能是否存在BUG。最后发现了设置时间开关的有效性问

题,和如果等待通行时间累加后超过两位数的问题。这些问题解决起来其实

并不难,增加一些语句进行适当的约束就可以避免了,但是在编程或者是仿

真的过程中,确实很难发现这样的问题,只有在实践之后的不断耐心测试,

才能让一个工程不断地趋于完美。

4.2待改进的问题

前文提到的没有增加黄灯的问题,确实是需要进一步思考,寻求改进方案的地方。另外从实现效果来看,LCD屏刷新的频率调节的不是很合适,造成了总是在闪的现象,应该修改为只在状态转换时刷新一次,而不是现在的每隔一定的时间自动刷新。

4.3结束语

历时5周的电子技术基础课程设计就这样结束了,在这里要感谢曾喻江老师,是您的严格要求才让我们明白了很多,真正学到了很多。还有很多同学给我提出的宝贵建议和帮助,没有他们我可能会走很多弯路。

最后祝愿曾老师在自己的教学和研究领域有更大的突破和成就,祝愿我们08级控制系的同学们都有美好的前程!

相关主题
文本预览
相关文档 最新文档