基于某VHDL的交通信号灯设计.docx
《基于某VHDL的交通信号灯设计.docx》由会员分享,可在线阅读,更多相关《基于某VHDL的交通信号灯设计.docx(13页珍藏版)》请在冰豆网上搜索。
基于某VHDL的交通信号灯设计
交通灯控制器
姓名__孔亮__学号__0928401116__专业__电子信息工程__
一、设计要求:
1、能显示十字路口东西、南北两个方向的红、黄、绿灯的指示状态,用两组发光管表示两个方向的红、黄、绿灯。
2、能实现正常的倒计时功能。
用两个数码管LED作为东西、南北方向的时间显示,时间为红灯45秒,绿灯40秒,黄灯5秒。
3、能实现特殊状态的功能。
按键1按下后能实现:
(1)、计数器停止计数并保持在原来的状态。
(2)、东西南北路口均显示红灯状态。
(3)、特殊状态解除后能继续计数。
4、能实现总体清零功能
按键2按下后系统实现总清零,计数器由初始状态计数,对应状态的指示灯亮。
二、设计过程:
1、总体设计概要:
根据交通灯控制器的功能与要求,将其总体电路分为状态控制,倒计时,数码管显示,信号灯显示模块(jtd_ctrl,jtd_time,jtd_xs,jtd_light),jtd_ctrl实现逻辑与时序控制,外部两路脉冲振荡器的频率选为1kHz和1Hz的信号。
M
CTR
CLK
计时电路
扫描显示电路
LED1
LED2
LED3
LED4
CTR
M
CLK
CLK1K
图1设计框图
2、交通灯原理分析
当M=‘1’时,进入紧急状态,ABL输出为B“100100”,即南北、东西方向均为红灯亮。
当M=‘1’跳变到M=‘0’时,数码管继续计时,恢复正常工作状态。
当CTR=‘1’时,系统清零,交通灯从初始状态(即ABL输出为“100010”)开始工作。
当M=‘0’且CTR=‘0’时,交通灯即开始正常工作。
经过40秒,ABL由B“100010”变为B“100001”,再经过5秒,ABL变为B“010100”,再经过40秒,S变为B“001100”,再经过5秒,ABL变为B“100010”……如此循环下去。
南北、东西方向的红绿灯按表一表二变化。
表一交通灯状态转换表
东西(A)方向
红灯
绿灯
黄灯
45秒
40秒
5秒
南北(B)方向
绿灯
黄灯
红灯
40秒
5秒
45秒
表二交通灯状态转换表
CTR
M
ABL
备注
0
1
100100
长时间亮红灯
1
0
100010
初始状态
0
0
状态1:
100010
持续40秒,转到状态2
状态2:
100001
持续5秒,转到状态3
状态3:
010100
持续40秒,转到状态4
状态4:
001100
持续5秒,转到状态1
注:
S的六位分别对应东西(A)方向的红绿黄和南北(B)方向的红绿黄,’1’表示亮,’0’表示灭。
三、模块设计及仿真
1、顶层文件的设计
顶层原理图设计可以依据系统框图进行,由反馈控制,倒计时,数码管显示,信号灯显示模块(jtd_ctrl,jtd_time,jtd_xs,jtd_light)五部分组成。
其顶层原理图如图2所示。
图2顶层原理图
顶层文件的仿真波形图如图3所示:
图3顶层文件的仿真波形
2、状态控制模块(jtd_ctrl)的设计
状态控制模块根据倒计时模块(jtd_time)的输出信号和1Hz的时钟信号,产生系统的状态机,控制其他部分的协调工作。
该模块的源文件程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYJTD_CTRLIS
PORT(CLK:
INSTD_LOGIC;
CTR:
INSTD_LOGIC;
AT,BT:
INSTD_LOGIC_VECTOR(7DOWNTO0);
S:
OUTSTD_LOGIC_VECTOR(1DOWNTO0));
ENDJTD_CTRL;
ARCHITECTUREJTDOFJTD_CTRLIS
SIGNALQ:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
PROCESS(CLK,AT,BT,CTR)
BEGIN
IFCTR='1'THENQ<="00";
ELSE
IFCLK'EVENTANDCLK='1'THEN
IF(AT=X"01")OR(BT=X"01")THENQ<=Q+1;
ELSEQ<=Q;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
S<=Q;
ENDJTD;
状态控制模块的仿真波形如图4所示:
图4状态控制模块的仿真波形图
3、倒计时模块(jtd_time)的设计
倒计时模块用来设定A和B两个方向计时器的初值,并为数码管显示模块提供倒计时时间。
倒计时模块源文件程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYJTD_TIMEIS
PORT(CLK:
INSTD_LOGIC;
M:
INSTD_LOGIC;
CTR:
INSTD_LOGIC;
S:
INSTD_LOGIC_VECTOR(1DOWNTO0);
AT,BT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDJTD_TIME;
ARCHITECTUREJTD_1OFJTD_TIMEIS
SIGNALATI:
STD_LOGIC_VECTOR(7DOWNTO0):
=X"01";
SIGNALBTI:
STD_LOGIC_VECTOR(7DOWNTO0):
=X"01";
SIGNALART,AGT,AYT:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALBRT,BGT,BYT:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
ART<=X"45";
AGT<=X"40";
AYT<=X"05";
BRT<=X"45";
BGT<=X"40";
BYT<=X"05";
PROCESS(CLK,M,S,CTR)
BEGIN
IFM='1'THENATI<=ATI;
ELSE
IFCLK'EVENTANDCLK='1'THEN
CASESIS
WHEN"00"=>ATI<=ART;
WHEN"10"=>ATI<=AGT;
WHEN"11"=>ATI<=AYT;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDIF;
IFCTR='1'THEN
ATI<=ART;
ELSE
IFATI/=X"01"THEN
IFATI(3DOWNTO0)="0000"THEN
ATI(3DOWNTO0)<="1001";
ATI(7DOWNTO4)<=ATI(7DOWNTO4)-1;
ELSEATI(3DOWNTO0)<=ATI(3DOWNTO0)-1;
ATI(7DOWNTO4)<=ATI(7DOWNTO4);
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK,M,S,CTR)
BEGIN
IFM='1'THENBTI<=BTI;
ELSE
IFCLK'EVENTANDCLK='1'THEN
CASESIS
WHEN"00"=>BTI<=BGT;
WHEN"01"=>BTI<=BYT;
WHEN"10"=>BTI<=BRT;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDIF;
IFCTR='1'THEN
BTI<=BGT;
ELSE
IFBTI/=X"01"THEN
IFBTI(3DOWNTO0)="0000"THEN
BTI(3DOWNTO0)<="1001";
BTI(7DOWNTO4)<=BTI(7DOWNTO4)-1;
ELSEBTI(3DOWNTO0)<=BTI(3DOWNTO0)-1;
BTI(7DOWNTO4)<=BTI(7DOWNTO4);
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
AT<=ATI;
BT<=BTI;
ENDJTD_1;
倒计时模块的仿真波形图如图5所示:
图5倒计时模块的仿真波形图
4、数码管显示模块(jtd_xs)的设计
显示模块用来显示倒计时时间。
采用动态扫描显示,通过分位程序,控制四个数码管的显示时间。
数码管显示模块的源文件程序为:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYJTD_XSIS
PORT(CLK1K:
INSTD_LOGIC;
AT,BT:
INSTD_LOGIC_VECTOR(7DOWNTO0);
LED1,LED2,LED3,LED4:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDJTD_XS;
ARCHITECTUREJTD_3OFJTD_XSIS
SIGNALOU1,OU2,OU3,OU4:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALSL:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
PROCESS(CLK1K)
BEGIN
IFCLK1K'EVENTANDCLK1K='1'THEN
IFSL="11"THENSL<="00";
ELSESL<=SL+1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(SL,AT,BT)
BEGIN
CASESLIS
WHEN"00"=>OU1<=BT(3DOWNTO0);
WHEN"01"=>OU2<=BT(7DOWNTO4);
WHEN"10"=>OU3<=AT(3DOWNTO0);
WHEN"11"=>OU4<=AT(7DOWNTO4);
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
LED1<=OU1;
LED2<=OU2;
LED3<=OU3;
LED4<=OU4;
ENDJTD_3;
数码管显示模块的仿真波形图如图6所示:
图6数码管显示模块的仿真波形图
5、信号灯显示模块(jtd_light)的设计
通过控制模块的输出的状态控制信号,控制六个信号灯的亮灭。
信号灯显示模块的源文件程序为:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYJTD_LIGHTIS
PORT(M:
INSTD_LOGIC;
S:
INSTD_LOGIC_VECTOR(1DOWNTO0);
ABL:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
ENDJTD_LIGHT;
ARCHITECTUREJTD_2OFJTD_LIGHTIS
SIGNALLT:
STD_LOGIC_VECTOR(5DOWNTO0);
BEGIN
PROCESS(S,M)
BEGIN
IFM='1'THENLT<="100100";
ELSE
CASESIS
WHEN"00"=>LT<="100010";
WHEN"01"=>LT<="100001";
WHEN"10"=>LT<="010100";
WHEN"11"=>LT<="001100";
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDPROCESS;
ABL<=LT;
ENDJTD_2;
信号灯显示模块的仿真波形图如图7所示:
图7信号灯显示模块的仿真波形图
三、引脚映射
本次设计我们采用GW48EDA实验箱,选择芯片EP1K30TC144-1,选择模式3,引脚映射如表三所示:
表三引脚映射
Node
Pin
1
ABL[0]
21
2
ABL[1]
22
3
ABL[2]
23
4
ABL[3]
26
5
ABL[4]
27
6
ABL[5]
27
7
CLK
54
8
CLK1K
126
9
LED1[0]
41
10
LED1[1]
42
11
LED1[2]
65
12
LED1[3]
67
13
LED2[0]
68
14
LED2[1]
69
15
LED2[2]
70
16
LED2[3]
72
17
LED3[0]
73
18
LED3[1]
78
19
LED3[2]
79
20
LED3[3]
80
21
LED4[0]
81
22
LED4[1]
82
23
LED4[2]
83
24
LED4[3]
86
25
M
8
26
CTR
9
四、编程下载
在实验箱上选择clock2为1Hz,clock0为1024Hz,模式选择模式3,引脚锁定如表三所示。
下载后,结果显示正确,六个信号灯依次为东西方向的红绿黄和南北方向的红绿黄。
两个方向上的数码管显示的时间完全吻合。
键1为紧急状态控制开关,按下键1时,两路信号灯都为红灯,时间暂停,再次按下键1,恢复原状态,继续计时。
键2为清零开关,按下键2时,两路信号灯从初始状态开始计时,结果证实调试成功。
五、实验总结
通过紧张的实验,我完成了设计任务——用VHDL设计交通灯控制器。
通过本次课程设计的学习,我深深地体会到设计课的重要性和目的性。
为了完成项目,我在网络上找到了许多相关资料,大大扩充自己的知识面,使许多以前想解决却无法解决的困难迎刃而解。
对软件设计流程有了更深刻的理解,掌握了MAX+plusⅡ的使用。
将书本上的理论知识和实际有机地结合起来,锻炼了实际分析问题和解决问题的能力,提高了适应实际的能力,为今后的学习和实践打下了良好的基础。
本次EDA课程设计的目的和意义,通过设计交通灯控制器,了解EDA技术,了解并掌握VHDL硬件描述语言的设计方法和思想,巩固和综合运用所学过的原理知识,提高分析、解决实际问题的独立工作能力。