基于FPGA的交通灯控制器设计(VHDl代码全,各个模块均调试通过)

更新时间:2023-07-21 17:50:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

2.3 FPGA主控实现方案设计

结合已有的PLC实现和单片机应用实现的经验,并吸收两种设计的优势之处,再根据交通灯控制系统的设计要求和FPGA模块化功能实现,确定了以下方案,因每个方向相对的信号灯状态及倒计时显示器的显示完全一致,根据设计要求和系统所具有的功能,交通灯控制器系统框图如图2-6 所示。

图2-6 交通灯控制器系统框图

确定的方案中,系统具有复位功能,能使系统重新开始计时;在红绿灯交通信号系统中,大多数的情况是通过自动控制的方式指挥交通的,但为了配合高峰时段,防止交通拥挤,有时还必须使用手动控制。为此主体包括系统复位,手动/自动,红绿灯切换,主控模块,显示器,报警器。具体主控部分用FPGA来实现。

图2-7 交通灯通行示意图

结合实现方案,主要有东西、南北、南北左拐,东西左拐,跟手动控制5种工作方式,具体由M2~M0设定,具体如表2-1。

2-1 交通灯工作方式表

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

方式 M2(0:自动, M1(0:A向, M0(O:直行,

1:手动)

1 2 3 4 5

0 0 0 0 1

1:B向)

0 0 1 1 *

1:左拐)

0 1 0 1 *

当出现特殊情况时,可选择方式1 到方式4 中的任何一种方式,停止正常运行,进入特殊运行状态。此时交通灯按工作方式显示,计时电路停止计时,计时时间闪烁显示。当系统总复位时,控制电路和计时电路复位,信号灯全部熄灭。

3 各功能模块的设计与实现

3.1总体设计思路

3.1.1系统组成框图

结合设计任务要求和确定的实现方案,假设某个十字路口是由一条主干道和一条次干道回合而成,在每个方向设置红绿黄3种信号灯,红灯亮禁止通行,绿灯亮允许通行。黄灯亮允许行驶中车辆有时间停考到禁止线以外。

按照自顶向下的层次化设计方法,整个系统可分为4个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。其系统组成方框图如图3-1所示。

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

图3-1 交通灯控制器系统组成框图

在自动控制模块时,绿灯亮为55秒,黄灯亮为5秒,红灯亮为60秒。其外部硬件电路方面包括:两组红绿灯(配合十字路口的双向指挥控制)、两级七段显示器(配合绿灯倒计时显示)、一组手动与自动控制开关(针对交通警察指挥交通控制使用)。

3.1.2交通灯的状态转换图

图3-2 主干道状态转换

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

图3-3 支干道状态转换

由上面的两个干道的状态转换图可知,两个方向的先设计成并列的,即都是按照倒计时信号进行状态跳转,然后再加入两者之间的限制关系和SIGNAL信号。

交通灯的控制过程可以分为四个阶段,对应的输出有四种状态,分别为S0,S1,S2,S3,四个阶段的灯亮状态如表3-2。

表3-2 四个阶段的灯亮状态表

状态

灯亮情况

格雷码 00 01 11 10

S0状态 主干道绿灯亮,支干道红灯亮 S1状态 主干道黄灯亮,支干道红灯亮 S2状态 主干道红灯亮,支干道绿灯亮 S3状态 主干道红灯亮,支干道黄灯亮

对于上述的S0和S2状态要加以说明:首先,当主干道方向55秒计时结束时,若支干道方向无车时,这时控制器应继续运行在S0状态,再运行55秒,等到下一次计时结束时再行判断;当主干道55秒计时结束,若支干道方向有车,则按照状态转换图进行跳转。同理,支干道也执行相同的处理。

其次,当支干道开始绿灯亮时,规定必须保持支干道方向一直有车时,支干道方向的绿灯才能继续维持,否则在计数未结束但支干道无车时,执行从S2状态跳转到S3状态;若支干道有车一直维持到55秒计数结束,那么也要执行状态转换。

3.2 功能模块设置及实现

结合前面的系统设计框图和状态设置,把主控部分分为主控制模块,55秒倒计时模块,5秒倒计时模块,倒计时时间选择驱动模块,倒计时时间选择模块,1KHz时钟信号模块,1Hz计数时钟信号模块,倒计时时间数据多路选择模块,动态显示驱动模块,显示数据多路选择模块,显示数据译码模块。

系统采用的是系统级层次设计方法,对整个系统进行方案设计和功能划分,系统的关键电路用一片FPGA芯片实现,首先用VHDL语言编写各个功能模块程序,最后通过综合器和适配器生成最终的目标器件,然后用顶层原理图将各个功能模

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

块连接起来。下面分别来介绍各个功能模块的实现和调试过程。

3.2.1主控制模块

该模块主要完成根据外部输入信号Reset、SW控制输出,用于控制交通灯的信号Red1,Red2,Yellow1,Yellow2,Green1,Green2。这中间包含了必要的内部模块之间的信号EN_in(来自倒计时时间选择驱动模块)。其源代码见附录1,其仿真结果与编译后的结果如图3-4,3-5所示。

图3-4 主控模块

图3-5 仿真结果

从图3-5可以简单地检查主控模块设计的逻辑上的正确性,同时也可以看到一些简单的延时信息。确认基本正确后,进行下面模块的设计与分析。

3.2.2 55秒倒计时模块

该模块主要完成55秒的倒计时,控制红灯的点亮时间。实际中在1分钟内还要有绿到黄灯的转换以提醒车辆与行人,所以选择了55秒作为绿灯的点亮时间。其源代码见附录1,其仿真结果与编译后的结果如图3-6,3-7所示。

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

图3-6 55秒倒计时模块

图3-7 仿真结果

从图3-7可以简单地检查55秒倒计时模块的逻辑上的正确性,同时也可以看到一些简单的延时信息。确认基本正确后,进行下面模块的设计与分析。

3.2.3 5秒倒计时模块

该模块主要完成5秒的倒计时,控制黄灯的点亮时间。实际中在1分钟内还要有红到黄灯的转换以提醒车辆与行人,所以选择了55秒作为红灯的点亮时间后,黄灯的点亮时间必定为5秒。其源代码见附录1,其仿真结果与编译后的结果如图3-8,3-9

所示。

图3-8 5秒倒计时模块

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

图3-9 仿真结果

从图3-9可以简单地检查5秒倒计时模块的逻辑上的正确性,同时也可以看到一些简单的延时信息。确认基本正确后,进行下面模块的设计与分析。

3.2.4倒计时时间选择驱动模块

该模块只要完成倒计时时间长短选择的功能,输入信号来自两个倒计时模块,当倒计数完成是产生一个脉冲用于驱动此模块产生00,01,10,11序列来

驱动倒计时时间选择模块。其源代码见附录1,其编译后的结果如图3-10所示。

图3-10 倒计时时间选择驱动模块

3.2.5倒计时时间选择模块

该模块主要完成55秒倒计时与5秒倒计时之间的选择功能,在实际中因为存在着红灯到黄灯再转换为绿灯的这样一个变化过程,而红黄绿灯的点亮时间不相同,一般是绿黄两灯的点亮时间刚好等于红灯,其中,绿灯亮55秒,黄灯亮5秒,红灯亮60秒。其源代码见附录

1,其仿真结果与编译后的结果如图3-11,3-12所示。

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

图3-11 倒计时时间选择模块

图3-12 仿真结果

从图3-12可以简单地检查倒计时时间选择模块的逻辑上的正确性,同时也可以看到一些简单的延时信息。确认基本正确后,进行下面模块的设计与分析。

3.2.6 1KHz时钟信号模块

该模块主要完成从开发实验板上10MHz的全局时钟信号经过分频得到1KHz的时钟信号,即完成一个10000分频的分频器。分频器的设计是时序设计的比较基础的知识,在实际系统中用得很多,设计过程与计数器的设计很类似。其源代码见附录1,其编译后的结果如图3-13所示。

图3-13 1KHz时钟信号模块

3.2.7 1Hz计数时钟信号模块

该模块主要完成从模块1KHz中的1KHz时钟信号经过分频得到1Hz的计数时钟信号,即完成一个1000分频的分频器。设计过程与模块6的设计过程基本相同。其源代码见附录1,其编译后的结果如图3-14所示。

图3-14 1Hz计数时钟信号模块

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

3.2.8 倒计时时间数据多路选择模块

该模块主要完成两组不同倒计时时间数据的选择输出到后续显示模块中。其源代码见附录1,其仿真结果与编译后的结果如图3-15,3-16所示。

图3-15 倒计时时间数据多路选择模块

图3-16 仿真结果

从图3-16可以简单地检查倒计时时间数据多路选择模块的逻辑上的正确性,同时也可以看到一些简单的延时信息。确认基本正确后,进行下面模块的设计与分析。

3.2.9 动态显示驱动模块

该模块主要完成倒计时数码管的动态显示。动态显示即分时显示,但是时间间隔的选择既要保证人眼看起来是同时显示,即不会出现两位数字的断续显示,又要保证不会覆盖显示数字,

即不会出现上个数字与下个数字之间的显示过快使得人眼来不及分辨。其源代码见附录1,其仿真结果与编译后的结果如图3-17,3-18所示。

图3-17 动态显示驱动模块

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

图3-18 仿真模块

从图3-18可以简单地检查动态显示驱动模块的逻辑上的正确性,同时也可以看到一些简单的延时信息。确认基本正确后,进行下面模块的设计与分析。

3.2.10 显示数据多路选择模块

该模块主要完成数码管显示数据的分时选择,以实现分时动态显示。其源代码见附录1,其仿真结果与编译后的结果如图3-19,3-20所示。

图3-19 显示数据多路选择模块

图3-20 仿真结果

从图3-20可以简单地检查显示数据多路选择模块的逻辑上的正确性,同时也可以看到一些简单的延时信息。确认基本正确后,进行下面模块的设计与分析。

3.2.11 显示数据译码模块

该模块主要完成4位BCD码到8位数码管显示数据的译码。译码后的8位数据分别对应数码管的数据段A、B、C、D、E、F、G、DP。其源代码见附录1,其仿真结果于编译后的结果如图3-21,3-22所示。

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

3-21 显示数据译码模块

图3-22 仿真结果

从图3-22可以简单地检查显示数据译码模块的逻辑上的正确性,同时也可以看到一些简单的延时信息。确认基本正确后,进行下面模块的设计与分析。

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

4 总体调试与结果说明

4.1 顶层电路

在设计完各个模块后,需要将各个模块有机地组合成一个整体,最后来实现系统的功能在数字频率计的设计中,同时采用了电路原理图的设计以及Verilog HDL语言来编写的顶层电路。电路原理图见图4-1,具体源代

码见附录1,仿真图如图4-2所示。

图4-1 总系统电路图

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

图4-2 仿真结果

说明:当ga为高电平时表示a方向绿灯亮,同时rb为高电平表示b方向红灯亮;经过55秒,ga变为低电平表示,rb不变,ya变为高电平表示a方向绿灯灭黄灯亮,b方向仍为红灯;经过5秒,gb变为高电平表示b方向绿灯亮,ra为高电平表示a方向红灯亮;再经过5秒,gb变为低电平,ra不变,yb变为高电平表示b方向绿灯灭黄灯亮a方向仍为红灯。

4.2 过程调试

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

4.3

硬件仿真效果

图4-3 1方向绿灯亮

图4-3表示1方向绿灯亮,2方向红灯亮的过程。

图4-4 2方向绿灯亮

图4-4表示2方向绿灯亮,1方向红灯亮。

从DE2调试结果来看,整个设计结果基本符合设计要求。

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

5 总结和展望

通过本次课题的研究,利用FPGA技术实现交通灯控制系统主控模块功能,是对传统交通灯控制系统设计的一种改进。本文中采用Verilog HDL语言设计交通灯控制系统,借助其功能强大的语言结构,简明的代码描述复杂控制逻辑设计,与工艺无关特性,在提高工作效率的同时达到求解目的,并可以通过Verilog HDL语言的综合工具进行相应硬件电路生成,具有传统逻辑设计方法所无法比拟的优越性。

本设计采用Verilog HDL硬件描述语言文本输入方式,在确立总体预期实现功能的前提下,分层次进行描述,其中所用到的数据均可依现场情况而设置,修改方便灵活。须注意的是,两模拟频率不能太高,否则将无法实现。并且,程序中还规定了两计数器的计数范围,与实际结合。整体而言,本设计所耗资源较少,提供了较大的添加范围。其中,人行道的设置并未完成;另外,设计中还有有待完善的地方,如状态之间相互转换的间隔时间的修改,并不能让任何人都能进行此项操作。因此,可利用数显密码锁,来有效防止机内参数被无关人员随意修改,为系统安全提供保障。数字化时代的到来给人们的生活带来了极大的改变,有理由相信随着数字化的深入,交通灯控制器的功能将日趋完善。而且,Verilog HDL语言对EDA产生的影响也是深远的,它缩短了电子产品的设计周期,为设计者提供了方便。

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

6 致谢

\\\\\\\\\同时也感谢在开题答辩中针对我的设计指出了许多不足之处的老师们,正是有了你们对我设计的严格要求才能让我在以后的设计过程中去发现自身设计的缺点,让我有了不断改进设计的机会和空间,帮助我能够顺利的实现设计的预期目标。在设计过程中我时常遇到一些技术上的问题,通过查阅资料并和老师交流自己的想法而且在指导老师的指导下解决了技术上的问题,循序渐进地完成每个阶段的任务,对于设计方案进行一次次的改进做到精益求精,这样渐渐地培养了自身独立思考和动手设计能力,对于一个电子信息专业的学生来说这将对我起到了相当大的帮助。

我还要感谢在一起愉快的度过本科生活的51楼416各位同学,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文的顺利完成。在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意!最后我还要感谢培养我长大含辛茹苦的父母,谢谢你们!

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

参考文献

[1] 周润景等.基于QuartusⅡ的FPGA/CPLD数字系统设计实例[M].北京:电子

工业出版社,2007年8月

[2] 杨晓慧等.基于FPGA的EDA/SOPC技术与VHDL[M].北京:国防工业出版社,

2007年10月

[3] 王诚等.Altera FPGA\CPLD设计(基础篇)[M].北京:人民邮电出版社,2005

年7月

[4] Stephen Brown,Zvonko Vranesic.Fundamentals of Digital Logic with

Verilog Design(2nd Edition)[M].New York:McGraw-Hill,2007,5. [5] Ming-Bo Lin.Digital System Designs and Practices: Using Verilog HDL

and FPGAs[M].New York:McGraw-Hill,2008,8.

[6] 徐光辉.基于FPGA的嵌入式开发与应用[M].北京:电子工业出版社,2006

年9月

[7] 文畅.基于FPGA/CPLD和VHDL语言的交通灯控制系统设计[J].电脑知识与

技术(学术交流),2007,06-08.

[8] 瞿逐春.EDA技术综合应用实例与分析[M].西安:西安电子科技大学出版

社,2004年11月

[9] 杨少军.基于DSP的移频机车信号分析研究与实现[D].武汉:武汉大

学,2006.

[10] 谭卫泽,徐畅.面向FPGA器件的VHDL语言优化设计方法[J].南宁职业技术

学院学报,2008年,13(4):98~100.

[12] 任晓东 文博.CPLD/FPGA高级应用开发指南[M].北京:电子工业出版社,

2003年9月.

[12] 任爱锋.基于FPGA的嵌入式系统设计[M].西安:西安电子科技大学出版社,

2004年10月.

[13] 余俊.基于FPGA的IDE协议实现的研究[J].电子科技. 2008年9月,12(8)

144~156.

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

附录1 程序代码

..................................................................主控制模块 Module

control(EN_in,SW1,RST,Red1,Red2,Yellow1,Yellow2,Green1,Green2);

output Red1; output Red2; output Yellow1; output Yellow2; output Green1; output Green2;

input [1:0] EN_in; input SW1; input RST;

reg Red1,Red2,Yellow1,Yellow2,Green1,Green2,D_out; always @(EN_in,RST,SW1) begin if(SW1==0||RST==0) {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b0; else begin case(EN_in) 2'b00: {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b010010; 2'b01: {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b011000; 2'b10: {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b100001; 2'b11: {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b100100; default : {Red1,Red2,Yellow1,Yellow2,Green1,Green2}=6'b0; endcase end end

endmodule

............................................................... 55秒倒计时模块 module counter55(C_CLK,RST,C_EN,D_OUT1,D_OUT0,C_out); output C_out;

output [3:0] D_OUT1; output [3:0] D_OUT0; input C_CLK; input RST; input C_EN;

reg [3:0] D_OUT1; reg [3:0] D_OUT0; reg C_out;

reg [3:0] CData1;

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

reg [3:0] CData0; reg [7:0] DATA;

always @(posedge C_CLK) begin if(RST==0||C_EN==0) begin C_out <= 1'b0; CData1 <= 4'b0000; CData0 <= 4'b0000; end else begin if(CData0 == 4'b0101 && CData1 == 4'b0101) begin CData1 <= 4'b0000; CData0 <= 4'b0000; C_out = 1'b1; end else if(CData0 != 4'b1001) begin CData0 <= CData0 + 1; C_out <= 1'b0; end else if(CData0 == 4'b1001 && CData1 != 4'b0110) begin CData1 <= CData1 + 1; CData0 <= 4'b0000; C_out <= 1'b0; end else begin CData1 <= 4'b0000; CData0 <= 4'b0000; C_out = 1'b1; end end end always begin DATA <= 8'b01010101-((CData1<<4)+CData0); if(((DATA>>4)&4'b1111)>4'b0101) D_OUT1 <= (DATA>>4)&4'b1111-4'b1111; else D_OUT1 <= (DATA>>4)&4'b1111;

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

if((DATA&4'b1111)>4'b1001) D_OUT0 <= (DATA&4'b1111)-4'b0110; else D_OUT0 <= DATA&4'b1111; end

endmodule

.................................................................5秒倒计时模块 module counter05(C_CLK,RST,C_EN,D_OUT1,D_OUT0,C_out); output C_out;

output [3:0] D_OUT1; output [3:0] D_OUT0; input C_CLK; input RST; input C_EN; reg [3:0] D_OUT1; reg [3:0] D_OUT0; reg C_out;

reg [3:0] CData1; reg [3:0] CData0; reg [7:0] DATA;

always @(posedge C_CLK) begin if(RST==0||C_EN==0) begin C_out <= 1'b0; CData1 <= 4'b0000; CData0 <= 4'b0000; end else begin if(CData0 != 4'b0101) begin CData0 <= CData0 + 1; C_out <= 1'b0; end else begin CData1 <= 4'b0000; CData0 <= 4'b0000; C_out = 1'b1; end end end always

按照自顶向下的层次化设计方法,整个系统可分为4 个模块,系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。

begin DATA <= 8'b00000101-((CData1<<4)+CData0); D_OUT1 <= 4'b0000; if((DATA&4'b1111)>4'b0101) D_OUT0 <= DATA&4'b1111-4'b1011; else D_OUT0 <= DATA&4'b1111; end

endmodule .........................................................倒计时时间选择驱动模块 module scan(EN_in1,EN_in0,sdata); output [1:0] sdata; input EN_in1; input EN_in0; reg [1:0] sdata; wire EN_in;

assign EN_in = EN_in1 | EN_in0; always @(posedge EN_in) begin sdata <= sdata + 2'b01; end

endmodule .............................................................倒计时时间选择模块 module countersel(D_IN,D_OUT1,D_OUT0); output D_OUT1; output D_OUT0; input [1:0] D_IN; reg D_OUT1; reg D_OUT0; always begin case(D_IN) 2'b00 : {D_OUT1,D_OUT0} <= 2'b10; 2'b01 : {D_OUT1,D_OUT0} <= 2'b01; 2'b10 : {D_OUT1,D_OUT0} <= 2'b10; 2'b11 : {D_OUT1,D_OUT0} <= 2'b01; default : {D_OUT1,D_OUT0} <= 2'b00; endcase end

endmodule .............................................................1KHz时钟信号模块 module fdiv1khz(clk_in,clk_out); output clk_out; input clk_in;

本文来源:https://www.bwwdw.com/article/rccm.html

Top