基于FPGA的交通灯控制系统_基于fpga的交通灯控制

2020-02-28 其他范文 下载本文

基于FPGA的交通灯控制系统由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“基于fpga的交通灯控制”。

基于FPGA的交通灯控制系统

摘 要:针对现实中越来越严重的城市交通拥堵现象,提出了一种城市十字路口 交通信号灯控制与FPGA实现的新方法。利用超高速硬件描述语言VHDL设计十字路口交通信号灯控制器,实现主干道和支干道的交通控制功能,实时监测每个路口的车辆通行情况,以此更改主干道与支干道的交通灯状态,提高十字路口的车辆通行效率,最后通过硬件测试实现具体功能。

关键词:VHDL FPGA 交通灯控制

一、概述 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输入,用来计数,道路行车检测由pa_state1,pa_state0控制,pa_state1为主干道行车检测,pa_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 顶层模块源程序

LIBRARY IEEE;---自动交通灯控制系统顶层描述 USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY TRAFFIC_LIGHT_CONTROL IS PORT(CLK1hz,CLK1khz : IN STD_LOGIC;---信号时钟输入

PASS_STATE : IN STD_LOGIC_VECTOR(1 DOWNTO 0);---主支通道的通车情况,低位为支通道高位为主通道,0为无车1为有车

ALIGHT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---主干道红绿黄灯控制信号 BLIGHT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---支干道红绿黄灯控制信号 SEL : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---输出数码管位选信号 LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)---输出数码管段选信号);END ENTITY TRAFFIC_LIGHT_CONTROL;

ARCHITECTURE behav OF TRAFFIC_LIGHT_CONTROL IS COMPONENT STATE_CONTROL PORT(CLK1 : IN STD_LOGIC;---1Hz时钟信号输入

PASS_STATE_IN : IN STD_LOGIC_VECTOR(1 DOWNTO 0);---主支通道的通车情况,低位为支通道高位为主通道,0为无车1为有车

A_LIGHT: OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---主干道红绿黄灯控制信号 B_LIGHT: OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---支干道红绿黄灯控制信号 CNTOUT : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);---已计数时间输出

STATEOUT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0)---状态输出,传递给数码显示模块);END COMPONENT;

COMPONENT DISPLAY PORT(CLK2 : IN STD_LOGIC;---1KHz时钟信号输入

CNTIN : IN STD_LOGIC_VECTOR(5 DOWNTO 0);---亮灯已过时间输入 STATEIN : IN STD_LOGIC_VECTOR(1 DOWNTO 0);---状态输入

LED7SOUT : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);---数码管段选信号输出 SELOUT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)---数码管位选信号输出);END COMPONENT;

SIGNAL MSTATE : STD_LOGIC_VECTOR(1 DOWNTO 0);---中间信号传递通车状态

SIGNAL MCNT : STD_LOGIC_VECTOR(5 DOWNTO 0);---中间信号传递亮灯已计数时间

BEGIN---例化语句

U1: STATE_CONTROL PORT MAP(CLK1=>CLK1hz,PASS_STATE_IN=>PASS_STATE,B_LIGHT=>BLIGHT, A_LIGHT=>ALIGHT, CNTOUT=>MCNT, STATEOUT=>MSTATE);U2: DISPLAY PORT MAP(CLK2=>CLK1khz,CNTIN=>MCNT,STATEIN=>MSTATE,LED7SOUT=>LED7S,SELOUT=>SEL);

END ARCHITECTURE behav;6.2 交通灯状态转换模块源程序

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY STATE_CONTROL IS GENERIC(GREENA_CNT:INTEGER:=45;---主通道绿灯亮的时间45s

YELLOWA_CNT:INTEGER:=5;---主通道黄灯亮的时间5s

GREENB_CNT:INTEGER:=25;---支通道绿灯亮的时间25s

YELLOWB_CNT:INTEGER:=5);---支通道黄灯亮的时间5s PORT(CLK1 : IN STD_LOGIC;---1Hz时钟信号输入

PASS_STATE_IN : IN STD_LOGIC_VECTOR(1 DOWNTO 0);---主支通道的通车情况,低位为支通道高位为主通道,0为无车1为有车

A_LIGHT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---主干道红绿黄灯控制信号 B_LIGHT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);---支干道红绿黄灯控制信号 CNTOUT : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);---已计数时间输出 STATEOUT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0)---剩余时间输出显示);END ENTITY STATE_CONTROL;

ARCHITECTURE behav OF STATE_CONTROL IS TYPE STATES IS(ST0,ST1,ST2,ST3);---4个状态分别为【主绿支红45s、主黄支红5s、支绿主红25s、支黄主红5s、】

SIGNAL STATE : STATES:=ST0;---初始化状态为状态0 SIGNAL CNT_EN : STD_LOGIC:='0';---计数使能控制信号,初始不计数

SIGNAL CNT : STD_LOGIC_VECTOR(5 DOWNTO 0):=“000001”;---因为初始不计数,但已过一个周期,所以初值为1 BEGIN

PROCESS(CLK1)BEGIN IF CLK1'EVENT AND CLK1 = '0' THEN

IF(CNT_EN='1')THEN---计数模块

CNT

CNT IF(CNT=GREENA_CNT)THEN---主绿支红若计数满45s则根据主支通道的通车情况决定转入下一个状态

CASE PASS_STATE_IN IS

WHEN “00” => STATE

WHEN “01” => STATE

WHEN “10” => STATE

WHEN “11” => STATE

WHEN OTHERS => NULL;

END CASE;ELSE

STATE

END IF;WHEN ST1 =>---主黄支红若计数满5s则根据主支通道的通车情况决定转入下一个状态

IF(CNT=YELLOWA_CNT)THEN

CASE PASS_STATE_IN IS

WHEN “00” => STATE

WHEN “01” => STATE

WHEN “10” => STATE

WHEN “11” => STATE

WHEN OTHERS => NULL;

END CASE;ELSE

STATE---支绿主红若计数满25s则根据主支通道的通车情况决定转入下一个状态

IF(CNT=GREENB_CNT)THEN

CASE PASS_STATE_IN IS

WHEN “00” => STATE

WHEN “01” => STATE

WHEN “10” => STATE

WHEN “11” => STATE

WHEN OTHERS => NULL;

END CASE;ELSE

STATE

END IF;

WHEN ST3 =>---支黄主红若计数满5s则根据主支通道的通车情况决定转入下一个状态

IF(CNT=YELLOWA_CNT)THEN

CASE PASS_STATE_IN IS

WHEN “00” => STATE

WHEN “01” => STATE

WHEN “10” => STATE

WHEN “11” => STATE

WHEN OTHERS => NULL;

END CASE;ELSE

STATE

END IF;END CASE;END IF;CNTOUT

PROCESS(STATE)BEGIN CASE STATE IS WHEN ST0 =>---状态0时主绿支红

A_LIGHT

WHEN ST1 =>---状态1时主黄支红

A_LIGHT

WHEN ST2 =>---状态2时支绿主红

A_LIGHT

WHEN ST3 =>---状态3时支黄主红

A_LIGHT

END CASE;END PROCESS;END behav;6.3 数码管显示倒计时源程序

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY DISPLAY IS PORT(CLK2 : IN STD_LOGIC;---时钟输入

CNTIN : IN STD_LOGIC_VECTOR(5 DOWNTO 0);---已计数输入,来自状态控制模块 STATEIN : IN STD_LOGIC_VECTOR(1 DOWNTO 0);---状态输入,来自状态控制模块 LED7SOUT : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);---数码管段选信号输出 SELOUT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)---数码管位选信号输出);END ENTITY DISPLAY;ARCHITECTURE behav OF DISPLAY IS BEGIN PROCESS(CLK2)VARIABLE BITSEL : STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIN-----------------------------位选信号循环模块----------------IF CLK2'EVENT AND CLK2='0' THEN CASE BITSEL IS WHEN “000” => BITSEL:=“001”;SELOUT BITSEL:=“010”;SELOUT BITSEL:=“011”;SELOUT BITSEL:=“000”;SELOUT NULL;END CASE;END IF;-------------------------动态显示模块-----------------CASE STATEIN IS WHEN “00” =>---主绿支红状态 OK CASE BITSEL IS WHEN “000” =>---主绿支红状态 点亮支干道十位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN “001” =>---主绿支红状态 点亮支干道个位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN “010” =>---主绿支红状态 点亮主干道十位数字 OK CASE CNTIN IS WHEN “000000” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN “011” =>---主绿支红状态 点亮主干道个位数字 OK CASE CNTIN IS WHEN “000000” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;

WHEN OTHERS => NULL;END CASE;-----------WHEN “01” =>---主黄支红状态 OK CASE BITSEL IS WHEN “000” =>---主黄支红状态 点亮支干道十位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN “001” =>---主黄支红状态 点亮支干道个位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN “010”=>---主黄支红状态 点亮主干道十位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN“011” =>---主黄支红状态 点亮主干道个位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN OTHERS => NULL;END CASE;-----------------------WHEN “10” =>---支绿主红状态 OK CASE BITSEL IS WHEN “000” =>---支绿主红状态 点亮支干道十位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN “001” =>---支绿主红状态 点亮支干道个位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN “010” =>---支绿主红状态 点亮主干道十位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN“011” =>---支绿主红状态 点亮主干道个位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;

WHEN OTHERS => NULL;END CASE;------------

WHEN “11” =>---支黄主红状态 OK CASE BITSEL IS WHEN “000” =>---支黄主红状态 点亮支干道十位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN “001” =>---支黄主红状态 点亮支干道个位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN “010” =>---支黄主红状态 点亮主干道十位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;WHEN “011” =>---支黄主红状态 点亮主干道个位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT LED7SOUT LED7SOUT LED7SOUT LED7SOUT NULL;END CASE;

WHEN OTHERS => NULL;END CASE;

------------END CASE;END PROCESS;END behav;

《基于FPGA的交通灯控制系统.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
基于FPGA的交通灯控制系统
点击下载文档
相关专题 基于fpga的交通灯控制 控制系统 交通灯 FPGA 基于fpga的交通灯控制 控制系统 交通灯 FPGA
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文