FPGA智能传感系统(二)基于FPGA的交通灯设计

  在上一节FPGA智能传感系统(一)Verilog基础入门有介绍基本的语法知识。本节主要是实战交通灯设计。

设计目的及功能

设计目的

  采用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组信号灯。

程序调试

  接下来设置基本的参数信息,比如黄灯的发光时长,红灯的发光时长,绿灯的发光时长等。WIDTH参数用于控制分频,产生1s的时钟,由于系统时钟是50Mhz,所以系统时钟的波形周期为20ns,之后基于这个20ns一个上升沿就可以计数产生分频信号:

  其中WIDTH为25_000_000(仿真用25_000为其系统频率的一半,只要计数器clk_t小于WIDTH就不断累加,若达到这个值,或者复位信号来了,就归零,由此就产生了0.5s的计数器。依据这个0.5s的计数器,我们就可以产生1hz的时钟。

  有了1hz的时钟之后就可以改变状态机,切换交通信号灯工作的8个状态。在开始状态切换之前有一个复位信号,状态复位到状态1,计时为27s。

led_module.v

  led寄存器从高到低分别驱动:北、东、南、西向红绿黄灯。

  整个实现为:

  led灯控制模块(led_module):根据接收到的实时状态信号state[3:0],驱动北、东、南、西方向的led发光。

bit_seg_module.v

  数码管显示模块(bit_seg_module):接收交通灯控制模块传递过来的北、东、南、西方向的实时时间数据n_time[9:0]、e_time[9:0]、s_time[9:0]和w_time[9:0],并以此驱动对应的数码管,将数据显示出来。主要就是产生位选和段选信号以驱动数码管。

  所以数码管显示模块的输入为系统时钟信号,系统复位信号,东西方向数码管要显示的数值,南北方向数码管要显示的数值。输出就是数码管的位选信号和段选信号。

  之后依据数字num去驱动数码管显示:

  除此之外还写了顶层模块traffic_led.v和测试文件test.v。

仿真结果

总结

  这次设计给我最大的收获就是做什么事都不要急,要一步一步的做好前提工作,我开始看到这个课题的时候就动手去写程序,只是凭着自己脑子里想一点就写一点,但是经过几次反复的修改还是没有成功,看不到效果,所以后来干脆就放下来先把每一步每一个模块都弄清楚再动手去写,可以再本子上把各个模块的端口以及连接都画好,再去写,这样能做到事半工倍的效果,而且在设计的时候不懂得地方可以参考别人写的程序,毕竟,不管做什么课程设计都是为了让自己弄懂、学好,只要将别人的程序设计转为自己的知识就ok了,在次基础上加上自己的一些想法,学会变通,或许还有 些知识没学到,比如键盘输入控制这部分,但是通过别人的程序能让自己学到更多的知识,而且能巩固知识,所以我觉得要想把程序写好平常一定要多写多练多参考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章