基于FPGA的交通信号灯设计.docx
《基于FPGA的交通信号灯设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的交通信号灯设计.docx(29页珍藏版)》请在冰豆网上搜索。
基于FPGA的交通信号灯设计
基于FPGA的交通信号灯设计
摘要:
该设计是针对交通信号灯操纵器的设计问题,采纳EDA技术实现的交通灯操纵电路的设计方案。
本设计有效的克服了传统的交通灯操纵的缺点而采取自上而下的设计思路。
该设计在软件QuartusⅡ下应用硬件描述语言VHDL语言完成设计文件,并对其进行了功能仿真和时序仿真,且给出了相应的仿真结果,绘制出了具体的逻辑电路,最后将其下载到Alter公司生产的CycloneⅡ系列的EP2C8Q208开发板上进行逻辑验证,实现软件和硬件的安全连接,达到了对交通灯的自动安全操纵的目的。
关键字:
交通灯操纵;EDA;VHDL;QuartusⅡ;EP2C8Q208
TrafficcontrollightsdesignbasedonFPGA
Abstract:
ThedesignisfortrafficsignalcontrollerdesignissuesbasedonEDAtechnologyfortrafficlightcontrolcircuitdesign.Thisdesigneffectivelyovercomethetraditionaltrafficlightcontrolweaknessesandtakeatop-downapproachtodesign.ThedesigninsoftwareQuartusⅡunderhardwaredescriptionlanguageVHDLcompletedesigndocumentsgoonfunctionalsimulationandtemporalsimulation,itdrawsoutthespecificlogiccircuitsandgivingthesimulationresults,andlastdownloadittoAltercorporateproductionofCycloneⅡseriesofEP2C8Q208DevelopmentBoardforlogicalvalidation,itimplementsoftwareandhardwaresecurityconnectionandreachedthetrafficlightsofautomaticsafetycontrolpurposes.
KeyWords:
trafficlightcontrol;EDA;VHDL;QuartusⅡ;EP2C8Q208
引言
随着社会和汽车工业的快速进展,近几年机动车辆急剧增加,道路超负荷承载现象日趋严峻,致使交通事故逐年增加。
交通信号灯是城市交通有序、安全、快速运行的重要保障,而交通信号灯的正常工作就成了保障交通有序、安全、快速运行的关键。
如何实现人、车、路三者关系的和谐,已成为交通治理部门需要切实解决的问题[1]。
该设计分析了现代城市交通操纵与治理问题的现状,结合城乡交通的实际情形论述了交通灯操纵系统的工作原理,采纳了层次化的设计方式[2]、[3],基于VHDL语言实现红绿灯的自动指挥的硬件实现方式。
通过电路优化设计,能够利用规模更小的可编程逻辑芯片,从而降低系统本钱。
⒈概述
随着我国城市化建设的进展,人民的生活水平日渐提高,愈来愈多的汽车进入了寻常老百姓的家庭,再加上政府大力进展公交车、出租车,使得道路上车辆愈来愈多,许多大城市如北京、上海、南京等均显现了道路交通超负荷运行的情形。
道路安全问题慢慢成为人们关注的热点话题,因此,如何采纳适合的操纵方式,最大限度利用好现有道路资源,减缓城区的交通拥堵状况,保障人们的出行安全愈来愈成为交通治理亟待解决的要紧问题。
在这种情形下,道路交通信号灯开始发挥了愈来愈重要的作用,并已成为交管部门治理交通的重要工具之一。
交通灯的介绍
现今,红绿灯安装在各个道口上,已经成为疏导交通车辆最多见和最有效的手腕。
但这一技术在19世纪就已显现了。
1858年,在英国伦敦要紧街头安装了以燃煤气为光源的红,蓝两色的机械扳手式信号灯,用以指挥马车通行。
这是世界上最先的交通信号灯。
1868年,英国机械工程师纳伊特在伦敦威斯敏斯特区的议会大厦前的广场上,安装了世界上最先的煤气红绿灯。
1914年由红绿黄三色圆形的投光器组成的红绿灯始安装于纽约市5号大街的一座高塔上。
1918年,又显现了带操纵的红绿灯和红外线红绿灯[4]。
信号灯的显现,使交通得以有效管制,关于疏导交通流量、提高道路通行能力,减少交通事故有明显成效。
1968年,联合国《道路交通和道路标志信号协定》对各类信号灯的含义作了规定。
绿灯是通行信号,面对绿灯的车辆能够直行,左转弯和右转弯,除非另一种标志禁止某一种转向。
左右转弯车辆都必需让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。
红灯是禁行信号,面对红灯的车辆必需在交叉路口的停车线后停车。
黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时能够进入交叉路口。
EDA技术的进展
EDA是电子设计自动化(ElectronicDesignAutomation)的缩写,是指以运算机为工作平台,融合应用电子技术、运算机技术、智能化技术最新功效而研制成的电子CAD通用软件包,要紧能辅助进行三方面的设计工作,即IC设计、电子电路设计和PCB设计[5]、[6]。
是从运算机辅助设计(CAD)、运算机辅助制造(CAM)、运算机辅助测试(CAT)和运算机辅助工程(CAE)的概念进展而来的。
EDA技术确实是以运算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由运算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直相当于特定目标芯片的适配编译、逻辑映射和编程下载的高层次的电子设计方式。
EDA技术的显现,极大地提高了电路设计的效率和可用性,减轻了设计者的劳动强度。
EDA技术是电子设计领域的一场革命,代表了现今电子设计技术的最新进展方向,目前正处于高速进展时期,每一年都有新的EDA工具问世。
基于FPGA的交通灯的优势
传统的交通灯操纵系统多数由单片机或PLC实现,基于EDA技术FPGA的设计方式设计交通灯系统确实是利用硬件描述语言(HDL)来完成系统的设计文件,应用VHDL的数字电路[7]、[8]、[9]实验降低了数字系统的设计难度,这在电子设计领域已取得设计者的普遍采纳。
具有周期短,设计灵活,易于修改等明显的优势,而且随着FPGA器件、设计语言和电子设计自动化工具的进展和改良,愈来愈多的电子系统采纳FPGA来设计,还有,通过FPGA设计电子系统,一旦该系统能够达到必然规模的量产,很容易转化为ASIC芯片设计。
相信在以后,FPGA设计方式将更大规模的应用于各类类型的电子系统设计中。
本设计确实是针对交通信号灯操纵器的设计问题,并采纳自顶向下的设计思路。
提出了基于VHDL语言的交通信号灯系统的硬件实现方式。
通过对系统进行结构分析,采纳了层次化的设计方式,给出了各个模块的VHDL程序,而且利用QuartusⅡ对应用程序进行了仿真,并给出了相应的仿真结果。
在用VHDL语言进行电路设计时,应充分熟悉到VHDL语言的特点,从设计思想、语句运用及描述方式上等多方面对电路进行优化设计。
通过电路优化设计,能够利用规模更小的可编程逻辑芯片,从而降低系统本钱。
2.操纵系统的设计
系统设计要求
所要设计的交通信号灯操纵电路,要能够适用于由一条骨干道和一条支干道的汇合点形成的十字交叉路口,主、支干道的红绿灯闪亮时刻不完全相同。
具体的设计要求如下:
实现操纵一条骨干道和一条次干道汇合组成的十字交叉路口,使主、支干道上的车辆行人交替通行,其中骨干道车辆行人通行35秒,现在支干道上车辆行人禁止通行;支干道车辆通行25秒,一样现在骨干道上车辆禁止通行。
每当信号灯由绿灯转换成红灯之前,黄灯要先亮5秒,现在另一个干道红灯不变,禁止通行。
在黄灯亮点亮5秒,以提示车辆行人。
在骨干道上安装有数码管,用来显示本道各信号灯闪亮的剩余时刻。
整体设计思路
通过参考其他的相关文献[6]、[9]、[10]、[11]、[12]、[13],对照研究如基于单片机、基于分立元件等其他设计手腕的优缺点,咱们以为利用基于FPGA的设计方式具有周期短,设计灵活,易于修改等明显的优势,通过FPGA设计电子系统,一旦该系统能够达到必然规模的量产,很容易转化为ASIC芯片设计。
本设计的交通信号操纵操纵电路实现原理是:
把由50M的有源晶振产生的现场可编程逻辑器件FPGA的系统时钟输入到分频模块,经分频模块分频产生频率为1Hz的时钟脉冲,作为操纵按时模块、操纵模块、紧急模块、计数模块的时钟信号,然后再由按时模块来操纵紧急模块和操纵模块,依照交通治理规则操纵交通工作状态的切换,最后,由系统时钟和计数模块和操纵模块来一起操纵计数器操纵模块,计数器的时钟为1Hz,再把计数器操纵模块送出的BCD码送给译码器译码后,送给数码管显示各方向直行绿灯的倒计时。
模块图如图1所示:
图1交通灯操纵系统模块图
CycloneⅡ系列的EP2C8Q208的脉冲为50MHZ,为了保证设计的精度,在设计的进程中采纳两次分频,同时在设计进程中为了避免显现意外情形的发生,加入了一个操纵信号操纵交通灯的启用或停止,交通信号操纵电路实现原理如图2所示:
图2交通灯操纵系统原理电路图
操纵电路的模块VHDL设计实现
2.3.1分频模块
libraryieee;
usejiao_tongis
port(clk:
instd_logic);--20MHz晶振时钟
endjiao_tong;
architecturefenpinofjiao_tongis
signalclk1khz,clk1hz:
std_logic;---分频信号包括1hz和1khz
begin
p1:
process(clk)
variablecount:
integerrange0to9999;
begin
ifclk'eventandclk='1'then
ifcount=9999thenclk1khz<=notclk1khz;count:
=0;
elsecount:
=count+1;
endif;
endif;
endprocessp1;
p2:
process(clk1khz)-------------------------1hz分频---
variablecount:
integerrange0to499;
begin
ifclk1khz'eventandclk1khz='1'then
ifcount=499thenclk1hz<=notclk1hz;count:
=0;
elsecount:
=count+1;
endif;
endif;
endprocessp2;
endfenpin;
2.3.2按时模块
p3:
process(clk1hz)
variablea:
std_logic;---倒计时赋值标志位
variableqh:
std_logic_vector(3downto0);---计数的高位和低位
variableql:
std_logic_vector(3downto0);
begin
ifclk1hz'eventandclk1hz='1'then----若是是下降延
ifjin='0'then---状态st1,骨干道通行35s
ifa='0'then
qh:
="0011";ql:
="0100";
a:
='1';
elsifqh=0andql=1then--若是倒计时终止,则转到st2状态
a:
='0';
qh:
="0000";
ql:
="0000";
elsifql=0then---实现倒计时35s
ql:
="1001";
qh:
=qh-1;
else
ql:
=ql-1;
endif;
endif;
endif;
endif;
endp3;
2.3.3状态转换模块
libraryieee;
usejiao_tongis
port(
clk:
instd_logic;--20MHz晶振时钟
jin:
instd_logic);--禁止通行信号
endjiao_tong;
architectureoneofjiao_tongis
typestatesis(st1,st2,st3,st4);---4种状态
signalclk1khz,clk1hz:
std_logic;---分频信号包括1hz和1khz
signalone,ten:
std_logic_vector(3downto0);--倒计时的个位和十位
signalcnt:
std_logic_vector(1downto0);
signaldata:
std_logic_vector(3downto0);---数码管扫描计数信号
signalseg7_temp:
std_logic_vector(6downto0);
signalr1,r2,y1,y2,g1,g2:
std_logic;
begin
p3:
process(clk1hz)------交通状态转换
variablestx:
states;
variablea:
std_logic;---倒计时赋值标志位
variableqh:
std_logic_vector(3downto0);---计数的高位和低位
variableql:
std_logic_vector(3downto0);
begin
ifclk1hz'eventandclk1hz='1'then----若是是下降延
casestxis
whenst1=>ifjin='0'then-------状态st1,骨干道通行35s
ifa='0'then
qh:
="0011";
ql:
="0100";
a:
='1';
r1<='0';
y1<='0';
g1<='1';
r2<='1';
y2<='0';
g2<='0';
else
ifqh=0andql=1then--若是倒计时终止,则转到st2状态
stx:
=st2;
a:
='0';
qh:
="0000";
ql:
="0000";
elsifql=0then---实现倒计时35s
ql:
="1001";
qh:
=qh-1;
else
ql:
=ql-1;
endif;
endif;
endif;
whenst2=>ifjin='0'then------状态st2,骨干道黄灯倒计时5s
ifa='0'then
qh:
="0000";
ql:
="0100";
a:
='1';
r1<='0';
y1<='1';----骨干道黄灯点亮
g1<='0';
r2<='1';----支干道红灯点亮
y2<='0';
g2<='0';
else
ifql=1then---若是倒计时终止,则转到st3状态
stx:
=st3;
a:
='0';
qh:
="0000";
ql:
="0000";
else
ql:
=ql-1;
endif;
endif;
endif;
whenst3=>ifjin='0'then----状态st3,支干道通行25S
ifa='0'then
qh:
="0010";
ql:
="0100";
a:
='1';
r1<='1';----骨干道红灯点亮
y1<='0';
g1<='0';
r2<='0';
y2<='0';
g2<='1';----支干道绿灯点亮
else
ifqh=0andql=1then----如果倒计时结束,则转到st4状态
stx:
=st4;
a:
='0';
qh:
="0000";
ql:
="0000";
elsifql=0then----实现倒计时25S
ql:
="1001";
qh:
=qh-1;
else
ql:
=ql-1;
endif;
endif;
endif;
whenst4=>ifjin='0'then---状态st4,支干道黄灯倒计时5s
ifa='0'then
qh:
="0000";
ql:
="0100";
a:
='1';
r1<='1';---骨干道红灯点亮
y1<='0';
g1<='0';
r2<='0';
y2<='1';---支干道黄灯点亮
g2<='0';
else
ifql=1then-----若是倒计时终止,则转到st1状态
stx:
=st1;
a:
='0';
qh:
="0000";
ql:
="0000";
else
ql:
=ql-1;
endif;
endif;
endif;
endcase;
endif;
one<=ql;ten<=qh;
endprocessp3;
2.3.4禁止通行模块
libraryieee;
usejiao_tongis
port(
clk:
instd_logic;--20MHz晶振时钟
jin:
instd_logic;--禁止通行信号
ra,ya,ga:
outstd_logic;--骨干道红黄绿灯
rb,yb,gb:
outstd_logic);--支红黄绿灯
endjiao_tong;
architectureoneofjiao_tongis
typestatesis(st1,st2,st3,st4);---4种状态
signalclk1khz,clk1hz:
std_logic;---分频信号包括1hz和1khz
signalone,ten:
std_logic_vector(3downto0);--倒计时的个位和十位
signalcnt:
std_logic_vector(1downto0);
signaldata:
std_logic_vector(3downto0);---数码管扫描计数信号
signalseg7_temp:
std_logic_vector(6downto0);
signalr1,r2,y1,y2,g1,g2:
std_logic;
begin
p4:
process(jin,clk1hz,r1,r2,g1,g2,y1,y2,seg7_temp)-禁止通行信号数码管闪烁显示
begin
ifjin='1'then
ra<=r1orjin;---骨干道红灯点亮
rb<=r2orjin;---支干道红灯点亮
ga<=g1and(notjin);
gb<=g2and(notjin);
ya<=y1and(notjin);
yb<=y2and(notjin);
seg7(0)<=seg7_temp(0)andclk1hz;------实现数码管闪烁显示
seg7
(1)<=seg7_temp
(1)andclk1hz;
seg7
(2)<=seg7_temp
(2)andclk1hz;
seg7(3)<=seg7_temp(3)andclk1hz;
seg7(4)<=seg7_temp(4)andclk1hz;
seg7(5)<=seg7_temp(5)andclk1hz;
seg7(6)<=seg7_temp(6)andclk1hz;
else
seg7<=seg7_temp;
ra<=r1;
rb<=r2;
ga<=g1;
gb<=g2;
ya<=y1;
yb<=y2;
endif;
endprocessp4;
2.3.5显示模块
p5:
process(clk1khz)--------数码管动态扫描计数---
begin
ifclk1khz'eventandclk1khz='1'then
ifcnt="01"thencnt<="00";
elsecnt<=cnt+1;
endif;
endif;
endprocessp5;
p6:
process(cnt,one,ten)---------数码管动态扫描-----
begin
casecntis
when"00"=>data<=one;scan<="01";
when"01"=>data<=ten;scan<="10";
whenothers=>null;
endcase;
endprocessp6;
p7:
process(data)--------------7段译码---
begin
casedatais
when"0000"=>seg7_temp<="1000000";--0
when"0001"=>seg7_temp<="1111001";--1
when"0010"=>seg7_temp<="0100100";--2
when"0011"=>seg7_temp<="0110000";--3
when"0100"=>seg7_temp<="0011001";--4
when"0101"=>seg7_temp<="0010010";--5
when"0110"=>seg7_temp<="0000010";--6
when"0111"=>seg7_temp<="1111000";--7
when"1000"=>seg7_temp<="0000000";--8
when"1001"=>seg7_temp<="0010000