基于FPGA的交通灯控制系统.docx

上传人:b****6 文档编号:7248900 上传时间:2023-05-11 格式:DOCX 页数:26 大小:654.63KB
下载 相关 举报
基于FPGA的交通灯控制系统.docx_第1页
第1页 / 共26页
基于FPGA的交通灯控制系统.docx_第2页
第2页 / 共26页
基于FPGA的交通灯控制系统.docx_第3页
第3页 / 共26页
基于FPGA的交通灯控制系统.docx_第4页
第4页 / 共26页
基于FPGA的交通灯控制系统.docx_第5页
第5页 / 共26页
基于FPGA的交通灯控制系统.docx_第6页
第6页 / 共26页
基于FPGA的交通灯控制系统.docx_第7页
第7页 / 共26页
基于FPGA的交通灯控制系统.docx_第8页
第8页 / 共26页
基于FPGA的交通灯控制系统.docx_第9页
第9页 / 共26页
基于FPGA的交通灯控制系统.docx_第10页
第10页 / 共26页
基于FPGA的交通灯控制系统.docx_第11页
第11页 / 共26页
基于FPGA的交通灯控制系统.docx_第12页
第12页 / 共26页
基于FPGA的交通灯控制系统.docx_第13页
第13页 / 共26页
基于FPGA的交通灯控制系统.docx_第14页
第14页 / 共26页
基于FPGA的交通灯控制系统.docx_第15页
第15页 / 共26页
基于FPGA的交通灯控制系统.docx_第16页
第16页 / 共26页
基于FPGA的交通灯控制系统.docx_第17页
第17页 / 共26页
基于FPGA的交通灯控制系统.docx_第18页
第18页 / 共26页
基于FPGA的交通灯控制系统.docx_第19页
第19页 / 共26页
基于FPGA的交通灯控制系统.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于FPGA的交通灯控制系统.docx

《基于FPGA的交通灯控制系统.docx》由会员分享,可在线阅读,更多相关《基于FPGA的交通灯控制系统.docx(26页珍藏版)》请在冰点文库上搜索。

基于FPGA的交通灯控制系统.docx

基于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"=>LED7

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2