VHDL交通灯课程设计.docx
《VHDL交通灯课程设计.docx》由会员分享,可在线阅读,更多相关《VHDL交通灯课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
VHDL交通灯课程设计
引言
不同的城市存在着不同的城市问题,但其中有一个共同的问题就是城市交通。
在交叉路口如何解决混合交通流中的相互影响,就是解决问题的关键所在!
随着我国经济的稳步发展,人民生活水平的日渐提高,越来越多的汽车进入寻常百姓的家庭,再加上政府大力地发展公交、出租车行业,道路上的车辆越来越多,使得城市的交通成为了一个主要的问题。
严重的拥堵现象,逐渐恶化的城市环境,都给广大市民带来了许多困扰。
要解决这些问题不仅要求道路越来越宽阔,而且更需要有新的交通管理模式出台。
实现路口交通灯系统的控制方法很多,可以用标准逻辑器件、可编程序控制器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所示,根据设置按键人按键设置人行道绿灯时长和按键屏蔽时长。
图2DITHER模块
图3LIGHT模块
图4COUNTER模块
3.8整体结构电路图
图5整体结构电路图
4.程序设计
4.1消抖模块源代码
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYDITHERIS
PORT(UPIN:
INSTD_LOGIC;
DOWNIN:
INSTD_LOGIC;
KEYOUT:
OUTSTD_LOGIC);
ENDDITHER;
ARCHITECTUREBEHAVEOFDITHERIS
SIGNALOUT1:
STD_LOGIC;
SIGNALOUT2:
STD_LOGIC;
BEGIN
OUT1<=NOT(OUT2ANDUPIN);
OUT2<=NOT(OUT1ANDDOWNIN);
KEYOUT<=OUT1;
ENDBEHAVE;
4.2交通灯时长设置模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYCOUNTIS
PORT(CLK:
INSTD_LOGIC;
CLEAR:
INSTD_LOGIC;
CLKADD:
INSTD_LOGIC;
CLKSUB:
INSTD_LOGIC;
PRE_SET:
INSTD_LOGIC;
HUMAN_SET:
INSTD_LOGIC;
RST:
INSTD_LOGIC;
GHUMAN_TIME:
OUTINTEGERRANGE31DOWNTO0;
GHUMAN_CLKT:
OUTINTEGERRANGE31DOWNTO0;
GVEHICLE_TIME:
OUTINTEGERRANGE31DOWNTO0);
ENDCOUNT;
ARCHITECTUREBEHAVEOFCOUNTIS
SIGNALHUMAN_TIME:
INTEGERRANGE31DOWNTO0;
SIGNALVEHICLE_TIME:
INTEGERRANGE31DOWNTO0;
SIGNALSSTATE:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALSCLK:
STD_LOGIC;
SIGNALDSCLK:
STD_LOGIC;
BEGIN
SSTATE<="0000"WHENPRE_SET='0'ELSE
HUMAN_SET&CLEAR&CLKADD&CLKSUB;
SCLK<=CLKADDORCLKSUBORCLEAR;
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
DSCLK<=SCLK;
ENDIF;
ENDPROCESS;
PROCESS(RST,CLEAR,DSCLK)
BEGIN
IF(RST='1')THEN
VEHICLE_TIME<=8;
ELSIF(DSCLK'EVENTANDDSCLK='1')THEN
CASESSTATEIS
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;
WHENOTHERS=>VEHICLE_TIME<=VEHICLE_TIME;
ENDCASE;
ENDIF;
ENDPROCESS;
PROCESS(CLEAR,DSCLK)
BEGIN
IF(RST='1')THEN
HUMAN_TIME<=4;
ELSIF(DSCLK'EVENTANDDSCLK='1')THEN
CASESSTATEIS
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;
WHENOTHERS=>HUMAN_TIME<=HUMAN_TIME;
ENDCASE;
ENDIF;
ENDPROCESS;
PROCESS(PRE_SET,RST)
BEGIN
IF(RST='1')THEN
GHUMAN_TIME<=5;
GHUMAN_CLKT<=7;
GVEHICLE_TIME<=15;
ELSIF(PRE_SET'EVENTANDPRE_SET='0')THEN
GHUMAN_TIME<=HUMAN_TIME+1;
GHUMAN_CLKT<=HUMAN_TIME+3;
GVEHICLE_TIME<=HUMAN_TIME+VEHICLE_TIME+3;
ENDIF;
ENDPROCESS;
ENDBEHAVE;
4.3交通灯模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYLIGHTIS
PORT(SRED:
OUTSTD_LOGIC;
ERED:
OUTSTD_LOGIC;
SGREEN:
OUTSTD_LOGIC;
EYELLOW:
OUTSTD_LOGIC;
EGREEN:
OUTSTD_LOGIC;
GT_SET:
INSTD_LOGIC;
GHUMAN_TIME:
ININTEGERRANGE31DOWNTO0;
GHUMAN_CLKT:
ININTEGERRANGE31DOWNTO0;
GVEHICLE_TIME:
ININTEGERRANGE31DOWNTO0;
REQUEST:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;
RST:
INSTD_LOGIC);
ENDLIGHT;
ARCHITECTUREBEHAVEOFLIGHTIS
TYPEIN_STATESIS(ST0,ST1,ST2,ST3,ST4);
SIGNALCURRENT_STATE:
IN_STATES;
SIGNALNEXT_STATE:
IN_STATES;
SIGNALSTART:
STD_LOGIC;
SIGNALSIG:
INTEGERRANGE31DOWNTO0;
BEGIN
PROCESS(CURRENT_STATE,RST)
BEGIN
IF(RST='1'ORCURRENT_STATE=ST0)THEN
START<='0';
ELSE
START<='1';
ENDIF;
ENDPROCESS;
A:
PROCESS(START,CLK,RST)
BEGIN
IF(RST='1')THEN
SIG<=0;
ELSIF(CLK'EVENTANDCLK='1')THEN
IF(START='1')THEN
IF(SIG=GVEHICLE_TIME)THEN
SIG<=0;
ELSE
SIG<=SIG+1;
ENDIF;
ELSE
SIG<=0;
ENDIF;
ENDIF;
ENDPROCESSA;
PROCESS(RST,CLK)
BEGIN
IF(RST='1')THEN
CURRENT_STATE<=ST0;
ELSIF(CLK'EVENTANDCLK='1')THEN
CURRENT_STATE<=NEXT_STATE;
ENDIF;
ENDPROCESS;
PROCESS(CLK,CURRENT_STATE,REQUEST)
BEGIN
CASECURRENT_STATEIS
WHENST0=>ERED<='0';EGREEN<='1';EYELLOW<='0';SRED<='1';SGREEN<='0';
IF(REQUEST='1'ANDGT_SET='0')THEN
NEXT_STATE<=ST1;
ELSE
NEXT_STATE<=ST0;
ENDIF;
WHENST1=>ERED<='0';EGREEN<='0';EYELLOW<='1';SRED<='1';SGREEN<='0';
IF(SIG=1)THEN
NEXT_STATE<=ST2;
ELSE
NEXT_STATE<=ST1;
ENDIF;
WHENST2=>ERED<='1';EGREEN<='0';EYELLOW<='0';SRED<='0';SGREEN<='1';
IF(SIG=GHUMAN_TIME)THEN
NEXT_STATE<=ST3;
ELSE
NEXT_STATE<=ST2;
ENDIF;
WHENST3=>ERED<='1';EGREEN<='0';EYELLOW<='0';SRED<='0';SGREEN<=NOTCLK;
IF(SIG=GHUMAN_CLKT)THEN
NEXT_STATE<=ST4;
ELSE
NEXT_STATE<=ST3;
ENDIF;
WHENST4=>ERED<='0';EGREEN<='1';EYELLOW<='0';SRED<='1';SGREEN<='0';
IF(SIG=GHUMAN_CLKT)THEN
NEXT_STATE<=ST0;
ELSE
NEXT_STATE<=ST4;
ENDIF;
WHENOTHERS=>ERED<='0';EGREEN<='1';EYELLOW<='0';SRED<='1';SGREEN<='0';NEXT_STATE<=ST3;
ENDCASE;
ENDPROCESS;
ENDBEHAVE;
4.4顶层文件源代码
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_unsigned.all;
EntityTrafficLightis
Port(clk:
instd_logic;
clear:
instd_logic;
rclear:
instd_logic;
clkADD:
instd_logic;
rclkADD:
instd_logic;
clkSUB:
instd_logic;
rclkSUB:
instd_logic;
pre_set:
instd_logic;
human_set:
instd_logic;
rst:
instd_logic;
request:
instd_logic;
rrequest:
instd_logic;
clk_ls:
instd_logic;
sred,sgreen:
outstd_logic;
ered,eyellow,egreen:
outstd_logic);
End;
ArchitecturebehaveofTrafficLightis
ComponentDITHERis
PORT(UPIN:
INSTD_LOGIC;
DOWNIN:
INSTD_LOGIC;
KEYOUT:
OUTSTD_LOGIC);
Endcomponent;
ComponentCOUNTis
PORT(CLK:
INSTD_LOGIC;
CLEAR:
INSTD_LOGIC;
CLKADD:
INSTD_LOGIC;
CLKSUB:
INSTD_LOGIC;
PRE_SET:
INSTD_LOGIC;
HUMAN_SET:
INSTD_LOGIC;
RST:
INSTD_LOGIC;
GHUMAN_TIME:
OUTINTEGERRANGE31DOWNTO0;
GHUMAN_CLKT:
OUTINTEGERRANGE31DOWNTO0;
GVEHICLE_TIME:
OUTINTEGERRANGE31DOWNTO0);
Endcomponent;
ComponentLIGHTis
PORT(SRED:
OUTSTD_LOGIC;
ERED:
OUTSTD_LOGIC;
SGREEN:
OUTSTD_LOGIC;
EYELLOW:
OUTSTD_LOGIC;
EGREEN:
OUTSTD_LOGIC;
GT_SET:
INSTD_LOGIC;
GHUMAN_TIME:
ININTEGERRANGE31DOWNTO0;
GHUMAN_CLKT:
ININTEGERRANGE31DOWNTO0;
GVEHICLE_TIME:
ININTEGERRANGE31DOWNTO0;
REQUEST:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;
RST:
INSTD_LOGIC);
Endcomponent;
SignalTEMP_GHUMAN_TIME:
INTEGERRANGE31DOWNTO0;
SignalTEMP_GHUMAN_CLKT:
INTEGERRANGE31DOWNTO0;
SignalTEMP_GVEHICLE_TIME:
INTEGERRANGE31DOWNTO0;
SignalTEMP_CLEAR,TEMP_CLKADD,TEMP_CLKSUB,TEMP_REQUEST:
std_logic;
Begin
U1:
DITHERportmap(clear,rclear,TEMP_CLEAR);
U2:
DITHERportmap(clkADD,rclkADD,TEMP_CLKADD);
U3:
DITHERportmap(clkSUB,rclkSUB,TEMP_CLKSUB);
U4:
DITHERportmap(request,rrequest,TEMP_REQUEST);
U5:
COUNTportmap(CLK,TEMP_CLEAR,TEMP_CLKADD,TEMP_CLKSUB,PRE_SET,HUMAN_SET,RST,TEMP_GHUMAN_TIME,TEMP_GHUMAN_CLKT,TEMP_GVEHICLE_TIME);
U6:
LIGHTportmap(SRED,ERED,SGREEN,EYELLOW,EGREEN,PRE_SET,TEMP_GHUMAN_TIME,TEMP_GHUMAN_CLKT,TEMP_GVEHICLE_TIME,TEMP_REQUEST,CLK_LS,RST);
Endbehave;
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