资源描述
目录
引言 0
1.系统的设计要求 1
2.系统分析 1
2.1 系统构成 1
2.2 系统实现过程 2
3.具体模块设计 2
3.1消抖模块 2
3.2 交通灯模块 2
3.3 交通灯时长设置模块 3
3.8 整体结构电路图 4
4.程序设计 4
4.1消抖模块源代码 4
4.2 交通灯时长设置模块 5
4.3 交通灯模块 6
4.4 顶层文件源代码 9
5.运行结果与分析 11
6.结束语 12
参考文献 13
引言
不同的城市存在着不同的城市问题,但其中有一个共同的问题就是城市交通。在交叉路口如何解决混合交通流中的相互影响,就是解决问题的关键所在!随着我国经济的稳步发展,人民生活水平的日渐提高,越来越多的汽车进入寻常百姓的家庭,再加上政府大力地发展公交、出租车行业,道路上的车辆越来越多,使得城市的交通成为了一个主要的问题。严重的拥堵现象,逐渐恶化的城市环境,都给广大市民带来了许多困扰。要解决这些问题不仅要求道路越来越宽阔,而且更需要有新的交通管理模式出台。
实现路口交通灯系统的控制方法很多,可以用标准逻辑器件、可编程序控制器PLC、单片机等方案来实现。但是这些控制方法的功能修改及调试都需要硬件电路的支持,在一定程度上增加了功能修改及系统调试的困难。交通系统未来的发展趋势就是要提高通行能力,加强环境保护,开展智能化运输和环保专项技术的研究,并且要做到以人为本,重点开展交通安全技术的研究,在这个过程中要确定经济合理的目标,促进新材料的广泛应用和开发。
EDA 技术是用于电子产品设计中比较先进的技术,可以代替设计者完成电子系统设计中的大部分工作,而且可以直接从程序中修改错误及系统功能而不需要硬件电路的支持,既缩短了研发周期,又大大节约了成本,受到了电子工程师的青睐。
1. 系统的设计要求
为了满足步行街的要求,此交通灯须具备以下功能:
1.正常情况下保证主干道的畅通。
2. 当步行街道上的行人要穿过主干道时,通过设置的按钮来发出请求。
3. 当有人按下此按钮时,主干道变为黄灯,设置计数器时间为X秒。
4. X秒过后,主干道变为红灯,计数器继续计时(计时时间为Y秒),在Y秒内若有人再次按按钮,计数器不重新计时。
5. 步行街绿灯闪烁时间为Y1秒,(Y-Y1)秒后主干道变为绿灯,车辆通行。且咬保证车辆通行一定时间(Z秒)。在此时间内,行人按按钮无效。Z秒过后,若有人再按下按钮,又出现(3)中的状态。
计数器的计时时间长短X~Y~Z可以任意设定。
2.系统分析
2.1 系统构成
行人按下红灯按钮
消抖模块
设置人行道绿灯时长
消抖模块
交通灯模块
计数器模块
状态机模块
设置交通灯时长模块
控制模块
消抖模块
设置马路红灯后按键的无效时间
步行街自助式交通灯控制器控制器分为3个模块:消抖模块,交通灯模块,交通灯时长设置模块。
2.2 系统实现过程
最初状态是人行道红灯,马路绿灯。当有行人按下按钮时,马路的红灯变为黄灯,持续一个时钟周期的时间。然后马路的黄灯变为绿灯,此时人行道的红灯也变为绿灯,然后持续HUMAN_TIME个时钟的周期的时间。然后人行灯的绿灯变为闪烁的绿灯,持续2个时钟的周期的时间,然后人行道的闪烁的绿灯变为红灯,此时马路的红灯也变为绿灯。然后在VEHICLE_TIME个时钟周期内人行道为红灯,马路为绿灯状态保持不变且行人按键无效。
状态如下:
状态
主干道信号灯
步行街信号灯
主干道
步行街道
R红
G绿
Y黄
R红
G绿
S0
0
1
0
1
0
通行
禁行
S1
0
0
1
1
0
车停靠
禁行
S2
1
0
0
0
1
禁行
通行
S3
1
0
0
0
禁行
通行(绿灯闪烁
S4
0
1
0
1
0
通行
禁行
3.具体模块设计
3.1消抖模块
消抖模块DITHER如图2所示,使用硬件消抖原理。
3.2 交通灯模块
交通灯模块LIGHT如图3所示,根据输入GHUMAN_TIME,GHUMAN_CLKT和GVEHICLE_TIME的值,进行减计数,然后根据值判断状态机的状态。
3.3 交通灯时长设置模块
交通灯时长设置模块COUNTER如图4所示,根据设置按键人按键设置人行道绿灯时长和按键屏蔽时长。
图2 DITHER模块
图3 LIGHT模块
图4 COUNTER模块
3.8 整体结构电路图
图5 整体结构电路图
4.程序设计
4.1消抖模块源代码
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY DITHER IS
PORT(UPIN: IN STD_LOGIC;
DOWNIN: IN STD_LOGIC;
KEYOUT: OUT STD_LOGIC );
END DITHER;
ARCHITECTURE BEHAVE OF DITHER IS
SIGNAL OUT1: STD_LOGIC;
SIGNAL OUT2: STD_LOGIC;
BEGIN
OUT1<=NOT( OUT2 AND UPIN );
OUT2<=NOT( OUT1 AND DOWNIN );
KEYOUT<=OUT1;
END BEHAVE;
4.2 交通灯时长设置模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY COUNT IS
PORT(CLK: IN STD_LOGIC;
CLEAR: IN STD_LOGIC;
CLKADD: IN STD_LOGIC;
CLKSUB: IN STD_LOGIC;
PRE_SET: IN STD_LOGIC;
HUMAN_SET: IN STD_LOGIC;
RST: IN STD_LOGIC;
GHUMAN_TIME: OUT INTEGER RANGE 31 DOWNTO 0;
GHUMAN_CLKT: OUT INTEGER RANGE 31 DOWNTO 0;
GVEHICLE_TIME: OUT INTEGER RANGE 31 DOWNTO 0);
END COUNT;
ARCHITECTURE BEHAVE OF COUNT IS
SIGNAL HUMAN_TIME: INTEGER RANGE 31 DOWNTO 0;
SIGNAL VEHICLE_TIME: INTEGER RANGE 31 DOWNTO 0;
SIGNAL SSTATE: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL SCLK: STD_LOGIC;
SIGNAL DSCLK: STD_LOGIC;
BEGIN
SSTATE<="0000" WHEN PRE_SET='0' ELSE
HUMAN_SET & CLEAR & CLKADD & CLKSUB;
SCLK<=CLKADD OR CLKSUB OR CLEAR;
PROCESS (CLK)
BEGIN
IF(CLK' EVENT AND CLK='1')THEN
DSCLK<=SCLK;
END IF;
END PROCESS;
PROCESS(RST,CLEAR,DSCLK)
BEGIN
IF(RST='1')THEN
VEHICLE_TIME<=8;
ELSIF(DSCLK' EVENT AND DSCLK='1')THEN
CASE SSTATE IS
WHEN "0100" => VEHICLE_TIME<= 0;
WHEN "0101" => VEHICLE_TIME<= 0;
WHEN "0110" => VEHICLE_TIME<= 0;
WHEN "0111" => VEHICLE_TIME<= 0;
WHEN "0001" => VEHICLE_TIME<= VEHICLE_TIME-1;
WHEN "0010" => VEHICLE_TIME<= VEHICLE_TIME+1;
WHEN OTHERS => VEHICLE_TIME<= VEHICLE_TIME;
END CASE;
END IF;
END PROCESS;
PROCESS (CLEAR,DSCLK)
BEGIN
IF(RST='1')THEN
HUMAN_TIME<=4;
ELSIF (DSCLK' EVENT AND DSCLK ='1')THEN
CASE SSTATE IS
WHEN "1100" => HUMAN_TIME<=0;
WHEN "1101" => HUMAN_TIME<=0;
WHEN "1110" => HUMAN_TIME<=0;
WHEN "1111" => HUMAN_TIME<=0;
WHEN "1001" => HUMAN_TIME<=HUMAN_TIME-1;
WHEN "1010" => HUMAN_TIME<=HUMAN_TIME+1;
WHEN OTHERS => HUMAN_TIME<=HUMAN_TIME;
END CASE;
END IF;
END PROCESS;
PROCESS(PRE_SET,RST)
BEGIN
IF(RST='1')THEN
GHUMAN_TIME<=5;
GHUMAN_CLKT<=7;
GVEHICLE_TIME<=15;
ELSIF(PRE_SET' EVENT AND PRE_SET='0')THEN
GHUMAN_TIME<=HUMAN_TIME+1;
GHUMAN_CLKT<=HUMAN_TIME+3;
GVEHICLE_TIME<=HUMAN_TIME+VEHICLE_TIME+3;
END IF;
END PROCESS;
END BEHAVE;
4.3 交通灯模块
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY LIGHT IS
PORT(SRED: OUT STD_LOGIC;
ERED: OUT STD_LOGIC;
SGREEN: OUT STD_LOGIC;
EYELLOW: OUT STD_LOGIC;
EGREEN: OUT STD_LOGIC;
GT_SET: IN STD_LOGIC;
GHUMAN_TIME: IN INTEGER RANGE 31 DOWNTO 0;
GHUMAN_CLKT: IN INTEGER RANGE 31 DOWNTO 0;
GVEHICLE_TIME: IN INTEGER RANGE 31 DOWNTO 0;
REQUEST: IN STD_LOGIC;
CLK: IN STD_LOGIC;
RST: IN STD_LOGIC);
END LIGHT;
ARCHITECTURE BEHAVE OF LIGHT IS
TYPE IN_STATES IS (ST0,ST1,ST2,ST3,ST4);
SIGNAL CURRENT_STATE: IN_STATES;
SIGNAL NEXT_STATE: IN_STATES;
SIGNAL START: STD_LOGIC;
SIGNAL SIG: INTEGER RANGE 31 DOWNTO 0;
BEGIN
PROCESS(CURRENT_STATE,RST)
BEGIN
IF(RST='1' OR CURRENT_STATE=ST0)THEN
START<='0';
ELSE
START<='1';
END IF;
END PROCESS;
A:PROCESS(START,CLK,RST)
BEGIN
IF(RST='1')THEN
SIG<=0;
ELSIF(CLK' EVENT AND CLK='1')THEN
IF(START='1')THEN
IF(SIG=GVEHICLE_TIME)THEN
SIG<=0;
ELSE
SIG<=SIG+1;
END IF;
ELSE
SIG<=0;
END IF;
END IF;
END PROCESS A;
PROCESS(RST,CLK)
BEGIN
IF(RST='1')THEN
CURRENT_STATE<=ST0;
ELSIF (CLK'EVENT AND CLK='1')THEN
CURRENT_STATE<=NEXT_STATE;
END IF;
END PROCESS;
PROCESS(CLK,CURRENT_STATE,REQUEST)
BEGIN
CASE CURRENT_STATE IS
WHEN ST0=> ERED<='0';EGREEN<='1';EYELLOW<='0';SRED<='1';SGREEN<='0';
IF(REQUEST='1' AND GT_SET='0')THEN
NEXT_STATE<=ST1;
ELSE
NEXT_STATE<=ST0;
END IF;
WHEN ST1=> ERED<='0';EGREEN<='0';EYELLOW<='1';SRED<='1';SGREEN<='0';
IF (SIG=1)THEN
NEXT_STATE<=ST2;
ELSE
NEXT_STATE<=ST1;
END IF;
WHEN ST2=> ERED<='1';EGREEN<='0';EYELLOW<='0';SRED<='0';SGREEN<='1';
IF(SIG=GHUMAN_TIME)THEN
NEXT_STATE<=ST3;
ELSE
NEXT_STATE<=ST2;
END IF;
WHEN ST3=> ERED<='1';EGREEN<='0';EYELLOW<='0';SRED<='0';SGREEN<=NOT CLK;
IF(SIG=GHUMAN_CLKT)THEN
NEXT_STATE<=ST4;
ELSE
NEXT_STATE<=ST3;
END IF;
WHEN ST4=> ERED<='0';EGREEN<='1';EYELLOW<='0';SRED<='1';SGREEN<='0';
IF(SIG=GHUMAN_CLKT)THEN
NEXT_STATE<=ST0;
ELSE
NEXT_STATE<=ST4;
END IF;
WHEN OTHERS=> ERED<='0';EGREEN<='1';EYELLOW<='0';SRED<='1';SGREEN<='0';NEXT_STATE<=ST3;
END CASE;
END PROCESS;
END BEHAVE;
4.4 顶层文件源代码
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Entity TrafficLight is
Port(clk:in std_logic;
clear:in std_logic;
rclear:in std_logic;
clkADD:in std_logic;
rclkADD:in std_logic;
clkSUB:in std_logic;
rclkSUB:in std_logic;
pre_set:in std_logic;
human_set:in std_logic;
rst:in std_logic;
request:in std_logic;
rrequest:in std_logic;
clk_ls:in std_logic;
sred,sgreen:out std_logic;
ered,eyellow,egreen:out std_logic);
End;
Architecture behave of TrafficLight is
ponent DITHER is
PORT ( UPIN: IN STD_LOGIC;
DOWNIN: IN STD_LOGIC;
KEYOUT: OUT STD_LOGIC );
End ponent;
ponent COUNT is
PORT(CLK: IN STD_LOGIC;
CLEAR: IN STD_LOGIC;
CLKADD: IN STD_LOGIC;
CLKSUB: IN STD_LOGIC;
PRE_SET: IN STD_LOGIC;
HUMAN_SET: IN STD_LOGIC;
RST: IN STD_LOGIC;
GHUMAN_TIME: OUT INTEGER RANGE 31 DOWNTO 0;
GHUMAN_CLKT: OUT INTEGER RANGE 31 DOWNTO 0;
GVEHICLE_TIME: OUT INTEGER RANGE 31 DOWNTO 0);
End ponent;
ponent LIGHT is
PORT(SRED: OUT STD_LOGIC;
ERED: OUT STD_LOGIC;
SGREEN: OUT STD_LOGIC;
EYELLOW: OUT STD_LOGIC;
EGREEN: OUT STD_LOGIC;
GT_SET: IN STD_LOGIC;
GHUMAN_TIME: IN INTEGER RANGE 31 DOWNTO 0;
GHUMAN_CLKT: IN INTEGER RANGE 31 DOWNTO 0;
GVEHICLE_TIME: IN INTEGER RANGE 31 DOWNTO 0;
REQUEST: IN STD_LOGIC;
CLK: IN STD_LOGIC;
RST: IN STD_LOGIC);
End ponent;
Signal TEMP_GHUMAN_TIME: INTEGER RANGE 31 DOWNTO 0;
Signal TEMP_GHUMAN_CLKT: INTEGER RANGE 31 DOWNTO 0;
Signal TEMP_GVEHICLE_TIME: INTEGER RANGE 31 DOWNTO 0;
Signal TEMP_CLEAR,TEMP_CLKADD,TEMP_CLKSUB,TEMP_REQUEST:std_logic;
Begin
U1:DITHER port map(clear,rclear,TEMP_CLEAR);
U2:DITHER port map(clkADD,rclkADD,TEMP_CLKADD);
U3:DITHER port map(clkSUB,rclkSUB,TEMP_CLKSUB);
U4:DITHER port map(request,rrequest,TEMP_REQUEST);
U5:COUNT port map(CLK,TEMP_CLEAR,TEMP_CLKADD,TEMP_CLKSUB,PRE_SET,HUMAN_SET,RST,TEMP_GHUMAN_TIME,TEMP_GHUMAN_CLKT,TEMP_GVEHICLE_TIME);
U6:LIGHT port map(SRED,ERED,SGREEN,EYELLOW,EGREEN,PRE_SET,TEMP_GHUMAN_TIME,TEMP_GHUMAN_CLKT,TEMP_GVEHICLE_TIME,TEMP_REQUEST,CLK_LS,RST);
End behave;
5.运行结果与分析
(1)消抖模块仿真波形图:
图6 消抖模块仿真波形图
按键弹起为高电平,按下为低电平。当按键按下时,UPIN变为低电DOWNIN变为高电平,并产生抖动。输出的KEYOUT信号消除抖动。
(2)交通灯模块仿真波形图:
图7交通灯模块仿真波形图
给CLK一个时钟信号,在某一时刻开始赋给RST一个高电平,所有值恢复默认。再给REQUEST赋值一个高电平,然后状态机开始工作,EYELLOW(马路的黄灯)变为高电平,持续一个时钟周期的时间。然后EGREEN(马路的绿灯)变为高电平,此时SGREEN(人行道的绿灯)变为高电平,然后持续HUMAN_TIME个时钟的周期的时间。然后SGREEN(人行灯的绿灯)变为N,持续2个时钟的周期的时间,然后SRED(人行道的红灯)变为高电平,此时ERED(马路的绿灯)变为高电平。然后在VEHICLE_TIME个时钟周期内SRED(人行道红灯)保持高电平,EGREEN(马路的绿灯)保持为高电平。在此过程中,再次给REQUEST高电平对交通灯的电位没有影响。
(3)交通灯时长设置模块仿真波形图:
图8交通灯时长设置模块仿真波形图
给CLK一个时钟信号,在某一时刻给RST一个高电平复位,然后GHUMAN_CLK,GHUMAN_TIME和GVEHICLE_TIME回复默认值。然后再在某一时刻给PRE_SET一个低电平给GHUMAN_CLK,GHUMAN_TIME和 GVEHICLE_TIME赋值, GVEHICLE_TIME的值减1。然后再在某一时刻同时给PRE_SET赋低电平,给HUMAN_SET赋高电平,然后GHUMAN_TIME的值加1,GVEHICLE_TIME的值加1。
(4)顶层文件模块仿真波形图:
图12顶层文件仿真波形图
6.结束语
通过这次课程设计,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。而且,这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
参考文献
[1].侯伯亭,顾新. VHDL 硬件描述语言与数字逻辑电路设计. 西安:西安电子科技大学出版社,1999.
[2].EDA技术与VHDL。潘松,黄继业编著。——4版。——北京:清华大学出版社,2013.4
[3].王金明 .数字系统设计VHDL 北京:电子工业出版设,2010。13
展开阅读全文