基于FPGA的交通灯控制器设计1 精品Word文档下载推荐.docx
《基于FPGA的交通灯控制器设计1 精品Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于FPGA的交通灯控制器设计1 精品Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
3.2状态控制电路设计4
3.3计数器设计5
3.4译码显示电路设计5
4robei软件程序设计6
4.1扫描显示模块6
4.2状态转换模块7
4.3总体设计11
4.4测试文件12
5程序仿真与分析12
5.1仿真结果12
5.2仿真结果分析14
6心得体会16
参考文献17
附录18
1FPGA/CPLD概述
随着世界范围内城市化和机动化进程的加快,城市交通越来越成为一个全球化的问题。
城市交通基础设施供给滞后于高速机动化增长需求,道路堵塞日趋加重,交通事故频繁,环境污染加剧等问题普遍存在。
目前,全国大中城市普遍存在着道路拥挤、车辆堵塞、交通秩序混乱的现象,交通事故频发,这给人民的生命财产安全带来了极大的损失。
如何解决城市交通问题已成为全社会关注的焦点和大众的迫切呼声。
探究城市交通发展中存在问题的原因,无论是从宏观上还是从微观上分析,其根本原因在于城市交通系统的管理机制不适应。
城市交通控制系(UTC,UrbanTrafficControlSystem)是现代城市智能交通系统(IDJ,Intelligenttransportsystem)的组成之一,主要用于城市道路交通的控制与管理。
城市平交路口实现交通信号控制是城市交通管理现代化的基本标志之一,是提高交通管理效能的重要技术手段。
路口信号控制器是控制交叉路口交通信号的设备,它是交通信号控制的重要组成部分。
各种交通控制方案,最终都要由路口信号控制器来实现。
为了确保十字路口的行人和车辆顺利、畅通地通过,往往采用电子控制的交通信号来进行指挥。
伴随着社会的发展以及人类生活水平的提高,汽车的数量在不断增加,EDA技术的发展和应用领域也在不断的扩大与深入,机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域的重要性日益突出。
利用EDA技术设计交通灯来完成这个需求就显的更加迫切,同样也是非常的实用和合理。
FPGA(现场可编程门阵列)和CPLD(复杂可编程逻辑器件)都是可编程逻辑器件,他们是在PAL,GAL等逻辑器件的基础上发展起来的。
同以往的PAL,GAL相比较FPGA/CPLD的规模比较大,它可以替代几十甚至几千块通用IC芯片。
这样的FPGA/CPLD上就是一个子系统部件。
这种芯片收到世界范围内电子工程设计人员的广泛关注和普遍欢迎。
比较典型的就是Altera公司和Xilinx公司的CPLD器件系列和FPGA器件系列,他们开发较早,占用了较大的PLD市场。
FPGA/CPLD芯片都是特殊的ASIC芯片,除了具有ASIC的特点外,还具有以下几个优点:
随着VLSI(超大集成电路)工艺的不断提高单一芯片内部可以容纳上百万个晶体管,FPGA/CPLD芯片的规模也越来越大,其单片逻辑门数已达上百万门,它所实现的功能也越来越强,同时也可以实现系统集成,即片上系统SOC。
FPGA/CPLD芯片在出厂之前都做过百分之百的测试,不需要设计人员承担芯片风险和费用,设计人员只需在自己的实验室就可以通过相关的软硬件环境来完成芯片的最终功能设计。
所以,FPGA/CPLD的资金投入就少,减少了潜在的花费。
用户可以反复的编程,擦除,使用或者在外围电路不动的情况下用不同软件就可实现不同的功能。
FPGA/CPLD软件包中有各种输入工具和仿真工具,及版图设计工具和编程器等全线产品,电路设计人员在很短的时间内就可完成电路的输入,编译,优化,仿真,直至最后芯片的制作。
当电路有少量的改动,更能显示FPGA/CPLD的优势。
在线可编程技术(ISP)使得使用FPGA/CPLD的产品可以做到远程升级。
2课程设计总体方案
2.1系统分析
通过分析可以知道,所要设计的十字路口交通灯控制电路要能够使南北、东西各四个灯(红、黄、绿),三个灯能够按顺序依次亮灭。
而且要求绿灯亮转红灯亮之前要先转黄灯亮5秒,还要求三种灯的点亮时间能够以倒计时的形式显示出来。
可以用verilogHDL语言合理设计系统功能,使红黄绿灯的转换有一个准确的时间间隔和转换顺序。
使用基于FPGA的方法具有周期短、使用灵活、易于修改等明显的优点。
而且,随着FPGA器件,设计语言和电子设计自动化工具的发展和改进,越来越多的电子系统采用FPGA来设计。
未来使用FPGA器件设计的产品将出现在各个领域。
因此此次的交通灯控制器将基于FPGA的设计方案来实现所需要的功能。
2.2设计的总体方案
根据设计要求和系统所具有功能,并参考相关的文献资料经行方案设计画出如下所示的十字路口交通灯控制器系统框图,及为设计的总体方案,框图如下图3.1所示:
图2.2系统的框图
3硬件电路设计
3.1分频器设计
分频器实现的是将高频时钟信号转换成低频时钟信号,用于触发控制器、计数器和扫描显示电路。
具体实物模块如图:
图3.1分频器模块
3.2状态控制电路设计
状态控制器的作用是根据计数器的计数值控制各方向上发光二极管的亮、灭,当计时时间到达,状态控制器就响应,自动跳转到下一个状态。
此外,当检测到特殊情况(EMI=‘1’)发生时,无条件点亮红灯的二极管(急救灯按下EMI='
1'
,则东西南北都亮红灯,在这种状态下原来的状态必须保持,即东西南北方向定时时间保持不变。
急救灯未按下或者按下后恢复,则继续计时(计时通过计数器ct),同时恢复东西南北原来灯的状态)。
图3.2控制电路模块
3.3计数器设计
这里需要的计数器的计数范围为0-80。
计到80后,下一个时钟沿回复到0,开始下一轮计数。
此外,当检测到特殊情况(EMI=‘1’)发生是,计数器暂停计数,而系统复位信号RESET则使计数器异步清零。
图3.3计数器模块
3.4译码显示电路设计
根据状态控制器所控制的状态和计数器的计时时间,选择当前状态下的显示器,使显示器输出当前状态下的数码管亮、灭指令,其中数码管的显示采用动态扫描显示。
图3.4译码显示电路模块
4robei软件程序设计
4.1扫描显示模块:
/********扫描显示***********/
parameter_0=7'
b1000000,
_1=7'
b1111001,
_2=7'
b0100100,
_3=7'
b0110000,
_4=7'
b0011001,
_5=7'
b0010010,
_6=7'
b0000010,
_7=7'
b1111000,
_8=7'
b0000000,
_9=7'
b0011000;
reg[6:
0]rTen_SMG_Data;
initialbegin
rTen_SMG_Data=7'
b0000000;
end
always@(posedgeclkornegedgenrst)
if(!
nrst)
begin
rTen_SMG_Data<
=7'
b1111111;
else
case(ten_data)
4'
d0:
rTen_SMG_Data<
=_0;
d1:
=_1;
d2:
=_2;
d3:
=_3;
d4:
=_4;
d5:
=_5;
d6:
=_6;
d7:
=_7;
d8:
=_8;
d9:
=_9;
endcase
/*********************************************/
0]rOne_SMG_Data;
rOne_SMG_Data=7'
rOne_SMG_Data<
case(one_data)
rOne_SMG_Data<
/**********************************************************/
assignten_smg_data=rTen_SMG_Data;
assignone_smg_data=rOne_SMG_Data;
4.2状态转换模块:
/************状态转换*************/
parameterstate_0=2'
b00,
state_1=2'
b01,
state_2=2'
b10,
state_3=2'
b11;
reg[1:
0]CS;
0]flag;
reg[3:
0]count_H,count_L;
0]count_H1,count_L1;
regECS;
reg[2:
0]light_zhu;
//light_zhu[0]?
?
light_zhu[1]?
light_zhu[2]?
0]light_zhi;
//light_zhi[0]?
light_zhi[1]?
light_zhi[2]?
CS=2'
b00;
flag=2'
ECS=1;
count_H=4'
b0000;
count_L=4'
count_H1=4'
count_L1=4'
light_zhu=3'
b000;
light_zhi=3'
always@(posedgeclk_1Hzornegedgenrst)
if(!
ECS)
ECS<
=1;
CS<
=state_0;
flag<
=2'
state_0_init;
case(CS)
state_0:
if(flag==2'
b00)//状态0,35s
count_H&
&
(count_L==4'
b0110))//5s
b01;
=state_1;
state_1_init;
//state_1
elseif(!
count_L)
count_L<
=4'
b1001;
count_H<
=count_H-1;
=count_L-1;
count_L1)
count_L1<
count_H1<
=count_H1-1;
=count_L1-1;
state_1:
b01)//状态1,5s
b10;
=state_2;
state_2_init;
//状态2
count_L1<
=count_L;
ECS=0;
state_2:
b10)//状态2,25s
=state_3;
state_3_init;
//state_3
state_3:
b11)//状态3,5s
//状态0
=count_L;
default:
begin
=2'
/*************************************/
taskstate_0_init;
begin//主干道绿灯45秒只干道
b0100;
//高位为4
b0101;
//低位为5
//高位5
//低位0
light_zhu<
=3'
b100;
//light_zhu[0]:
0,light_zhu[1]:
0,light_zhu[2]:
1
light_zhi<
b001;
//light_zhi[0]:
0,light_zhi[1]:
0,light_zhi[2]:
endtask
taskstate_1_init;
begin//黄灯5秒
//高位为0
b010;
taskstate_2_init;
begin//主干道红灯25秒
b0010;
//高位为2
count_H1<
//高位为3
//低位为0
taskstate_3_init;
begin//5秒黄灯
//地位为5
/**************************/
assignone_data=count_L;
assignten_data=count_H;
assignone_data1=count_L1;
assignten_data1=count_H1;
assignled_zhu=light_zhu;
assignled_zhi=light_zhi;
/**************************/
4.3总体设计:
4.4测试文件:
regclk_signal;
clk_signal=0;
clk=0;
nrst=0;
#1
nrst=1;
#500$finish;
alwaysbegin
#1clk_signal=~clk_signal;
clk=clk_signal;
5程序仿真与分析
5.1仿真结果
利用robei软件对本程序进行编译,生成了可以进行仿真定时分析以及下载到可编程器件的相关文件。
仿真结果如下图所示:
总体:
主干道:
支干道:
5.2仿真结果分析
通过写测试文件设置仿真时间,就可以得到如上所示的仿真波形图。
由仿真波形图可以看出波形是由clk信号触发而显示出各个状态的。
nrst低电平信号输入时,所有交通灯都变为红灯状态。
由仿真波形图还可以清楚的看出各时间段每个交通灯的状态。
要得到正确的仿真波形图就不许设定合适的时间信号clk值。
如果clk值设置的太小则交通灯状态变化得太快无法分辨,如果clk值设置得太大则交通灯状态转换缓慢,效果不明显。
其次,要设定clk高低电平的时间,如果没有设定clk脉宽就不可能触发而得到仿真图。
最后,就是要设置nrst高电平信号。
心得体会
首先在这里,要感谢詹华群老师的授课和小强同学的指导,感谢学院开设《基于FPGA的交通灯控制器设计》这门课程设计,给了我们一次充分锻炼,将理论知识付诸实践的机会。
刚开始对FPGA都不怎么熟悉对robei软件也不怎么熟悉,还以为这次交通灯控制器的设计是跟我们做的EDA用QuartusII做的交通灯实验差不多,但经过一番了解还是发现有许多不同,只能说是相互关联。
大学三年,我们学习了很多工程技术的知识,做过一些专业实训和实验,但却经常性的忽视在这些课程中的课程设计这个关键环节,认为它们只不过是走过场,抄抄代码,写写报告就够了。
其实不然,课程设计本身就是一次做项目的经历,它要求你严格按照项目规程操作,在时间和进度上,都要有项目意
通过这段时间老师对本次课程设计的讲解和自己对robei的熟悉和学习,发现了自己EDA上的很多不足,发现了很多知识上的漏洞。
同时也看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。
这次课程设计让我学到了很多,不仅是巩固了先前学的quartus的使用,而且也学会了新的robei软件的使用,通过两个软件的对比更进一步加强了对FPGA工作原理的理解、提升的自己对verilog的编程能力。
还有一点是我们做任何事情都无法缺少的,那就是细心认真、耐心调试。
很多知名的程序在正式发布之前都会有α、β等测试版本,为的就是在反复的试验中发现那些程序员无法发现的小BUG。
此次设计我们就深深地体会到了,由于编程的时候没有做到足够的细心,导致一串代码弄混了。
但是密密麻麻的英文字母混在一起,我始终没有发现。
最终在调试的时候,就出现了问题。
只知道出现了问题,就是不知道到问题的根源在哪里,好长时间都没有找出问题的所在。
这也让我真正的明白了,科学的严谨性,它不允许出半点去对待差错,否则后果会是比较麻烦的。
通过分析将交通灯控制系统分为四个模块:
分频模块、计时模块、控制模块和显示译码模块。
信号灯在计数器的计数信号的控制下各个工作状态之间的转换非常明确,所以可利用状态机来对控制模块进行设计。
计数器采用倒计时的方式,由于使用7段数码显示器来模拟时间显示,所以需要将计时模块的输出信号转化为数码显示器的驱动信号,中间涉及到十进制和二进制之间的转换。
在设计中采用Verilog
HDL语言设计交通灯控制系统,
借助其功能强大的语言结构,
简明的代码描述复杂控制逻辑设计,
与工艺无关特性,
在提高工作效率的同时达到求解目的,
并可以通过Verilog
语言的综合工具进行相应硬件电路生成,
具有传统逻辑设计方法所无法比拟的优越性。
在设计过程中,觉得最难的部分是波形仿真部分,虽然程序编译通过但仿真却比较难实现正确的波形,不是计数器无法正常计数,就是控制输出无法进入到下一个状态,每次出现问题就必须返回重新修改程序。
实践证明,在编写一个较复杂的程序时,一开始一定要先把各个模块分析透彻,弄清楚各个功能及实现它们的逻辑算法,做到心中有数后在开始下笔写编写程序