在上一节FPGA智能传感系统(一)Verilog基础入门有介绍基本的语法知识。本节主要是实战交通灯设计。本设计的所有代码、课程任务书、源代码程序、对应PPT、实验结果的视频讲解都在这个基于Verilog语言的FPGA交通灯设计链接。
https://download.csdn.net/download/weixin_39059031/12561731
设计目的及功能
设计目的
采用Verilog
编写程序,并在QUARTUS II
工具Modelsim
平台仿真,在一个十字交叉路口,每个路口都有红、绿、黄三盏灯。即北、东、南、西方向都有红绿黄三盏灯。红灯亮时表示禁止通行,绿灯亮是表示允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。系统状态转移如图1所示:
四个方向之后某一个方向会为绿灯,其余方向为红灯。绿灯亮时,表示其它三个方向都能行驶至绿灯方向。每次绿灯亮27s,黄灯3s,然后转90s红灯。
显示采用LED
光柱或数码管倒计时的方式。具有复位功能。具有紧急情况下的按钮功能。每个路口都采用2个七段共阳数码管倒计时。
方案论证与选择
通过分析可以知道,所要设计的十字路口交通灯控制电路要能够使北、东、南、西方向依次从27绿灯倒计时,再3s黄灯,再90s红灯。由于系统时钟是50Mhz,所以我们首先需要的就是分频模块产生1hz的频率。可以不采用状态机方式。直接以进程方式实现主支干道的交通灯效果。也可以采用状态机方式。每一种状态为一种效果,以切换状态的方式实现交通灯效果。
通过分析可以知道,所要设计的十字路口交通灯控制电路要能够使北、东、南、西方向依次从27绿灯倒计时,再3s黄灯,再90s红灯。由于系统时钟是50Mhz,所以我们首先需要的就是分频模块产生1hz的频率。可以不采用状态机方式。直接以进程方式实现主支干道的交通灯效果。也可以采用状态机方式。每一种状态为一种效果,以切换状态的方式实现交通灯效果。
本次设计较复杂,如果不采用状态机的方式实现起来会非常繁琐,所以在功能中采用状态机的方式实现。主要包含8种状态,以状态1到状态8表示表示。
- 状态1:北方向绿灯27s,其余红灯,此时led输出为010_100_100_100。
- 状态2:北方向黄灯3s, 其余红灯,此时led输出为001_100_100_100。
- 状态3:东方向绿灯27s,其余红灯,此时led输出为100_010_100_100。
- 状态4:东方向黄灯3s, 其余红灯,此时led输出为100_001_100_100。
- 状态5:南方向绿灯27s,其余红灯,此时led输出为100_100_010_100。
- 状态6:南方向黄灯3s, 其余红灯,此时led输出为100_100_001_100。
- 状态7:西方向绿灯27s,其余红灯,此时led输出为100_100_100_010。
- 状态8:西方向黄灯3s,其余红灯,此时led输出为100_100_100_001。
基本原理
通过分析可以知道,系统设计要求交通控制电路能够从北方向顺时针转,每个方向都有27s的绿灯,3s的黄灯,之后就是90s的红灯。对于其中任何一个方向,其信号的点亮顺序为绿灯亮27s,绿灯熄灭之后黄灯闪烁亮3s,黄灯闪烁亮3s之后红灯亮,如此循环下去。因此设计系统流程框架如下图2所示:
如上图所示,先由系统50Mhz产生1hz的分频信号,用于状态转移和计时,同时系统时钟分频产生黄灯闪烁的分频信号。依据状态和黄灯闪烁信号产生LED控制信号。
系统时钟和当前状态去决定控制数码管倒计时,当倒计时时间确定之后就可以产生各个方向的个位和十位信号,依据系统时钟产生位选信号对数码管进行显示,再通过段选信号去显示结果。
所设计的八个状态如下所示:
状态1:北方向绿灯27s,其余红灯,此时led输出为010_100_100_100。
此时北方向的倒计时n_time
从27s开始,东方向倒计时e_time
从30s开始,南方向的倒计时s_time
从60s开始,西方向倒计时w_time
从90s开始。
当北方时间n_time
递减到1时,之后被赋值为3s黄灯(0s直接跳变为3s),东方时间e_time
也被赋值为3s红灯,南方时间s_time
被赋值为33s红灯,西方时间w_time
为63s红灯。
状态2:北方向黄灯3s,其余红灯,此时led输出为001_100_100_100。
到达状态2的时候,北方向倒计时n_time被重新赋值为2s,东方倒计时e_time也被重新赋值为2s,南方倒计时s_time被赋值为32s,西方倒计时被赋值为62s。
当北方时间倒计时到1s之后北方时间被赋值为90s(0s直接被赋值到90s)红灯,东方时间e_time被赋值为27s绿灯,南方时间s_time被赋值为为30s红灯,西方时间被赋值为60s红灯。
状态3:东方向绿灯27s,其余红灯,此时led输出为100_010_100_100。
到达状态3时,东方时间被赋值为27s绿灯递减,南方时间s_time被赋值为30s红灯递减,西方时间被赋值为60s红灯递减,北方时间被赋值为90s红灯递减。
当东方时间e_time递减到1时,之后被赋值为3s黄灯(0s直接跳变为3s),南方时间s_time也被赋值为3s红灯,西方时间w_time被赋值为33s红灯,北方时间n_time为63s红灯。
状态4:东方向黄灯3s,其余红灯,此时led输出为100_001_100_100。
到达状态4的时候,东方向倒计时e_time被重新赋值为2s,南方倒计时e_time也被重新赋值为2s,西方倒计时w_time被赋值为32s,北方倒计时被赋值为62s。
当东方时间倒计时到1s之后东方时间被赋值为90s(0s直接被赋值到90s)红灯,南方时间s_time被赋值为27s绿灯,西方时间w_time被赋值为为30s红灯,北方时间被赋值为60s红灯。
状态5:南方向绿灯27s,其余红灯,此时led输出为100_100_010_100。
到达状态5时,南方时间被赋值为27s绿灯递减,西方时间w_time被赋值为30s红灯递减,北方时间被赋值为60s红灯递减,东方时间被赋值为90s红灯递减。
当南方时间s_time递减到1时,之后被赋值为3s黄灯(0s直接跳变为3s),西方时间w_time也被赋值为3s红灯,北方时间n_time被赋值为33s红灯,东方时间e_time为63s红灯。
状态6:南方向黄灯3s,其余红灯,此时led输出为100_100_001_100。
到达状态6的时候,南方向倒计时s_time被重新赋值为2s,西方倒计时e_time也被重新赋值为2s,北方倒计时w_time被赋值为32s,东方倒计时被赋值为62s。
当南方时间倒计时到1s之后南方时间被赋值为90s(0s直接被赋值到90s)红灯,西方时间w_time被赋值为27s绿灯,北方时间n_time被赋值为为30s红灯,东方时间被赋值为60s红灯。
状态7:西方向绿灯27s,其余红灯,此时led输出为100_100_100_010。
到达状态7时,西方时间被赋值为27s绿灯递减,北方时间n_time被赋值为30s红灯递减,东方时间被赋值为60s红灯递减,南方时间被赋值为90s红灯递减。
当西方时间w_time递减到1时,之后被赋值为3s黄灯(0s直接跳变为3s),北方时间n_time也被赋值为3s红灯,东方时间e_time被赋值为33s红灯,南方时间e_time为63s红灯。
状态8:西方向黄灯3s,其余红灯,此时led输出为100_100_100_001。
到达状态8的时候,西方向倒计时w_time被重新赋值为2s,北方倒计时n_time也被重新赋值为2s,东方倒计时e_time被赋值为32s,南方倒计时被赋值为62s。
当西方时间倒计时到1s之后西方时间被赋值为90s(0s直接被赋值到90s)红灯,北方时间n_time被赋值为27s绿灯,东方时间e_time被赋值为为30s红灯,南方时间被赋值为60s红灯。
方案的实现与调试
根据设计要求和系统所要求得功能,进行了前期调研,查阅相关书籍和文献,确定本设计需要的所有器件以及模块,制定设计方案,现确定主要完成以下任务:
1、系统时钟的设计
本设计需要提供一个50Mhz的系统时钟。
2、控制电路的设计
本设计中需要复位功能及遇有紧急情况可人为将两个方向都置为红灯功能,通过按钮,按照控制要求,控制key键相应输入的高低电平,继而通过程序的运行达到控制的目的。
3、数码管显示模块的设计
本设计中需要将三种灯(红、黄、绿)的点亮时间通过数码管显示出来,由于各方向的灯的倒计时时间不相同,需要用8个数码管对各个方向进行显示。
4、LED灯显示模块设计
本设计中需要控制东西、南北两个方向的信号灯,一共12个灯,由于各个方向显示不相同,即需要控制4组信号灯。