第一篇:基于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输入,用来计数,道路行车检测由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 顶层模块源程序
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+1;ELSE
CNT<=“000001”;---若溢出则计数使能为0,CNT重新赋值为1 END IF;CASE STATE IS---状态循环控制模块 WHEN ST0 => IF(CNT=GREENA_CNT)THEN---主绿支红若计数满45s则根据主支通道的通车情况决定转入下一个状态
CASE PASS_STATE_IN IS
WHEN “00” => STATE<=ST0;
WHEN “01” => STATE<=ST1;
WHEN “10” => STATE<=ST0;
WHEN “11” => STATE<=ST1;
WHEN OTHERS => NULL;
END CASE;ELSE
STATE<=ST0;---若计数未满则为原来状态
END IF;WHEN ST1 =>---主黄支红若计数满5s则根据主支通道的通车情况决定转入下一个状态
IF(CNT=YELLOWA_CNT)THEN
CASE PASS_STATE_IN IS
WHEN “00” => STATE<=ST2;
WHEN “01” => STATE<=ST2;
WHEN “10” => STATE<=ST2;
WHEN “11” => STATE<=ST2;
WHEN OTHERS => NULL;
END CASE;ELSE
STATE<=ST1;---若计数未满则为原来状态 END IF;WHEN ST2 =>---支绿主红若计数满25s则根据主支通道的通车情况决定转入下一个状态
IF(CNT=GREENB_CNT)THEN
CASE PASS_STATE_IN IS
WHEN “00” => STATE<=ST3;
WHEN “01” => STATE<=ST2;
WHEN “10” => STATE<=ST3;
WHEN “11” => STATE<=ST3;
WHEN OTHERS => NULL;
END CASE;ELSE
STATE<=ST2;---若计数未满则为原来状态
END IF;
WHEN ST3 =>---支黄主红若计数满5s则根据主支通道的通车情况决定转入下一个状态
IF(CNT=YELLOWA_CNT)THEN
CASE PASS_STATE_IN IS
WHEN “00” => STATE<=ST0;
WHEN “01” => STATE<=ST0;
WHEN “10” => STATE<=ST0;
WHEN “11” => STATE<=ST0;
WHEN OTHERS => NULL;
END CASE;ELSE
STATE<=ST3;---若计数未满则为原来状态
END IF;END CASE;END IF;CNTOUT<=CNT;END PROCESS;
PROCESS(STATE)BEGIN CASE STATE IS WHEN ST0 =>---状态0时主绿支红
A_LIGHT<=“010”;B_LIGHT<=“100”;CNT_EN<='1';STATEOUT<=“00”;---将当前状态传递给数码管显示模块,以供后续使用 IF(CNT=GREENA_CNT)THEN CNT_EN<='0';END IF;
WHEN ST1 =>---状态1时主黄支红
A_LIGHT<=“001”;B_LIGHT<=“100”;CNT_EN<='1';STATEOUT<=“01”;---将当前状态传递给数码管显示模块,以供后续使用 IF(CNT=YELLOWA_CNT)THEN CNT_EN<='0';END IF;
WHEN ST2 =>---状态2时支绿主红
A_LIGHT<=“100”;B_LIGHT<=“010”;CNT_EN<='1';STATEOUT<=“10”;---将当前状态传递给数码管显示模块,以供后续使用 IF(CNT=GREENB_CNT)THEN CNT_EN<='0';END IF;
WHEN ST3 =>---状态3时支黄主红
A_LIGHT<=“100”;B_LIGHT<=“001”;CNT_EN<='1';STATEOUT<=“11”;---将当前状态传递给数码管显示模块,以供后续使用 IF(CNT=YELLOWB_CNT)THEN CNT_EN<='0';END IF;
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<=“001”;WHEN “001” => BITSEL:=“010”;SELOUT<=“010”;WHEN “010” => BITSEL:=“011”;SELOUT<=“011”;WHEN “011” => BITSEL:=“000”;SELOUT<=“000”;WHEN OTHERS => NULL;END CASE;END IF;-------------------------动态显示模块-----------------CASE STATEIN IS WHEN “00” =>---主绿支红状态 OK CASE BITSEL IS WHEN “000” =>---主绿支红状态 点亮支干道十位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;---01 50 WHEN “000010” => LED7SOUT <= “1100110”;---02 49 WHEN “000011” => LED7SOUT <= “1100110”;WHEN “000100” => LED7SOUT <= “1100110”;WHEN “000101” => LED7SOUT <= “1100110”;WHEN “000110” => LED7SOUT <= “1100110”;---06 45 WHEN “000111” => LED7SOUT <= “1100110”;WHEN “001000” => LED7SOUT <= “1100110”;WHEN “001001” => LED7SOUT <= “1100110”;WHEN “001010” => LED7SOUT <= “1100110”;WHEN “001011” => LED7SOUT <= “1100110”;---11 40 WHEN “001100” => LED7SOUT <= “1001111”;WHEN “001101” => LED7SOUT <= “1001111”;WHEN “001110” => LED7SOUT <= “1001111”;WHEN “001111” => LED7SOUT <= “1001111”;WHEN “010000” => LED7SOUT <= “1001111”;---16 35 WHEN “010001” => LED7SOUT <= “1001111”;WHEN “010010” => LED7SOUT <= “1001111”;WHEN “010011” => LED7SOUT <= “1001111”;WHEN “010100” => LED7SOUT <= “1001111”;WHEN “010101” => LED7SOUT <= “1001111”;---21 30 WHEN “010110” => LED7SOUT <= “1011011”;WHEN “010111” => LED7SOUT <= “1011011”;WHEN “011000” => LED7SOUT <= “1011011”;WHEN “011001” => LED7SOUT <= “1011011”;WHEN “011010” => LED7SOUT <= “1011011”;---26 25 WHEN “011011” => LED7SOUT <= “1011011”;WHEN “011100” => LED7SOUT <= “1011011”;WHEN “011101” => LED7SOUT <= “1011011”;WHEN “011110” => LED7SOUT <= “1011011”;WHEN “011111” => LED7SOUT <= “1011011”;---31 20 WHEN “100000” => LED7SOUT <= “0000110”;WHEN “100001” => LED7SOUT <= “0000110”;WHEN “100010” => LED7SOUT <= “0000110”;WHEN “100011” => LED7SOUT <= “0000110”;WHEN “100100” => LED7SOUT <= “0000110”;---36 15 WHEN “100101” => LED7SOUT <= “0000110”;WHEN “100110” => LED7SOUT <= “0000110”;WHEN “100111” => LED7SOUT <= “0000110”;WHEN “101000” => LED7SOUT <= “0000110”;WHEN “101001” => LED7SOUT <= “0000110”;---41 10 WHEN “101010” => LED7SOUT <= “0111111”;WHEN “101011” => LED7SOUT <= “0111111”;WHEN “101100” => LED7SOUT <= “0111111”;WHEN “101101” => LED7SOUT <= “0111111”;---45 06 WHEN OTHERS => NULL;END CASE;WHEN “001” =>---主绿支红状态 点亮支干道个位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;---01 50 WHEN “000010” => LED7SOUT <= “1101111”;---02 49 WHEN “000011” => LED7SOUT <= “1111111”;WHEN “000100” => LED7SOUT <= “0000111”;WHEN “000101” => LED7SOUT <= “1111101”;WHEN “000110” => LED7SOUT <= “1101101”;WHEN “000111” => LED7SOUT <= “1100110”;---07 44 WHEN “001000” => LED7SOUT <= “1001111”;WHEN “001001” => LED7SOUT <= “1011011”;WHEN “001010” => LED7SOUT <= “0000110”;WHEN “001011” => LED7SOUT <= “0111111”;WHEN “001100” => LED7SOUT <= “1101111”;---12 39 WHEN “001101” => LED7SOUT <= “1111111”;WHEN “001110” => LED7SOUT <= “0000111”;WHEN “001111” => LED7SOUT <= “1111101”;WHEN “010000” => LED7SOUT <= “1101101”;WHEN “010001” => LED7SOUT <= “1100110”;---17 34 WHEN “010010” => LED7SOUT <= “1001111”;WHEN “010011” => LED7SOUT <= “1011011”;WHEN “010100” => LED7SOUT <= “0000110”;WHEN “010101” => LED7SOUT <= “0111111”;WHEN “010110” => LED7SOUT <= “1101111”;---22 29 WHEN “010111” => LED7SOUT <= “1111111”;WHEN “011000” => LED7SOUT <= “0000111”;WHEN “011001” => LED7SOUT <= “1111101”;WHEN “011010” => LED7SOUT <= “1101101”;WHEN “011011” => LED7SOUT <= “1100110”;---27 24 WHEN “011100” => LED7SOUT <= “1001111”;WHEN “011101” => LED7SOUT <= “1011011”;WHEN “011110” => LED7SOUT <= “0000110”;WHEN “011111” => LED7SOUT <= “0111111”;WHEN “100000” => LED7SOUT <= “1101111”;---32 19 WHEN “100001” => LED7SOUT <= “1111111”;WHEN “100010” => LED7SOUT <= “0000111”;WHEN “100011” => LED7SOUT <= “1111101”;WHEN “100100” => LED7SOUT <= “1101101”;WHEN “100101” => LED7SOUT <= “1100110”;---37 14 WHEN “100110” => LED7SOUT <= “1001111”;WHEN “100111” => LED7SOUT <= “1011011”;WHEN “101000” => LED7SOUT <= “0000110”;WHEN “101001” => LED7SOUT <= “0111111”;---41 09 WHEN “101010” => LED7SOUT <= “1101111”;WHEN “101011” => LED7SOUT <= “1111111”;WHEN “101100” => LED7SOUT <= “0000111”;WHEN “101101” => LED7SOUT <= “1111101”;---45 06 WHEN OTHERS => NULL;END CASE;WHEN “010” =>---主绿支红状态 点亮主干道十位数字 OK CASE CNTIN IS WHEN “000000” => LED7SOUT <= “1111101”;---00 46 WHEN “000001” => LED7SOUT <= “1100110”;WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1100110”;WHEN “000100” => LED7SOUT <= “1100110”;WHEN “000101” => LED7SOUT <= “1100110”;---05 41 WHEN “000110” => LED7SOUT <= “1100110”;WHEN “000111” => LED7SOUT <= “1001111”;WHEN “001000” => LED7SOUT <= “1001111”;WHEN “001001” => LED7SOUT <= “1001111”;WHEN “001010” => LED7SOUT <= “1001111”;---10 36 WHEN “001011” => LED7SOUT <= “1001111”;WHEN “001100” => LED7SOUT <= “1001111”;WHEN “001101” => LED7SOUT <= “1001111”;WHEN “001110” => LED7SOUT <= “1001111”;WHEN “001111” => LED7SOUT <= “1001111”;---15 31 WHEN “010000” => LED7SOUT <= “1001111”;WHEN “010001” => LED7SOUT <= “1011011”;WHEN “010010” => LED7SOUT <= “1011011”;WHEN “010011” => LED7SOUT <= “1011011”;WHEN “010100” => LED7SOUT <= “1011011”;---20 26 WHEN “010101” => LED7SOUT <= “1011011”;WHEN “010110” => LED7SOUT <= “1011011”;WHEN “010111” => LED7SOUT <= “1011011”;WHEN “011000” => LED7SOUT <= “1011011”;WHEN “011001” => LED7SOUT <= “1011011”;---25 21 WHEN “011010” => LED7SOUT <= “1011011”;WHEN “011011” => LED7SOUT <= “0000110”;WHEN “011100” => LED7SOUT <= “0000110”;WHEN “011101” => LED7SOUT <= “0000110”;WHEN “011110” => LED7SOUT <= “0000110”;---30 16 WHEN “011111” => LED7SOUT <= “0000110”;WHEN “100000” => LED7SOUT <= “0000110”;WHEN “100001” => LED7SOUT <= “0000110”;WHEN “100010” => LED7SOUT <= “0000110”;WHEN “100011” => LED7SOUT <= “0000110”;---35 11 WHEN “100100” => LED7SOUT <= “0000110”;---36 10 WHEN “100101” => LED7SOUT <= “0111111”;WHEN “100110” => LED7SOUT <= “0111111”;WHEN “100111” => LED7SOUT <= “0111111”;WHEN “101000” => LED7SOUT <= “0111111”;WHEN “101001” => LED7SOUT <= “0111111”;WHEN “101010” => LED7SOUT <= “0111111”;WHEN “101011” => LED7SOUT <= “0111111”;WHEN “101100” => LED7SOUT <= “0111111”;WHEN “101101” => LED7SOUT <= “0111111”;---45 01 WHEN OTHERS => NULL;END CASE;WHEN “011” =>---主绿支红状态 点亮主干道个位数字 OK CASE CNTIN IS WHEN “000000” => LED7SOUT <= “1111101”;---00 46 WHEN “000001” => LED7SOUT <= “1101101”;---01 45 WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN “000110” => LED7SOUT <= “0111111”;---06 40 WHEN “000111” => LED7SOUT <= “1101111”;WHEN “001000” => LED7SOUT <= “1111111”;WHEN “001001” => LED7SOUT <= “0000111”;WHEN “001010” => LED7SOUT <= “1111101”;WHEN “001011” => LED7SOUT <= “1101101”;---11 35 WHEN “001100” => LED7SOUT <= “1100110”;WHEN “001101” => LED7SOUT <= “1001111”;WHEN “001110” => LED7SOUT <= “1011011”;WHEN “001111” => LED7SOUT <= “0000110”;WHEN “010000” => LED7SOUT <= “0111111”;---16 30 WHEN “010001” => LED7SOUT <= “1101111”;WHEN “010010” => LED7SOUT <= “1111111”;WHEN “010011” => LED7SOUT <= “0000111”;WHEN “010100” => LED7SOUT <= “1111101”;WHEN “010101” => LED7SOUT <= “1101101”;---21 25 WHEN “010110” => LED7SOUT <= “1100110”;WHEN “010111” => LED7SOUT <= “1001111”;WHEN “011000” => LED7SOUT <= “1011011”;WHEN “011001” => LED7SOUT <= “0000110”;WHEN “011010” => LED7SOUT <= “0111111”;---26 20 WHEN “011011” => LED7SOUT <= “1101111”;WHEN “011100” => LED7SOUT <= “1111111”;WHEN “011101” => LED7SOUT <= “0000111”;WHEN “011110” => LED7SOUT <= “1111101”;WHEN “011111” => LED7SOUT <= “1101101”;---31 15 WHEN “100000” => LED7SOUT <= “1100110”;WHEN “100001” => LED7SOUT <= “1001111”;WHEN “100010” => LED7SOUT <= “1011011”;WHEN “100011” => LED7SOUT <= “0000110”;WHEN “100100” => LED7SOUT <= “0111111”;---35 10 WHEN “100101” => LED7SOUT <= “1101111”;WHEN “100110” => LED7SOUT <= “1111111”;WHEN “100111” => LED7SOUT <= “0000111”;WHEN “101000” => LED7SOUT <= “1111101”;WHEN “101001” => LED7SOUT <= “1101101”;WHEN “101010” => LED7SOUT <= “1100110”;WHEN “101011” => LED7SOUT <= “1001111”;WHEN “101100” => LED7SOUT <= “1011011”;WHEN “101101” => LED7SOUT <= “0000110”;---45 01 WHEN OTHERS => NULL;END CASE;
WHEN OTHERS => NULL;END CASE;-----------WHEN “01” =>---主黄支红状态 OK CASE BITSEL IS WHEN “000” =>---主黄支红状态 点亮支干道十位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;WHEN “000010” => LED7SOUT <= “0111111”;WHEN “000011” => LED7SOUT <= “0111111”;WHEN “000100” => LED7SOUT <= “0111111”;WHEN “000101” => LED7SOUT <= “0111111”;WHEN OTHERS => NULL;END CASE;WHEN “001” =>---主黄支红状态 点亮支干道个位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN OTHERS => NULL;END CASE;WHEN “010”=>---主黄支红状态 点亮主干道十位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;WHEN “000010” => LED7SOUT <= “0111111”;WHEN “000011” => LED7SOUT <= “0111111”;WHEN “000100” => LED7SOUT <= “0111111”;WHEN “000101” => LED7SOUT <= “0111111”;WHEN OTHERS => NULL;END CASE;WHEN“011” =>---主黄支红状态 点亮主干道个位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN OTHERS => NULL;END CASE;WHEN OTHERS => NULL;END CASE;-----------------------WHEN “10” =>---支绿主红状态 OK CASE BITSEL IS WHEN “000” =>---支绿主红状态 点亮支干道十位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1011011”;---01 25 WHEN “000010” => LED7SOUT <= “1011011”;WHEN “000011” => LED7SOUT <= “1011011”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “1011011”;WHEN “000110” => LED7SOUT <= “1011011”;---06 20 WHEN “000111” => LED7SOUT <= “0000110”;WHEN “001000” => LED7SOUT <= “0000110”;WHEN “001001” => LED7SOUT <= “0000110”;WHEN “001010” => LED7SOUT <= “0000110”;WHEN “001011” => LED7SOUT <= “0000110”;---11 15 WHEN “001100” => LED7SOUT <= “0000110”;WHEN “001101” => LED7SOUT <= “0000110”;WHEN “001110” => LED7SOUT <= “0000110”;WHEN “001111” => LED7SOUT <= “0000110”;WHEN “010000” => LED7SOUT <= “0000110”;---16 10 WHEN “010001” => LED7SOUT <= “0111111”;WHEN “010010” => LED7SOUT <= “0111111”;WHEN “010011” => LED7SOUT <= “0111111”;WHEN “010100” => LED7SOUT <= “0111111”;WHEN “010101” => LED7SOUT <= “0111111”;---21 05 WHEN “010110” => LED7SOUT <= “0111111”;WHEN “010111” => LED7SOUT <= “0111111”;WHEN “011000” => LED7SOUT <= “0111111”;WHEN “011001” => LED7SOUT <= “0111111”;---25 01 WHEN OTHERS => NULL;END CASE;WHEN “001” =>---支绿主红状态 点亮支干道个位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;---01 25 WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN “000110” => LED7SOUT <= “0111111”;---06 20 WHEN “000111” => LED7SOUT <= “1101111”;WHEN “001000” => LED7SOUT <= “1111111”;WHEN “001001” => LED7SOUT <= “0000111”;WHEN “001010” => LED7SOUT <= “1111101”;WHEN “001011” => LED7SOUT <= “1101101”;---11 15 WHEN “001100” => LED7SOUT <= “1100110”;WHEN “001101” => LED7SOUT <= “1001111”;WHEN “001110” => LED7SOUT <= “1011011”;WHEN “001111” => LED7SOUT <= “0000110”;WHEN “010000” => LED7SOUT <= “0111111”;---16 10 WHEN “010001” => LED7SOUT <= “1101111”;WHEN “010010” => LED7SOUT <= “1111111”;WHEN “010011” => LED7SOUT <= “0000111”;WHEN “010100” => LED7SOUT <= “1111101”;WHEN “010101” => LED7SOUT <= “1101101”;---21 05 WHEN “010110” => LED7SOUT <= “1100110”;WHEN “010111” => LED7SOUT <= “1001111”;WHEN “011000” => LED7SOUT <= “1011011”;WHEN “011001” => LED7SOUT <= “0000110”;---25 01 WHEN OTHERS => NULL;END CASE;WHEN “010” =>---支绿主红状态 点亮主干道十位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1001111”;---01 30 WHEN “000010” => LED7SOUT <= “1011011”;---02 29 WHEN “000011” => LED7SOUT <= “1011011”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “1011011”;WHEN “000110” => LED7SOUT <= “1011011”;---06 25 WHEN “000111” => LED7SOUT <= “1011011”;WHEN “001000” => LED7SOUT <= “1011011”;WHEN “001001” => LED7SOUT <= “1011011”;WHEN “001010” => LED7SOUT <= “1011011”;WHEN “001011” => LED7SOUT <= “1011011”;---11 20 WHEN “001100” => LED7SOUT <= “0000110”;WHEN “001101” => LED7SOUT <= “0000110”;WHEN “001110” => LED7SOUT <= “0000110”;WHEN “001111” => LED7SOUT <= “0000110”;WHEN “010000” => LED7SOUT <= “0000110”;---16 15 WHEN “010001” => LED7SOUT <= “0000110”;WHEN “010010” => LED7SOUT <= “0000110”;WHEN “010011” => LED7SOUT <= “0000110”;WHEN “010100” => LED7SOUT <= “0000110”;WHEN “010101” => LED7SOUT <= “0000110”;---21 10 WHEN “010110” => LED7SOUT <= “0111111”;WHEN “010111” => LED7SOUT <= “0111111”;WHEN “011000” => LED7SOUT <= “0111111”;WHEN “011001” => LED7SOUT <= “0111111”;---25 06 WHEN OTHERS => NULL;END CASE;WHEN“011” =>---支绿主红状态 点亮主干道个位数字 OK CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;---01 30 WHEN “000010” => LED7SOUT <= “1101111”;---02 29 WHEN “000011” => LED7SOUT <= “1111111”;WHEN “000100” => LED7SOUT <= “0000111”;WHEN “000101” => LED7SOUT <= “1111101”;WHEN “000110” => LED7SOUT <= “1101101”;WHEN “000111” => LED7SOUT <= “1100110”;---07 24 WHEN “001000” => LED7SOUT <= “1001111”;WHEN “001001” => LED7SOUT <= “1011011”;WHEN “001010” => LED7SOUT <= “0000110”;WHEN “001011” => LED7SOUT <= “0111111”;WHEN “001100” => LED7SOUT <= “1101111”;---12 19 WHEN “001101” => LED7SOUT <= “1111111”;WHEN “001110” => LED7SOUT <= “0000111”;WHEN “001111” => LED7SOUT <= “1111101”;WHEN “010000” => LED7SOUT <= “1101101”;WHEN “010001” => LED7SOUT <= “1100110”;---17 14 WHEN “010010” => LED7SOUT <= “1001111”;WHEN “010011” => LED7SOUT <= “1011011”;WHEN “010100” => LED7SOUT <= “0000110”;WHEN “010101” => LED7SOUT <= “0111111”;WHEN “010110” => LED7SOUT <= “1101111”;---22 09 WHEN “010111” => LED7SOUT <= “1111111”;WHEN “011000” => LED7SOUT <= “0000111”;WHEN “011001” => LED7SOUT <= “1111101”;---25 06 WHEN OTHERS => NULL;END CASE;
WHEN OTHERS => NULL;END CASE;------------
WHEN “11” =>---支黄主红状态 OK CASE BITSEL IS WHEN “000” =>---支黄主红状态 点亮支干道十位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;WHEN “000010” => LED7SOUT <= “0111111”;WHEN “000011” => LED7SOUT <= “0111111”;WHEN “000100” => LED7SOUT <= “0111111”;WHEN “000101” => LED7SOUT <= “0111111”;WHEN OTHERS => NULL;END CASE;WHEN “001” =>---支黄主红状态 点亮支干道个位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN OTHERS => NULL;END CASE;WHEN “010” =>---支黄主红状态 点亮主干道十位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “0111111”;WHEN “000010” => LED7SOUT <= “0111111”;WHEN “000011” => LED7SOUT <= “0111111”;WHEN “000100” => LED7SOUT <= “0111111”;WHEN “000101” => LED7SOUT <= “0111111”;WHEN OTHERS => NULL;END CASE;WHEN “011” =>---支黄主红状态 点亮主干道个位数字 CASE CNTIN IS WHEN “000001” => LED7SOUT <= “1101101”;WHEN “000010” => LED7SOUT <= “1100110”;WHEN “000011” => LED7SOUT <= “1001111”;WHEN “000100” => LED7SOUT <= “1011011”;WHEN “000101” => LED7SOUT <= “0000110”;WHEN OTHERS => NULL;END CASE;
WHEN OTHERS => NULL;END CASE;
------------END CASE;END PROCESS;END behav;
第二篇:FPGA交通灯实验报告
交通灯实验报告
一,实验目的
实现两路信号灯交替亮起,并利用两组数码管分别对两路信号进行倒计时。
两路信号时间分别为:
V:绿灯(30S)
H:红灯(35S)
黄灯(5s)
绿灯(30S)
红灯(35S)
黄灯(5S)
二,实验步骤 建立工程
可在欢迎界面点击“Creat a New Project”进入工程建立界面,亦可关闭欢迎界面,点击菜单栏的“File”,点击“New Project Wizard”进入建立工程界面。右侧为建立工程界面,点击next。
在此界面选定工程路径,取好工程名,点击“Next”。注意:路径中不能有中文,工程名也不能有中文。
一直点击“Next”进入器件设置界面,DE2-70开发工具采用的Cyclone II系列的EP2C70F896C6N。点击“Finish”,完成工程建立
1、点击“File”,点击“New” 选择“Verilog HDL” 2,点击主界面工具栏中的 选择“Verilog HDL”
3、写入verilog代码。
代码如下:
module traffic(Clk_50M,Rst,LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V,Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL,led15);
parameter S1=2'b00;parameter S2=2'b01;parameter S3=2'b10;parameter S4=2'b11;
input Clk_50M,Rst;output LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;output[6:0] Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL;output led15;
//-------------div for 1Hz-------start----reg Clk_1Hz;reg [31:0] Cnt_1Hz;always@(posedge Clk_50M or negedge Rst)begin
if(!Rst)
begin
Cnt_1Hz<=1;
Clk_1Hz<=1;
end
else
begin
if(Cnt_1Hz>=25000000)
end
//-----------div for 1Hz------end-----reg[7:0] Cnt30,CntH,CntV,CntHH,CntVV;reg[7:0] CntDis,CntDiss;//-----------30 counter and seg7---start---reg LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;always@(posedge Clk_1Hz)begin
end
begin
Cnt_1Hz<=1;
Clk_1Hz<=~Clk_1Hz;
end
else
Cnt_1Hz<=Cnt_1Hz + 1;
case(state)
S1:
end
always@(posedge Clk_1Hz)begin
case(stateV)
S1:
begin
if(CntV>=30)
CntV<=1;
begin
if(Cnt30>=30)
Cnt30<=1;
else
Cnt30<=Cnt30 + 1;S2:
begin
if(Cnt30>=5)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;S3:
begin
if(Cnt30>=30)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;S4:
begin
if(Cnt30>=5)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;end endcase
else
CntV<=CntV + 1;
S2: begin
end
end if(CntV>=5)
CntV<=1;
else
CntV<=CntV + 1;end
S3:
begin
if(CntV>=35)
CntV<=1;
else
CntV<=CntV + 1;end endcase always@(posedge Clk_1Hz)begin
case(stateH)
S1:
end
always@(negedge Clk_50M or negedge Rst)begin
begin
if(CntH>=35)
CntH<=1;
else
CntH<=CntH + 1;
S2:
begin
if(CntH>=30)
CntH<=1;end
else
CntH<=CntH + 1;end
S3:
begin
if(CntH>=5)
CntH<=1;
else
CntH<=CntH + 1;end endcase
case(state)
S1:
end always@(negedge Clk_50M or negedge Rst)begin
case(state)
S1:
end
//16进制计数器转换为用于显示的10进制计数器 always@(posedge Clk_50M)begin
if(CntVV>29)
begin
CntDis[7:4]<=3;
CntDis[3:0]<=CntVV20;end else if(CntVV>9)begin
CntDis[7:4]<=1;
CntDis[3:0]<=CntVV30;end else if(CntHH>19)begin
CntDiss[7:4]<=2;
CntDiss[3:0]<=CntHH10;end else
CntDiss<=CntHH;
end
if(Cnt30>=5)
end
end S3:
begin
state<=S4;
end S4:
begin
state<=S1;
end default:
begin
state<=S1;
end endcase
if(Cnt30>=30)
if(Cnt30>=5)always@(posedge Clk_1Hz)begin
case(state)
S1:
end
always@(posedge Clk_50M or negedge Rst)
begin
stateH<=S1;
stateV<=S1;
end S2:
begin
stateH<=S1;
stateV<=S2;
end S3:
begin
stateH<=S2;
stateV<=S3;
end S4:
begin
stateH<=S3;
stateV<=S3;
end endcase begin
if(!Rst)
begin
LedR_H<=0;
else
LedG_H<=0;LedY_H<=0;
LedR_V<=0;
LedG_V<=0;end LedY_V<=0;
begin
case(state)
S1:
begin
LedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=1;LedY_V<=0;end
S2:
begin
LedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=1;end
S3:
begin
LedR_H<=0;LedG_H<=1;LedY_H<=0;LedR_V<=1;LedG_V<=0;LedY_V<=0;end
S4:
begin LedR_H<=0;LedG_H<=0;
end
LedY_H<=1;LedR_V<=1;LedG_V<=0;LedY_V<=0;end
default:
begin
end LedR_H<=0;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=0;end
endcase assign led15=state;
endmodule
module SEG7_LUT input [3:0] iDIG;output reg
always @(iDIG)begin
case(iDIG)4'h1: oSEG = 7'b1111001;
//---t----4'h2: oSEG = 7'b0100100;// |
| 4'h3: oSEG = 7'b0110000;// lt rt
4'h4: oSEG = 7'b0011001;// |
| 4'h5: oSEG = 7'b0010010;//---m----4'h6: oSEG = 7'b0000010;// |
| 4'h7: oSEG = 7'b1111000;// lb rb 4'h8: oSEG = 7'b0000000;// |
| 4'h9: oSEG = 7'b0011000;//---b----4'ha: oSEG = 7'b0001000;4'hb: oSEG = 7'b0000011;4'hc: oSEG = 7'b1000110;4'hd: oSEG = 7'b0100001;4'he: oSEG = 7'b0000110;[6:0] oSEG;[6:0] oSEG;(oSEG,iDIG);
end
4'hf: oSEG = 7'b0001110;4'h0: oSEG = 7'b1000000;endcase endmodule 编译工程
保存文件,将文件放在所建工程所在路径下 点击主界面工具栏中的图标
也可点击菜单栏中“Processing”,点击“Start Compilation”
分配关键如下:
Clk_50M Input PIN_AD15 LedG_H Output PIN_AD9 LedG_V Output PIN_AJ6 LedR_H Output PIN_AJ7)LedR_V Output PIN_AJ5)LedY_H Output PIN_AD8 LedY_V Output PIN_AK5 Rst Input PIN_AA23 Seg7_HH[6] Output PIN_G1 Seg7_HH[5] Output PIN_H3 Seg7_HH[4] Output PIN_H2 Seg7_HH[3] Output PIN_H1 Seg7_HH[2] Output PIN_J2 Seg7_HH[1] Output PIN_J1 Seg7_HH[0] Output PIN_K3
Seg7_HL[6] Seg7_HL[5] Seg7_HL[4] Seg7_HL[3] Seg7_HL[2] Seg7_HL[1] Seg7_HL[0] Seg7_VH[6] Seg7_VH[5] Seg7_VH[4] Seg7_VH[3] Seg7_VH[2] Seg7_VH[1] Seg7_VH[0] Seg7_VL[6] Seg7_VL[5] Seg7_VL[4] Seg7_VL[3] Seg7_VL[2] Seg7_VL[1] Seg7_VL[0] Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output PIN_E4 PIN_F4 PIN_G4 PIN_H8 PIN_H7 PIN_H4 PIN_H6 PIN_AD17 PIN_AF17 7 PIN_AE17 7 PIN_AG16 PIN_AF16 7 PIN_AE16 7 PIN_AG13 PIN_AD12 PIN_AD11 PIN_AF10 8 PIN_AD10 PIN_AH9 8 PIN_AF9 8 PIN_AE8 8
烧写代码
在管脚配置完成后,还需将工程再编译一次,成功后,点击主界面工具栏中的亦可点击主界面菜单栏中“Tools”,点击“Programmer”
进入代码烧写界面后,点击“Start”,当“Progress”为100%时,表示烧写完成,这是可观察DE2-70板现象
获得预期的效果,两组的信号红黄绿灯交替切换,计数器记为零时信号灯切换状态,红灯35s,黄灯5s,绿灯30s。三,心得体会
通过本次实验初步了解了EDA技术,熟悉了FPGA开发板的开发流程,锻炼了动手能力。
第三篇:基于FPGA的智能交通灯
设计题目: 基于FPGA的交通灯控制系统设计
专 业:
学生姓名: 学 号:
起迄日期: 2014.8.22.--2014.9.22.指导教师: 教研室主任:
目录
1.绪论..............................................................1 2.课题研究背景及意义................................................1 3.设计要求..........................................................1 4.设计方案..........................................................1 4.1方案比较....................................错误!未定义书签。4.2 方案说明...................................错误!未定义书签。5.VHDL语言介绍...................................错误!未定义书签。6.系统仿真..........................................................3 6.1 系统电路框图................................................4 6.2设计结果仿真.................................................4 7.心得体会..........................................................5 8.参考文献..........................................................6 7.附件..............................................................6
摘要:针对现实中越来越严重的城市交通拥堵现象,提出了一种城市十字路口交通信号灯控制与FPGA实现的新方法。设计的智能交通控制系统利用对相向车道采用不同步的红绿灯信号控制方法,能够减少交通资源浪费,大幅提高十字路口的车辆通行效率。利用超高速硬件描述语言VHDL设计十字路口交通信号灯控制器,实现主干道和支干道的交通控制功能,并通过Quartus II完成综合、仿真、进行管脚分配、绘出仿真波形及原理图。
关键字:硬件描述语言VHDL;交通信号灯;智能控制
1.绪论
智能的交通灯指挥着人们和各种车辆的安全运行,实现红、黄、绿灯的自动指挥是城乡交通管理现代化的重要课题。在城乡街道的十字交叉路口,为了保证交通秩序和行人的安全,一般在每条街道上各有一组红、黄、绿交通信号灯,其中红灯亮,表示该条道禁止通行;黄灯亮该条道路上未过停车线的停止通行,已过停车线的车辆继续通行;绿灯亮,表示该条道路允许通行。交通灯自动控制十字路口两组红、黄、绿交通灯的状态转换,指挥各种车辆和行人安全通行。实现十字路口交通管理自动化。
DEA技术的发展和应用领域的扩大与深入,在电子信息,通信,自动,控制及计算机应用等领域的重要性日益突出,因此本论文研究基于FPGA的交通灯设计。FPGA中有大量实现组合逻辑的资源,可以完成较大规模的组合逻辑电路设计,而其中相当数量的存储电路(触发器)又可完成复杂的时序逻辑电路设计。通过使用各种EDA工具,用原理图或硬件描述语言,可以很方便地将复杂的电路在FPGA中实现。像典型的数字系统分频器,数字钟,数字频率计等等都可用FPGA完成。本文以QuartusII 软件为开发平台,通过VHDL硬件描述语言以及原理图的输入方式来设计交通灯。
2.课题研究背景及意义
随着公路交通运输的发展,交通拥挤、道路阻塞和交通事故频繁发生等问题越来越严重地困扰着世界各大城市。相对于交通运输工具的飞速发展,我国交通配套设施建设明显滞后,道路安全网络、道路标识、交通指挥中心仍然不足。单独从车辆方面或道路方面考虑,均很难有效地解决交通问题。通过采用信息通信技术、电子技术以及其他科学技术把它们联系起来,并实现智能化的交通控制才能解决根本问题,交通信息化需要融合科技力量才能使目前的交通问题得到改善。
在现代文明高速发展的社会,道路的高度发达使得整个社会进步的速度进一步的加快,交通灯的出现是社会发展的必然产物。交通灯在道路事业中占有举足轻重的地位,它直接影响到公路以及市区内的通车质量。所以,智能交通灯的研究具有重大意义。
3.设计要求
主干道绿灯亮支干道红灯亮时间是50秒,接下来黄灯闪烁5秒,此时主干道的绿灯和支干道的红灯继续亮;然后是主干道红灯亮支干道绿灯亮,时间为20秒,再黄灯闪5秒同时主干道的红灯和支干道的绿灯也继续亮。
4.设计方案
首先根据系统的需要进行分析。系统要求主干道绿灯亮支干道红灯亮时间是50秒,接下来黄灯闪烁5秒,此时主干道的绿灯和支干道的红灯继续亮,然后是 主干道红灯亮支干道绿灯亮时间为20秒,再黄灯闪5秒同时主干道的红灯和支干道的绿灯也继续亮。
因此将整个系统分为计时模块和控制模块组成。计时模块中秒模块主要将50MHZ的时钟进行分频得到20ns的时钟信号,再将信号50000000倍得到秒信号。控制模块由交通灯控制模块以及黄灯闪烁模块构成。
Verilog HDL语言介绍 5.1 Verilog HDL特点
Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰地模拟、仿真语义。使用这种语言编写的模型可以方便地使用Verilog仿真器进行验证。Verilog HDL从C语言继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力和扩展模块。
Verilog HDL之所以成为和VHDL并驾齐驱的描述语言,以为它有如下特点:
(1)基本逻辑门,例如and、or和nand等都内置在语言中。
(2)用户定义原语(UDP)创建的灵活性。用户定义的原语既可以是组合逻辑原语,也可以是时序逻辑原语。
(3)开关级基本结构模型,例如pmos 和nmos等也被内置在语言中。(4)提供显式语言结构指定设计中的端口到端口的时延及路径时延和设计的时序检查。
(5)可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式—使用过程化结构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模。
(6)Verilog HDL中有两类数据类型:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。
(7)能够描述层次设计,可使用模块实例结构描述任何层次。设计能够在多个层次上加以描述,从开关级、门级、寄存器传送级(RTL)到算法级。
(8)设计的规模可以是任意的;语言不对设计的规模(大小)施加任何限制。Verilog HDL不再是某些公司的专有语言而是IEEE标准。人和机器都可阅读Verilog 语言,因此它可作为EDA的工具和设计者之间的交互语言。
5.2Verilog HDL程序基本结构
模块是Verilog HDL的基本描述单位,描述某个设计的功能或结构及与其他模块通信的外部端口。一个模块的基本语法如下:
module module_name//模块名称
(port_list);//输入输出信号列表//说明 reg//寄存器 wire//线网
parameter//参数 input//输入信号 output//输出信号 inout//输入输出信号 function//函数 task//任务 …//语句
Initial statement Always statement Module instantiation// Gate instantiation// UDP instantiation// Continuous assignment// Endmodule 说明部分用于定义不同的项,例如模块描述中使用寄存器和参数、语句定义设计的功能和结构。说明部分和语句可以放置在模块的任何地方,但是变量、寄存器、线网和参数等的说明部分必须在使用前出现。为了使模块描述清晰和具有良好的可读性,最好将所有的说明部分放在语句前。
6.系统仿真
本文的仿真是在QuartuslI上进行的。QuartuslI 是 Altera 提供的 FPGA/CPLD 开发集成环境,Altera 是世界上最大的可编程逻辑器件供应商之一。QimrtiisII在21世纪 初推出,是Altera前一代FPGA/CPLD集成开发环境MAX+plusII的更 新换代产品,其界面友好,使用便捷。QuartiisII提供了一种与结构 无关的设计环境,使设计者能方便地进行设计输入、快速处理和器件 编程。
Altera的QuartusII提供了完整的多平台设计环境,能满足各 种特定设计的需要,也是单芯片可编程系统(SOPC)设计的综合性环 境和SOPC开发的基本设计工具,并为Altera DSP开发包进行系统模 型设计提供了集成综合环境。
QuartusII包括模块化的编辑器。编辑器包括的功能模块有分析 /综合器、适配器、装配器、时序分析器、设计辅助模块、EDA网表 文件生成器、编辑数据接口等。可以通过选择Start Compilation来运行所有的编辑器模块,也可以选择单独运行各个模块。
基于Quartus II的设计流程:
(1)建立工作库文件夹和编辑设计文件(2)创建工程;(3)全程编译工程;(4)时序仿真;(5)引脚锁定;
(6)下载至硬件系统验证。
6.1 系统电路框图
系统整体电路设计采用原理图输入法,将各个模块包括子模块进行连接,得到系统的电路框图如下图所示。
图三 系统整体电路图
6.2设计结果仿真
利用Quartus II软件对本设计的程序进行编译,得到系统的仿真图。
交通灯运行时时序仿真图1
交通灯运行时时序仿真图1
7.心得体会
在这次课程设计中,我再一次的体验到了细心对一个编程者的重要性,和程序的规范性对于程序的重要性,这些平时我们忽略的问题,其实有时候关乎着我们编程的成功与否的。
在verilog语言中,我们必须注意其与C语言的异同,比如格式和变量定义,还有模块的调用,和时钟信号的应用。我觉得需要在以后多加练习,可以对以后的学习和工作带来莫大的帮助。这次的
课程设计相对以前的较难,其实就是对我们的一次考核,也是一次考验,它培养了学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。然而从理论到实践的转化过程,我在做课程设计的近一个月时间里,有了更进一步的认识和了解,要想学知识要重在实践,要通过不断的实际操作才能更好地学习。
通过这次课程设计,我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能
力。在设计的过程中遇到问题,可以说得是困难重重,遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知解得不够深刻,掌握得不够牢固。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
8.参考文献
(1)程云长.可编程逻辑器件与VHDL语言[M].北京:科学出版社,2005(2)黄智伟.全国大学生电子设计竞赛系统设计[M].北京:北京航空航天大学出版社,2006(3)黄智伟.全国大学生电子设计竞赛电路设计[M].北京:北京航空航天大学出版社,2006(4)黄智伟.全国大学生电子设计竞赛 常用电路模块制作[M].北京:北京航空航天大学出版社,2010(5)黄智伟等.基于NI multisim的电子电路计算机仿真设计与分析[M].北京:电子工业出版社,2007(6)黄智伟.印制电路板(PCB)设计技术与实践[M].北京:电子工业出版社,2009(7)高吉祥等.电子技术基础实验与课程设计[M].北京:电子工业出版社,2002(8)潘松.EDA技术实用教程[M].科学出版社.2005
7.附件 原程序
`timescale 100ms / 1us //程序中的时间单位和仿真精度。module signal_led(clk, rst_n, traffic_signal_master_red, traffic_signal_master_green, traffic_signal_master_yellow, traffic_signal_slave_red, traffic_signal_slave_green, traffic_signal_slave_yellow);input clk;input rst_n;output reg
traffic_signal_master_red;// 交通信号灯主干道红灯
output reg
traffic_signal_master_green;// 交通信号灯主干道绿灯
output reg
traffic_signal_master_yellow;// 交通信号灯主干道黄灯 output reg
traffic_signal_slave_red;// 交通信号灯次干道红灯
output reg
traffic_signal_slave_green;// 交通信号灯次干道绿灯
output reg
traffic_signal_slave_yellow;// 交通信号灯次干道黄灯
reg signal_red_led;reg signal_green_led;reg signal_yellow_led;reg [31:0] traffic_signal_cnt;parameter
LED_ON
= 1'b0;// 1亮
parameter
LED_OFF
= 1'b1;// 0灭
parameter
TIME_CELL
= 32'd50000000;// 时间单元时间 = Time_cell * 20ns(50MHz主频)parameter START = 32'd0;parameter MASTER_GREEN = TIME_CELL * 20;parameter MASTER_YELLOW_1 = TIME_CELL * 20 + TIME_CELL;parameter MASTER_YELLOW_2 = TIME_CELL * 20 + 2 * TIME_CELL;parameter MASTER_YELLOW_3 = TIME_CELL * 20 + 3 * TIME_CELL;parameter MASTER_YELLOW_4 = TIME_CELL * 20 + 4 * TIME_CELL;parameter MASTER_YELLOW_5 = TIME_CELL * 20 + 5 * TIME_CELL;parameter SLAVE_GREEN = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20;parameter SLAVE_YELLOW_1 = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20 + TIME_CELL;parameter SLAVE_YELLOW_2 = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20 + 2 * TIME_CELL;parameter SLAVE_YELLOW_3 = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20 + 3 * TIME_CELL;parameter SLAVE_YELLOW_4 = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20 + 4 * TIME_CELL;parameter TOTAL_TIME = TIME_CELL * 20 + 5 * TIME_CELL + TIME_CELL * 20 + 5 * TIME_CELL;
//******************************************************************* // 模块名称:时间计数种子 // 功能描述
//******************************************************************* always @(posedge clk or negedge rst_n)begin if(!rst_n)traffic_signal_cnt <= 32'h0;else if(traffic_signal_cnt == TOTAL_TIME)traffic_signal_cnt <= START;else traffic_signal_cnt <= traffic_signal_cnt+1;end //******************************************************************* // 模块名称:LED灯闪烁控制 // 功能描述
//******************************************************************* always @(posedge clk or negedge rst_n)begin if(!rst_n)
begin signal_red_led <= LED_OFF;signal_green_led <= LED_OFF;signal_yellow_led <= LED_OFF;end else begin case(traffic_signal_cnt)START
:
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_OFF;end MASTER_GREEN
:
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_ON;end MASTER_YELLOW_1 :
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_OFF;end MASTER_YELLOW_2 :
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_ON;end MASTER_YELLOW_3 :
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_OFF;end MASTER_YELLOW_4 :
begin signal_red_led <= LED_OFF;signal_green_led <= LED_ON;signal_yellow_led <= LED_ON;end MASTER_YELLOW_5 :
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_OFF;end SLAVE_GREEN
:
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_OFF;end SLAVE_YELLOW_1 :
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_ON;end SLAVE_YELLOW_2 :
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_OFF;end SLAVE_YELLOW_3 :
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_ON;end SLAVE_YELLOW_4 :
begin signal_red_led <= LED_ON;signal_green_led <= LED_OFF;signal_yellow_led <= LED_OFF;end endcase end end //******************************************************************* // 模块名称:主从LED输出 // 功能描述:
//******************************************************************* always @(posedge clk or negedge rst_n)begin if(!rst_n)begin traffic_signal_master_red <= LED_OFF;traffic_signal_master_green <= LED_OFF;traffic_signal_master_yellow <= LED_OFF;traffic_signal_slave_red <= LED_OFF;traffic_signal_slave_green <= LED_OFF;traffic_signal_slave_yellow <= LED_OFF;end else begin traffic_signal_master_red <= signal_red_led;traffic_signal_master_green <= signal_green_led;traffic_signal_master_yellow <= signal_yellow_led;traffic_signal_slave_red <= ~signal_red_led;traffic_signal_slave_green <= ~signal_green_led;traffic_signal_slave_yellow <= signal_yellow_led;end end endmodule
第四篇:基于单片机的交通灯控制系统
单片机原理及系统课程设计报告
基于单片机的交通灯控制系统 引言
单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域具有广泛的应用。本文设计了基于单片机的交通灯控制系统以AT89C51单片机为核心芯片,通过控制三色LED灯的亮灭来控制各车道的通行。设计方案及原理
本系统由AT89C51单片机、红、黄、绿LED交通信号灯、共阴极数码管、紧急通车开关等模块组成该电路具有设计简单,显示亮度高,能耗小,可靠性高灯特点。其总体设计框图如图1所示。
复位电路七段数码管倒计时显示电路AT89C51晶振电路A、B车道LED显示电路按键电路
图1 系统总体设计方框图
2.1 系统设计
交通灯控制系统主要控制A,B两车道的交通,以AT89C51单片机为核心芯片,通过控制三色LED灯的亮灭来控制各车道的通行;另外通过3个按键来模拟各车道有无车辆的情况和有紧急车辆的情况。根据设计要求,制定总体设计思想如下:
(1)用AT89C51单片机控制交通灯电路,晶振采用12MHz。(2)用发光二极管模拟交通信号灯,用按键开关模拟车辆检测信号。
(3)有紧急车辆通过时,按下K3开关使A、B车道均为红灯,禁行20s。此时,
第五篇:智能交通灯控制系统 毕业设计总结
无
锡
职
业
技
术
学
院
毕业设计总结 毕业设计总结
本次毕业设计,我的指导老师是李丽老师,首先,我们进行总体规划,包括控制系统组成、控制系统工作过程、控制系统功能、控制系统技术指标;之后,进行了硬件系统设计,学习单片机原理与接口技术,网上搜索下载AT89C51、数码显示管、点亮LED技术资料,并学习消化,设计硬件控制原理,用Protel绘图软件设计出控制器原理图,并对控制器硬件进行了调试;接着,研究设计六线四相步进电机控制方式和方法;而后,规划出了控制软件结构图,设计出了主控模块程序流程图、各功能模块程序流程图,并逐功能模块编辑、编译、连接、测试控制程序,在编程过程中,我一边学习C51程序设计,一边熟悉Keil C51开发平台,一边编程设计控制程序;最后,对控制程序进行了测试和修改完善。
本次毕业设计创新点一是提出了六线四相步进电机启动加速控制技术方案,二是研究了六线四相步进电机各种运行控制方式。
本次毕业设计体会一是深刻认识到专业理论对指导实践工作的重要性,上学期间,专业理论学的不够扎实,不够深入、不够全面、不懂用途;二是现有的技能不能胜任实际工作,实际动手能力欠缺;三是不知道如何进行课题需求分析、课题总体规划;四是不知道如何进行软件结构设计;五是实际编程经验欠缺,缺少排除故障能力。所以,我们即将毕业的大学生需要与时俱进,克服不足,勤学苦练,迎接挑战,为国争光。
在该课题后续研究设计时,应重视步进电机特性研究,重视控制方法、控制方式研究;增加联网控制功能;增加LCD数据显示功能。
在这篇毕业设计论文即将完成的时候,我突然意识到自己的校园生活即将画上一个句号。当我踏上工作岗位的时候即将面对的是完全不同于之前十几年校园生活的新的旅程。如果说之前的日子是学会如何做人、如何做事、如何认识和理解世界、如何学会感恩,那么,今后的日子,我将真正成为一个有用的人,一个能与别人合作或者独立完成任务的人,一个真正懂得世界、懂得感恩并真正付出的人。
我要感谢我存在的这个世界赋予我的认知和理解,感谢父母给了我机会认识并引导抚育我这个世界,感谢二十几年来成百上千的老师与朋友让我能够在正确的道路上走得更远并且激励我成为一个坚定信念不做让自己后悔事情的人。
“穷则独善其身,达则兼济天下”,古训教导我们不做自私人,懂得尽己所能,知恩图报。一切来之不易,珍惜且能尽其用,算是在自己能力有限的时候对社会,对生活最大的慰藉和回报。今年的二月份,在经历了将近一年的苦苦寻觅之后,我终于遇到了一个适合自己发展的岗位,也终于能够将全部的精力投入到这次毕业设计之中。首先我非常感谢我的导师李老师对我的支持和宽容,因为这次毕设的题目来源于我在生活的灵感,并且有着强烈的愿望,期望它能够成为现实,期望在离开校园之前见证自己所学是有用的学问。李老师在我的毕设过程中给予我鼎力的支持,因而有机会实现这个愿望。同时,在漫长的设计和实践过程中,身边的同学和朋友都给了我很多支持和帮助,这也证明了即便是一个人的任务也需要集体的力量,庆幸自己在离开校园之前学到了很多今后可能及其重要的东西。
回顾自己的学习历程,感觉今天的生活与状态是由一系列的偶然与必然串联成的结果。在这个过程中自己承受了比别人更多的挫折,但也学到了更多的感悟,获得了比别人更大的成就。我体会了人生的正弦曲线,知道很多情况下结果是之前很长时间的累积,很有趣的是,我的这些感悟在大学的专业课学习的时候得到
/ 2
无
锡
职
业
技
术
学
院
毕业设计总结
了理论上描述的一致。因为我的每一次成功的获得都比别人晚了许多,但也都是在最关键的时候比别人得到了更多的收获,也比别人体会到更多的付出后的充实。很庆幸自己在过去岁月中每一次困难抉择中做出的选择,以及在不断地激励中为目标而不断奋斗的坚持。
“来到社会做什么?毕业后做一个怎样的人?”虽然即将毕业,但是这两个问题将常伴左右。第一个问题的答案已经深深写在自己三年大学生活的美好回忆之中,而第二个问题,将是我今后不断反省自我并思考未来的信条。
学无止境,无论每天往返于公司和住所,还是奔走于实验室与宿舍之间,作为一个职员或者学生,无时无刻不在接受新的知识、观点、理念。即便是创造社会价值,也仍需要不断补给养分。于此,作为刚刚走出校园的人,我将牢记于心。
最后,真诚期望每一个已经出现在或是即将出现在我不同人生阶段却是同一条生活轨迹的师长、亲友、战友们,能够始终拥有美好幸福的生活状态、以及一颗热忱于探索未知和真理的心,同时也是对自己未来生活的期冀。