文档库 最新最全的文档下载
当前位置:文档库 › verilog交通灯设计与实现

verilog交通灯设计与实现

verilog交通灯设计与实现
verilog交通灯设计与实现

西北工业大学

《FPGA技术实验》

实验报告五

(交通灯控制系统)

学院:软件与微电子学院

学号:

姓名:

专业:微电子学

实验时间:

实验地点:毅字楼335 指导教师:王少熙

西北工业大学

2011年11月

时候,给使能端enable 赋值0;由于用的BCD码,高四位和低四位就分别是我们要在译码模块的要用数码管显示的十位和个位。

译码模块:

此模块主要有两个作用,控制黄灯闪烁以及对倒计时时间进行译码输出。

首先是控制黄灯闪烁。由于控制模块只是控制三个灯的亮与不亮,在此模块中首先是相当于产生一个分频时钟y_flicker(周期1s),然后是控制黄灯的闪烁,控制模块light_select只是控制了三个灯亮与不亮(三位二进制,高电平有效),最后显示灯的亮或者闪还用三位二进制表示(colour),控制时直接把light_select 的最高位和最低位直接赋给colour的最高位和最低位(分别控制绿灯和红灯的亮),中间位当分频时钟y_flicker为高且输入light_select为高时,输出colour 才为高(黄灯亮),别的情况colour中间位都为低(黄灯灭),至此可以完美实现黄灯的闪烁了(1s内亮灭),也就可以实现要求的各个灯的亮或者闪烁。

然后就是七段译码的过程。采用了3—8译码器的设计原理,将倒计时时间译码,输出到LED晶体管,显示最终倒计时时间。LED中二极管对应的顺序编号如图1所示,并且是低电平有效。写出所有数字对应的字型码,就可以知道数字的控制电平。由于只有两位数字,考虑到成本以及复杂性,可不用扫描,直接用两个译码器就可以了。

图1 七段数码管显示字段的示意图

2.总体设计框图及详细说明

程序总体设计框图如图2所示。

图2 程序总体设计框图

下面将对所做的系统框图进行详尽说明:

首先,输入的50MHz的系统时钟和全局控制端reset ,输出为个位数字的七段译码,十位数字七段译码以及各个灯最后状态。

然后由于系统时钟频率很大,第一要进行分频,使其成为1Hz的时钟信号,第二利用分频后的时钟信号对电路进行控制,开始先对状态跳转进行控制,正如1问所述,用case 语句控制三灯亮与灭,紧跟着进行倒计时的过程,第三输出个位和十位上的数即可,要显示倒计时是很容易实现的,直接用两个七段译码即可。

最后要控制黄灯的闪烁,还是要先产生分频时钟,作为控制端,控制模块各灯亮与灭作为输入,即可产生黄灯闪烁的效果。

另外,作为全局控制端,reset 信号是清零用的,在有时钟信号的地方就有reset 。

3.时序说明

假设在0时刻,加上系统时钟,首先要进行reset清零,这时在控制模块的计数器会清零,三个灯都是灭的状态,控制状态跳转的使能端enable等于0,等待着清零结束,开始工作;七段译码也不会显示。

在reset变低之后,系统开始正常工作。首先是分频时钟开始工作,在计数器达到第一个之前,分频时钟都是低电位,到的时候分频时钟的第一个上升沿来临,此时状态控制开始运转,先工作的是绿灯,它会经过从59到0的倒计时过程,同时译码模块也开始工作,颜色控制colour是100,表征绿灯的点亮,经七段译码,这个倒计时数字也会同步显示出来。经过60s(也就是经过60*50M个系统时钟上升沿之后)绿灯亮的时间到,会自动转到黄灯状态,黄灯是9到0的倒计时过程,译码的显示跟绿灯一样,只是黄灯的亮会加一个1Hz的时钟控制端,1秒内只有半秒,

黄灯是亮的,从9秒到秒之间黄灯是亮的,然后到8是灭的,如此继续下去,知道10秒结束。又经过10s(70*50M个系统时钟上升沿),状态转移到红灯,然后显示及七段译码过程与绿灯相似。至此一个周期已经完成,接下来就是循环执行以上步骤的过程,直到有reset清零端打断其正常工作。

主要的时序是在三个灯不同状态之间跳转,这也是本程序的关键,他们之间的转换关系如图3所示。

图3 时序状态转化图

4.模块设计框图、相关时序

本程序分为三个模块,顶层模块、控制模块、译码模块,各模块的设计框图以及相关时序说明如下:

顶层模块框图如图4所示。

如图4 顶层模块框图

输入:sysclk_50MHz 全局时钟信号,50MHz

Reset 全局复位端,高电平有效

顶层模块

控制模块译码模块

输出:color 最终各灯状态(包括亮与闪)

led_ctrl_1s 个位七段译码

led_ctrl_10s 十位七段译码

时序说明:加上时钟信号之后,首先用reset清零,然后控制模块会分频产生分频时钟,根据分频时钟的高与低,会控制各个状态之间的跳转,译码模块会同步通过数码管来显示倒计时数,并且会根据译码模块黄灯闪亮控制端来输出各灯的具体状态。

控制模块框图如图5所示。

图5 控制模块框图

输入:sysclk_50MHz 全局时钟信号,50MHz

Reset 全局复位端,高电平有效

输出:dout_1s 倒计时个位上数字

dout_10s 倒计时十位上数字

light_select 各个灯状态light_select(只是控制亮与灭,不

管黄灯闪烁)

时序说明:首先还是加上系统时钟之后,用reset清零,则计数器清零、所有灯都不亮。但reset为1之后模块开始工作,首先是计数器开始计数,随之分频时钟会根据计数器的变化而周期变化,绿灯会先亮60秒,之后黄灯也会亮(闪烁在译码模块实现)10秒,然后就是红灯亮60秒,以后就是循环以上步骤的过程,同时在循环过程中,倒计数的数会同步输出,各灯亮与灭状态也会同步输出。

译码模块框图如图6所示:

图6 译码模块框图

输入端口: sysclk_50MHz 全局时钟信号,50MHz

reset 全局复位端,高电平有效 din_1s 显示器个位数据,由控制模块输入

din_10s 显示器十位数据,由控制模块输入

light_sel 选择那盏灯亮,由控制模块的输入

图7 modelsim仿真结果关键点展示(绿灯)

图8展示的黄灯倒计时的某一瞬间,竖线显示的地方,此时color和light_selected都是010,表示此时是黄灯在亮,倒计时十位(dout_10s)和和个位(dout_1s)合起来是08,而七段译码led_ctrl_10s是0001000,对照译码表可以发现它显示的数字0,led_ctrl_1s是0000000,对照译码表可以发现它显示的数字8,也与输出结果吻合,最后一个y_flicker为1,也表示此时黄灯可以亮。

图8 modelsim仿真结果关键点展示(黄灯)

图9也是展示的黄灯在倒计时08s时结果,与图8不同的是在color和y_flicker,图9的light_selected也是010,表示此时输入信号时黄灯在亮,然而闪烁控制端y_flicker为0,表示此时输出的黄灯应该是灭的,实际上通过图8和图9对比可以发现,它实现了黄灯闪烁的功能(08s的前半秒黄灯是亮的,后半秒是灭的)。

相关文档