基于FPGA的交通灯控制系统方案.docx
《基于FPGA的交通灯控制系统方案.docx》由会员分享,可在线阅读,更多相关《基于FPGA的交通灯控制系统方案.docx(31页珍藏版)》请在冰豆网上搜索。
基于FPGA的交通灯控制系统方案
基于FPGA的交通灯控制系统
摘要:
针对现实中越来越严重的城市交通拥堵现象,提出了一种城市十字路口
交通信号灯控制与FPGA实现的新方法。
利用超高速硬件描述语言VHDL设计十字路口交通信号灯控制器,实现主干道和支干道的交通控制功能,实时监测每个路口的车辆通行情况,以此更改主干道与支干道的交通灯状态,提高十字路口的车辆通行效率,最后通过硬件测试实现具体功能。
关键词:
VHDLFPGA交通灯控制
一、概述
1.1设计要求:
(1)设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。
(2)红、绿、黄发光二极管作信号灯。
(3)主干道处于常允许通行的状态,支干道有车来时才允许通行。
主干道亮绿灯时,支干道亮红灯;支干道亮绿灯时,主干道亮红灯。
(4)主、支干道均有车时,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒,设立45秒、25秒计时、显示电路。
(5)在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡,使行驶中的车辆有时间停到禁行线外,设立5秒计时、显示电路。
1.2课题分析
(1)主支道路分4种行车状况,无无、无有、有无、有有,此信号从传感器输出信号得到,作为系统的输入,在本系统中用拨片开关模拟状态输入。
(2)主支道路有4种亮灯情况:
主绿支红、主黄支红、支绿主红、支黄主红。
(3)只要支路无车通行,则一直为主绿支红状态,只有支路有车通过才会进入支绿主红状态。
(4)系统可以根据行车情况智能进入相应亮灯情况,提高了十字路口的通车效率。
(5)用6个发光二极管作为主道路绿黄红三灯显示输出和支道路绿黄红三灯显示输出;用4个数码管分别作为主支道路倒计时显示输出。
二、系统方案设计
2.1整体模块设计
2.1.1整体设计思路
整体设计思路为:
交通灯控制系统主要包括两个模块,即交通灯控制模块和倒计时显示模块。
首先利用教学实验箱提供的1HZ时钟信号,实现计数功能,1s计数一次,同时设定主干道、支干道的交通灯的具体亮灯时间,并将计数结果传给倒计时模块,以实现倒计时模块显示的时间与交通灯的状态相对应。
在交通灯控制过程中,用状态机来实现,设定主干道、支干道的行车检测信号,用以进行状态变换。
每进入一个状态就开始计数,该状态完毕则清零,在下个状态开始时重新计数,实现每个状态亮灯时间不同的需求。
2.1.2整体设计框架
根据系统要求可知:
输入信号为系统时钟,主支道路行车情况模拟输入。
输出信号为主支道路红绿黄显示信号、倒计时显示。
2.2交通灯状态转换模块设计
由原理分析可知系统需要在4种亮灯状态之间切换,所以需要设计一个状态转换控制模块,而倒计时显示则来自部的计数,所以状态转换模块部包含了计数模块,又因为二极管模拟红绿灯显示是和亮灯状态紧密相关的,所以相应的二极管控制整合在状态转换控制模块部。
故在状态转换模块部包含3个子模块,分别为计数模块、状态转换控制模块、二极管实现模块。
最后因为数码管动态显示模块需要根据亮灯状态决定输出,所以本模块还需增加计数输出以与状态输出信号。
该模块计数采用1hz的时钟脉冲,以期实现交通灯的秒数设置。
状态循环控制:
S0:
主干道绿灯支干道红灯45s
S1:
主干道黄灯支干道红灯5s
S2:
主干道红灯支干道绿灯25s
S3:
主干道红灯支干道黄灯5s
2.3数码管倒计时显示模块设计
由于此模块采用了数码管的动态显示原理,所以代码量较多,单独分为一个模块,又因为动态显示倒计时间是与亮灯状态紧密相关的,所以必须从交通灯状态控制模块获取相关的状态输入,引出状态输出信号,以供本模块使用。
又因为动态显示需要较高的时钟频率,所以本模块的时钟信号采用系统输入信号,而非之前计数的1hz时钟。
4位数码管的前两位显示支干道的亮灯时间,后两位显示主干道的亮灯时间。
三、硬件设计
3.1总体设计框图
由clk1hz输入,用来计数,道路行车检测由pass_state1,pass_state0控制,pass_state1为主干道行车检测,pass_state0为支干道行车检测。
1为有车通行,0为无车通行,输出为数码管的位选信号和段选信号,以与6个二极管控制信号。
3.2交通灯状态转换模块
输入计数时钟和行车控制,输出主干道以与支干道红绿黄三灯的控制信号,最重要的是将此时的计数时间输出给倒计时模块,并将4个状态的状态输出信号给倒计时模块,实现在对应的状态下显示对应的时间。
3.3数码管倒计时显示模块
为了实现数码管动态扫描,此模块的时钟使用较高频率,,输入上级电路的计数输出和状态输出,给出位选以与段选信号的控制。
四、硬件测试
4.1引脚分配
Pin_3——1hz时钟输入,用于状态控制模块
Pin_33——24khz时钟输入,用于数码管动态扫描
Pin_4——K1支干道行车模拟输入
Pin_5——K2主干道行车模拟输入
Pin_6,Pin_8,Pin_10——数码管位选信号
Pin_11,Pin_12,Pin_13,Pin_14,Pin_15,Pin_30,Pin_31——数码管段选信号
Pin_34——R1主干道红灯
Pin_35——Y1主干道黄灯
Pin_36——G1主干道绿灯
Pin_37——R2支干道红灯
Pin_39——Y2支干道黄灯
Pin_40——G2支干道绿灯
4.2仿真结果
交通灯显示:
倒计时显示:
S1状态(支红主黄):
S0状态(支红主绿)
五、总结
基本实现了设计所需的功能,能根据道路行车情况实现交通灯的智能控制,并将红绿灯通行的时间通过数码管直观显示出来,较好的完成了十字路口交通情况的模拟。
六、附录
6.1顶层模块源程序
LIBRARYIEEE;---自动交通灯控制系统顶层描述
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYTRAFFIC_LIGHT_CONTROLIS
PORT(CLK1hz,CLK1khz:
INSTD_LOGIC;---信号时钟输入
PASS_STATE:
INSTD_LOGIC_VECTOR(1DOWNTO0);---主支通道的通车情况,低位为支通道高位为主通道,0为无车1为有车
ALIGHT:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);---主干道红绿黄灯控制信号
BLIGHT:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);---支干道红绿黄灯控制信号
SEL:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);---输出数码管位选信号
LED7S:
OUTSTD_LOGIC_VECTOR(6DOWNTO0)---输出数码管段选信号
);
ENDENTITYTRAFFIC_LIGHT_CONTROL;
ARCHITECTUREbehavOFTRAFFIC_LIGHT_CONTROLIS
COMPONENTSTATE_CONTROL
PORT(CLK1:
INSTD_LOGIC;---1Hz时钟信号输入
PASS_STATE_IN:
INSTD_LOGIC_VECTOR(1DOWNTO0);---主支通道的通车情况,低位为支通道高位为主通道,0为无车1为有车
A_LIGHT:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);---主干道红绿黄灯控制信号
B_LIGHT:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);---支干道红绿黄灯控制信号
CNTOUT:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);---已计数时间输出
STATEOUT:
OUTSTD_LOGIC_VECTOR(1DOWNTO0)---状态输出,传递给数码显示模块
);
ENDCOMPONENT;
COMPONENTDISPLAY
PORT(CLK2:
INSTD_LOGIC;---1KHz时钟信号输入
CNTIN:
INSTD_LOGIC_VECTOR(5DOWNTO0);---亮灯已过时间输入
STATEIN:
INSTD_LOGIC_VECTOR(1DOWNTO0);---状态输入
LED7SOUT:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);---数码管段选信号输出
SELOUT:
OUTSTD_LOGIC_VECTOR(2DOWNTO0)---数码管位选信号输出
);
ENDCOMPONENT;
SIGNALMSTATE:
STD_LOGIC_VECTOR(1DOWNTO0);---中间信号传递通车状态
SIGNALMCNT:
STD_LOGIC_VECTOR(5DOWNTO0);---中间信号传递亮灯已计数时间
BEGIN---例化语句
U1:
STATE_CONTROLPORTMAP(CLK1=>CLK1hz,PASS_STATE_IN=>PASS_STATE,B_LIGHT=>BLIGHT,A_LIGHT=>ALIGHT,CNTOUT=>MCNT,STATEOUT=>MSTATE);
U2:
DISPLAYPORTMAP(CLK2=>CLK1khz,CNTIN=>MCNT,STATEIN=>MSTATE,LED7SOUT=>LED7S,SELOUT=>SEL);
ENDARCHITECTUREbehav;
6.2交通灯状态转换模块源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSTATE_CONTROLIS
GENERIC(GREENA_CNT:
INTEGER:
=45;---主通道绿灯亮的时间45s
YELLOWA_CNT:
INTEGER:
=5;---主通道黄灯亮的时间5s
GREENB_CNT:
INTEGER:
=25;---支通道绿灯亮的时间25s
YELLOWB_CNT:
INTEGER:
=5);---支通道黄灯亮的时间5s
PORT(CLK1:
INSTD_LOGIC;---1Hz时钟信号输入
PASS_STATE_IN:
INSTD_LOGIC_VECTOR(1DOWNTO0);---主支通道的通车情况,低位为支通道高位为主通道,0为无车1为有车
A_LIGHT:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);---主干道红绿黄灯控制信号
B_LIGHT:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);---支干道红绿黄灯控制信号
CNTOUT:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);---已计数时间输出
STATEOUT:
OUTSTD_LOGIC_VECTOR(1DOWNTO0)---剩余时间输出显示
);
ENDENTITYSTATE_CONTROL;
ARCHITECTUREbehavOFSTATE_CONTROLIS
TYPESTATESIS(ST0,ST1,ST2,ST3);---4个状态分别为[主绿支红45s、主黄支红5s、支绿主红25s、支黄主红5s、]
SIGNALSTATE:
STATES:
=ST0;---初始化状态为状态0
SIGNALCNT_EN:
STD_LOGIC:
='0';---计数使能控制信号,初始不计数
SIGNALCNT:
STD_LOGIC_VECTOR(5DOWNTO0):
="000001";---因为初始不计数,但已过一个周期,所以初值为1
BEGIN
PROCESS(CLK1)
BEGIN
IFCLK1'EVENTANDCLK1='0'THEN
IF(CNT_EN='1')THEN---计数模块
CNT<=CNT+1;
ELSE
CNT<="000001";---若溢出则计数使能为0,CNT重新赋值为1
ENDIF;
CASESTATEIS---状态循环控制模块
WHENST0=>
IF(CNT=GREENA_CNT)THEN---主绿支红若计数满45s则根据主支通道的通车情况决定转入下一个状态
CASEPASS_STATE_INIS
WHEN"00"=>STATE<=ST0;
WHEN"01"=>STATE<=ST1;
WHEN"10"=>STATE<=ST0;
WHEN"11"=>STATE<=ST1;
WHENOTHERS=>NULL;
ENDCASE;
ELSE
STATE<=ST0;---若计数未满则为原来状态
ENDIF;
WHENST1=>---主黄支红若计数满5s则根据主支通道的通车情况决定转入下一个状态
IF(CNT=YELLOWA_CNT)THEN
CASEPASS_STATE_INIS
WHEN"00"=>STATE<=ST2;
WHEN"01"=>STATE<=ST2;
WHEN"10"=>STATE<=ST2;
WHEN"11"=>STATE<=ST2;
WHENOTHERS=>NULL;
ENDCASE;
ELSE
STATE<=ST1;---若计数未满则为原来状态
ENDIF;
WHENST2=>---支绿主红若计数满25s则根据主支通道的通车情况决定转入下一个状态
IF(CNT=GREENB_CNT)THEN
CASEPASS_STATE_INIS
WHEN"00"=>STATE<=ST3;
WHEN"01"=>STATE<=ST2;
WHEN"10"=>STATE<=ST3;
WHEN"11"=>STATE<=ST3;
WHENOTHERS=>NULL;
ENDCASE;
ELSE
STATE<=ST2;---若计数未满则为原来状态
ENDIF;
WHENST3=>---支黄主红若计数满5s则根据主支通道的通车情况决定转入下一个状态
IF(CNT=YELLOWA_CNT)THEN
CASEPASS_STATE_INIS
WHEN"00"=>STATE<=ST0;
WHEN"01"=>STATE<=ST0;
WHEN"10"=>STATE<=ST0;
WHEN"11"=>STATE<=ST0;
WHENOTHERS=>NULL;
ENDCASE;
ELSE
STATE<=ST3;---若计数未满则为原来状态
ENDIF;
ENDCASE;
ENDIF;
CNTOUT<=CNT;
ENDPROCESS;
PROCESS(STATE)
BEGIN
CASESTATEIS
WHENST0=>---状态0时主绿支红
A_LIGHT<="010";B_LIGHT<="100";CNT_EN<='1';
STATEOUT<="00";---将当前状态传递给数码管显示模块,以供后续使用
IF(CNT=GREENA_CNT)THENCNT_EN<='0';ENDIF;
WHENST1=>---状态1时主黄支红
A_LIGHT<="001";B_LIGHT<="100";CNT_EN<='1';
STATEOUT<="01";---将当前状态传递给数码管显示模块,以供后续使用
IF(CNT=YELLOWA_CNT)THENCNT_EN<='0';ENDIF;
WHENST2=>---状态2时支绿主红
A_LIGHT<="100";B_LIGHT<="010";CNT_EN<='1';
STATEOUT<="10";---将当前状态传递给数码管显示模块,以供后续使用
IF(CNT=GREENB_CNT)THENCNT_EN<='0';ENDIF;
WHENST3=>---状态3时支黄主红
A_LIGHT<="100";B_LIGHT<="001";CNT_EN<='1';
STATEOUT<="11";---将当前状态传递给数码管显示模块,以供后续使用
IF(CNT=YELLOWB_CNT)THENCNT_EN<='0';ENDIF;
ENDCASE;
ENDPROCESS;
ENDbehav;
6.3数码管显示倒计时源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDISPLAYIS
PORT(CLK2:
INSTD_LOGIC;---时钟输入
CNTIN:
INSTD_LOGIC_VECTOR(5DOWNTO0);---已计数输入,来自状态控制模块
STATEIN:
INSTD_LOGIC_VECTOR(1DOWNTO0);---状态输入,来自状态控制模块
LED7SOUT:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);---数码管段选信号输出
SELOUT:
OUTSTD_LOGIC_VECTOR(2DOWNTO0)---数码管位选信号输出
);
ENDENTITYDISPLAY;
ARCHITECTUREbehavOFDISPLAYIS
BEGIN
PROCESS(CLK2)
VARIABLEBITSEL:
STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
-----------------------------位选信号循环模块-----------------------------------------------
IFCLK2'EVENTANDCLK2='0'THEN
CASEBITSELIS
WHEN"000"=>BITSEL:
="001";SELOUT<="001";
WHEN"001"=>BITSEL:
="010";SELOUT<="010";
WHEN"010"=>BITSEL:
="011";SELOUT<="011";
WHEN"011"=>BITSEL:
="000";SELOUT<="000";
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
-------------------------动态显示模块------------------------------------------------
CASESTATEINIS
WHEN"00"=>---主绿支红状态OK
CASEBITSELIS
WHEN"000"=>---主绿支红状态点亮支干道十位数字OK
CASECNTINIS
WHEN"000001"=>LED7SOUT<="1101101";---0150
WHEN"000010"=>LED7SOUT<="1100110";---0249
WHEN"000011"=>LED7SOUT<="1100110";
WHEN"000100"=>LED7SOUT<="1100110";
WHEN"000101"=>LED7SOUT<="1100110";
WHEN"000110"=>LED7SOUT<="1100110";---0645
WHEN"000111"=>LED7SOUT<="1100110";
WHEN"001000"=>LED7SOUT<="1100110";
WHEN"001001"=>LED7SOUT<="1100110";
WHEN"001010"=>LED7SOUT<="1100110";
WHEN"001011"=>LED7SOUT<="1100110";---1140
WHEN"001100"=>LED7SOUT<="1001111";
WHEN"001101"=>LED7SOUT<="1001111";
WHEN"001110"=>LED7SOUT<="1001111";
WHEN"001111"=>LED7SOUT<="1001111";
WHEN"010000"=>LED7SOUT<="1001111";---1635
WHEN"010001"=>LED7SOUT<="1001111";
WHEN"010010"=>LED7SOUT<="1001111";
WHEN"010011"=>LED7SOUT<="1001111";
WHEN"010100"=>LED7SOUT<="1001111";
WHEN"010101"=>LED7SOUT<="1001111";---2130
WHEN"010110"=>LED7SOUT<="1011011";
WHEN"010111"=>LED7SOUT<="1011011";
WHEN"011000"=>LED7SOUT<="1011011";
WHEN"011001"=>LED7SOUT<="1011011";
WHEN"011010"=>LED7SOUT<="1011011";---2625
WHEN"011011"=>LED7SOUT<="1011011";
WHEN"011100"=>LED7SOUT<="1011011";
WHEN"011101"=>LED7SOUT<="1011011";
WHEN"011110"=>LED7SOUT<="1011011";
WHEN"011111"=>LED7SOUT<="1011011";---3120
WHEN"100000"=>LED7SOUT<="0000110";
WHEN"100001"=>LED7SOUT<="0000110";
WHEN"100010"=>LED7SOUT<="0000110";
WHEN"100011"=>LED7SOUT<="0000110";
WHEN"100100"=>LED7SOUT<="0000110";---3615
WHEN"100101"=>LED7SOUT<="0000110";
WHEN"100110"=>LED7SO