EDA交通灯课程设计CPLD实现交通灯控制系统.docx
- 文档编号:24915514
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:21
- 大小:261.29KB
EDA交通灯课程设计CPLD实现交通灯控制系统.docx
《EDA交通灯课程设计CPLD实现交通灯控制系统.docx》由会员分享,可在线阅读,更多相关《EDA交通灯课程设计CPLD实现交通灯控制系统.docx(21页珍藏版)》请在冰豆网上搜索。
EDA交通灯课程设计CPLD实现交通灯控制系统
CPLD实现交通灯控制系统
一.预期功能
分别成东西走向和南北走向的主干道和支干道,其交通信号灯,分别实现一下状态:
S0:
支干道没有车辆行驶,支干道绿灯,支干道红灯
S1:
支干道有车辆行驶,支干道绿灯,支干道红灯
S2:
主干道黄灯,支干道绿灯
S3:
主干道红灯,支干道绿灯
S4:
主干道红灯,支干道黄灯
状态亮灯停留时间
S0G2,R250秒
S1G2,R245秒
S2Y1,G25秒
S3R1,G225秒
S4R1,Y25秒
二.原理框图
根据设计要求和系统所具有的功能,并参考相关的文献资料,经行方案设计,可以画出如下图所示的交通信号灯控制器的系统框图。
1kHZ
1kHZ1HZ
支干道车辆检测
1kHZ
数码管及LED信号
根据以上设计思路,可以得到如下的顶层文件原理图
顶层文件的实体图:
三.单元模块设计与仿真
时钟分频模块
系统的动态扫描需要1HZ的脉冲,而系统时钟计时模块需要1HZ的脉冲。
分频模块主要为系统提供所需的时钟计时脉冲。
该模块将1kHZ的脉冲信号进行分频,产生1S的方波,作为系统时钟计时信号。
其实体模块如下:
将ENDTIME改为5S
CLK采用系统的1KHZ的时钟脉冲
仿真波形如下:
可以看到能够得到1s的时钟脉冲
交通灯控制及计时模块
控制模块根据外部输入信号和计时模块产生的输出信号,产生系统的状态机,控制其他部分协调工作。
计时模块用来设定主干道和支干道计时器的初值,并为扫描显示译码模块提供倒计时时间。
控制及计时模块采用状态机进行设计,可以定义出5种状态,分别为S0:
主干道绿灯,支干道红灯且没有车辆行驶;S1:
主干道绿灯,支干道红灯或支干道有车辆驶入;S2:
主干道黄灯,支干道红灯;S3:
主干道红灯,支干道绿灯;S4:
主干道红灯,支干道黄灯。
利用CASE语句定义状态的转换方式及时间的变换方式,达到主干道绿灯亮45秒,支干道绿灯亮25秒,黄灯亮5秒的设计要求。
其实体模块如下:
CAR为支干道车辆检测开关
在支干道有车的情况下,模块可以进行减计时
CLK1S为1S的时钟脉冲
TIME1H、TIME1L、TIME2H、TIME2L分别为主干道时钟高位、主干道时钟低位、支干道时钟高位、支干道时钟低位
LED为LED灯发光情况,分别为主干道绿灯、主干道黄灯、主干道红灯、支干道绿灯、主干道黄灯、主干道红灯
Count的总的系统时间,用来改变系统的状态
仿真波形如下:
通过仿真可以看到:
当主干道绿灯,支干道红灯时,主干道倒计时高位置数0100,低位置数0101;支干道高位置数0101,低位置数0000;
当主干道黄灯,支干道红灯时,主干道黄灯倒计时置数0101;支干道继续刚才的减计数;
当主干道红灯,支干道绿灯时,主干道倒计时高位置数0011,低位置数0000;支干道高位置数0010,低位置数0101;
当主干道红灯,支干道黄灯时,支干道黄灯倒计时置数0101;主干道继续刚才的减计数。
在S4状态结束后,自动跳回到S0状态,继续判断支干道是否有车行驶,若有车行驶,则跳转到S1状态,给高、低位置数,继续进行减计时。
系统根据COUNT的变化自动在各状态下跳变,当count为45时,跳变到S2状态;当count为50时,跳变到S3状态;当count为75时,跳变到S4状态;当count为80时,若支干道没有车跳变到S0状态,有车则跳变到S1状态。
扫描显示译码模块
扫描显示译码模块可以根据控制信号,驱动交通信号灯以及倒计时数码管的显示,其中数码管的显示采用动态扫描显示。
其实体模块如下:
CLK为1KHZ的系统时钟脉冲
CLK1S为1S时钟脉冲
CAR为支干道车辆检测开关
SEL为数码管位码扫描
SEG为数码管段码
TIME1H、TIME1L、TIME2H、TIME2L为数码管计时的时间,由控制及计时模块为其赋值
仿真波形如下:
通过仿真可以看到:
给CLK一个时钟脉冲,数码管的位码随CLK时钟的变化而进行扫描,由于CLK的频率较高,人的眼睛会有短暂的视觉停留,所以会看到4个数码管都在显示时间。
四.顶层文件的编写
将以上各个单元模块仿真成功后,再进行顶层文件的编写。
将各个单元模块的变量赋值给顶层文件,从而将各个单元模块连接起来,统一调配。
得到顶层文件的实体模块:
CLK为1KHZ系统时钟脉冲
CAR为支干道车辆行驶情况,高电平为有车行驶,低电平为无车行驶
LED为交通灯发光情况
SEL为数码管位码扫描
SEG为数码管段码
仿真波形如下:
仿真后可以得到最终的结果:
开始时,支干道没有车辆行驶。
主干道处于常通行状态,支干道处于禁止状态;当支干道有车来时,主干道亮绿灯,经行45秒倒计时,支干道亮红灯,经行50秒倒计时;
主干道45秒倒计时结束后跳变到黄灯,进行5秒倒计时,支干道继续亮红灯,进行倒计时;
主干道5秒倒计时结束后跳变到红灯,经行30秒倒计时,支干道跳变到绿灯,进行25秒倒计时;
支干道25秒倒计时结束后跳变到黄灯,进行5秒倒计时,主干道继续亮红灯,进行倒计时;
支干道5秒倒计时结束后,判断支干道是否有车,若有车跳变到S1状态,没有车跳变到S0状
硬件实验方案及实验结果
将程序进行编译后,就可以把管脚绑定后把程序下载到实验板上进行调试了。
硬件实验方案
管脚绑定如下所示
TO
Location
I/OBank
1
CLK
PIN_152
3
2
CAR
PIN_160
3
3
SEG[0]
PIN_175
3
4
SEG[1]
PIN_176
3
5
SEG[2]
PIN_177
3
6
SEG[3]
PIN_178
3
7
SEG[4]
PIN_179
3
8
SEG[5]
PIN_180
3
9
SEG[6]
PIN_1
1
10
SEL[0]
PIN_3
1
11
SEL[1]
PIN_4
1
12
SEL[2]
PIN_5
1
13
LED[0]
PIN_170
3
14
LED[1]
PIN_173
3
15
LED[2]
PIN_174
3
16
LED[3]
PIN_165
3
17
LED[4]
PIN_166
3
18
LED[5]
PIN_167
3
注:
CLK绑定时钟1KHZ
CAR绑定DK4
LED[0]绑定LED6;--支干道红灯
LED[1]绑定LED7;--支干道黄灯
LED[2]绑定LED8;--支干道绿灯
LED[3]绑定LED1;--主干道红灯
LED[4]绑定LED2;--主干道黄灯
LED[5]绑定LED3;--主干道绿灯
SEL[0]绑定LI0;
SEL[1]绑定LI1;
SEL[2]绑定LI2。
SEG[0]绑定G8;
SEG[1]绑定F8;
SEG[2]绑定E8;
SEG[3]绑定D8;
SEG[4]绑定C8;
SEG[5]绑定B8;
SEG[6]绑定A8;
将管脚按上图绑定后就可以下载到实验板上进行调试了
五.最后结果
将程序下载到实验板后,CAR置于低电平后,可以看到LED灯的显示情况为主干道亮绿灯,支干道亮红灯,主干道数码管显示45秒,支干道数码管显示50秒。
但支干道有车时,把CAR置于高电平,可以看到主、支干道的数码管开始倒计时;主干道倒计时结束后再进行5秒倒计时,并且交通灯变为黄灯;当主干道倒计时结束后,主干道数码管显示30,支干道数码管显示25,主干道变为红灯,支干道变为绿灯,继续进行倒计时;支干道倒计时结束后再经行5秒倒计时,交通灯变为黄灯;支干道倒计时结束后再回到初始状态。
从实验板上可以看出硬件测试下的效果达到了设计的要求,能够实现交通信号灯控制器的基本功能。
但是,由于实验板的系统时钟不稳定,导致数码管的扫描有时会出现闪动的现象,在更换了实验板后可以看出,数码管的扫描基本稳定,在视觉上不会出现闪动的情况。
或者可以将系统的时钟频率改为2KHZ,更改分频模块后再进行编译下载,这样可以加快数码管扫描的速度,从而达到消除视觉上闪动的现象。
六.参考文献
1《EDA技术与VHDL》清华大学出版社潘松黄继业
2《数字电路EDA入门------VHDL程序实例集》北京邮电大学出版社张亦华
3《VHDL应用与开发实践》科学出版社甘历
4《CPLD/FPGA应用开发技术与工程实践》人民邮电出版社
5《FPGA系统设计与实践》电子工业出版社黄智伟
七附录(程序代码)
时钟分频模块:
LILIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfpIS
PORT(clk:
INSTD_LOGIC;
CLK1S:
OUTSTD_LOGIC);
ENDfp;
ARCHITECTUREoneOFfpIS
SIGNALN:
STD_LOGIC_VECTOR(9DOWNTO0);
BEGIN
PROCESS(clk)
BEGIN
IFclk'EVENTANDclk='1'THENN<=N+1;
ENDIF;
ENDPROCESS;
CLK1S<=N(9);
ENDone;
交通灯控制及计时模块:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYkzIS
PORT(CLK1S,car:
INSTD_LOGIC;--1S脉冲,支干道车辆检测
TIME1H,TIME1L:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--主干道计时
TIME2H,TIME2L:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--支干道计时
count:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);--系统总计时
led:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));--交通灯显示
ENDkz;
ARCHITECTUREoneOFkzIS
TYPEstatesIS(s0,s1,s2,s3,s4);--状态初始化
SIGNALcurrent_state,next_state:
states;
SIGNALc:
STD_LOGIC_VECTOR(6DOWNTO0);
BEGIN
REG:
PROCESS(CLK1S,car,current_state,c)
BEGIN
IFcar='0'THENcurrent_state<=s0;
c<="0000000";
ELSE
IFCLK1S'EVENTANDCLK1S='1'THEN--支干道有车开始计数
c<=c+1;
current_state<=next_state;
ENDIF;
ENDIF;
CASEcurrent_stateIS--状态转换
WHENs0=>LED<="100001";--支干道无车不减计时
TIME1H<="0100";TIME1L<="0101";
TIME2H<="0101";TIME2L<="0000";
IFcar='1'THENnext_state<=s1;
ELSEnext_state<=s0;
ENDIF;
WHENs1=>LED<="100001";--主干道绿灯,支干道红灯
IFc="0101100"THENnext_state<=s2;
ELSEnext_state<=s1;
ENDIF;
WHENs2=>LED<="010001";--主干道黄灯,支干道红灯
IFc="0110001"THENnext_state<=s3;
ELSEnext_state<=s2;
ENDIF;
WHENs3=>LED<="001100";--主干道红灯,支干道绿灯
IFc="1001010"THENnext_state<=s4;
ELSEnext_state<=s3;
ENDIF;
WHENs4=>LED<="001010";--主干道红灯,支干道黄灯
IFc="1001111"THENnext_state<=s1;
ELSEnext_state<=s4;
ENDIF;
WHENOTHERS=>LED<="100001";next_state<=s0;
ENDCASE;
IFc="0101101"THENTIME1H<="0000";TIME1L<="0101";--系统时间为45,主干道黄灯计时5秒
ENDIF;
IFc="0110010"THENTIME1H<="0011";TIME1L<="0000";TIME2H<="0010";TIME2L<="0101";--系统时间为50,支干道计时30秒。
支干道计时25秒
ENDIF;
IFc="1001011"THENTIME2H<="0000";TIME2L<="0101";--系统时间为75,支干道黄灯计时5秒
ENDIF;
IFc="1010000"THENTIME1H<="0100";TIME1L<="0101";TIME2H<="0101";TIME2L<="0000";--系统时间为80,主干道计时45,支干道计时50
ENDIF;
IFc="1010000"THENc<="0000000";--系统时间清零
ENDIF;
ENDPROCESSREG;
count<=c;
ENDone;
扫描显示译码模块:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYxsIS
PORT(clk,CLK1S,car:
INSTD_LOGIC;
TIME1H,TIME1L:
INSTD_LOGIC_VECTOR(3DOWNTO0);--主干道置数
TIME2H,TIME2L:
INSTD_LOGIC_VECTOR(3DOWNTO0);--支干道置数
count:
INSTD_LOGIC_VECTOR(6DOWNTO0);--计数信号
sel:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);--数码管位码
seg:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));--数码管段码
ENDxs;
ARCHITECTUREoneOFxsIS
SIGNALnum:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALnumsel:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALnumseg:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALQ1,Q2,Q3,Q4:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
SM:
PROCESS(clk,num,numsel)--扫描
BEGIN
IFclk'EVENTANDclk='1'THENnumsel<=numsel+1;
IFnumsel="011"THENnumsel<="000";
ENDIF;
ENDIF;
ENDPROCESSSM;
WX:
PROCESS(numsel,Q1,Q2,Q3,Q4)--位选
BEGIN
CASEnumselIS
WHEN"000"=>num<=Q4;
WHEN"001"=>num<=Q3;
WHEN"010"=>num<=Q2;
WHEN"011"=>num<=Q1;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSWX;
ZS:
PROCESS(CLK1S,car,Q1,Q2,Q3,Q4,num,TIME1H,TIME1L,TIME2H,TIME2L)--数码管置数
BEGIN
IFcar='1'THEN
IFCLK1S'EVENTANDCLK1S='1'THEN
IFQ2>"0000"THENQ2<=Q2-1;
ELSE
IFQ1>"0000"THENQ1<=Q1-1;Q2<="1001";
--减计时ENDIF;
ENDIF;
IFQ4>"0000"THENQ4<=Q4-1;
ELSE
IFQ3>"0000"THENQ3<=Q3-1;Q4<="1001";
ENDIF;
ENDIF;
ENDIF;
IFQ1="0000"ANDQ2="0000"THEN
Q1<=TIME1H;Q2<=TIME1L;
ENDIF;
IFQ3="0000"ANDQ4="0000"THEN
Q3<=TIME2H;Q4<=TIME2L;
ENDIF;
ELSEQ1<=TIME1H;Q2<=TIME1L;--支路无车辆不减计时
Q3<=TIME2H;Q4<=TIME2L;
ENDIF;
ENDPROCESSZS;
YM:
PROCESS(num,numseg)
BEGIN
CASEnumIS
WHEN"0000"=>numseg<="1111110";
WHEN"0001"=>numseg<="0110000";
WHEN"0010"=>numseg<="1101101";
WHEN"0011"=>numseg<="1111001";
WHEN"0100"=>numseg<="0110011";
WHEN"0101"=>numseg<="1011011";
WHEN"0110"=>numseg<="1011111";
WHEN"0111"=>numseg<="1110000";
WHEN"1000"=>numseg<="1111111";
WHEN"1001"=>numseg<="1111011";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSYM;
sel<=numsel;
seg<=numseg;
ENDone;
顶层文件:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYjtdIS
PORT(clk:
INSTD_LOGIC;--动态扫描时钟
car:
INSTD_LOGIC;--支路车辆传感信号
led:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);--交通灯信号
sel:
OUTSTD_LOGIC_VECTOR(2downto0);--数码管位码
seg:
OUTSTD_LOGIC_VECTOR(6downto0));--数码管段码
ENDjtd;
ARCHITECTUREoneOFjtdIS
COMPONENTfp--分频
PORT(clk:
INSTD_LOGIC;
CLK1S:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTkz
PORT(
CLK1S,car:
INSTD_LOGIC;
TIME1H,TIME1L:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
TIME2H,TIME2L:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
count:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
led:
OUTSTD_LOGIC_VECTOR(5DOWNTO0));
ENDCOMPONENT;
COMPONENTxs--倒计时显示
PORT(clk,CLK1S,car:
INstd_logic;
TIME1H,TIME1L:
INSTD_LOGIC_VECTOR(3DOWNTO0);
TIME2H,TIME2L:
INSTD_LOGIC_VECTOR(3DOWNTO0);
count:
INSTD_LOGIC_VECTOR(6DOWNTO0);
sel:
OUTstd_logic_vector(2DOWNTO0);
seg:
OUTstd_logic_vector(6DOWNTO0));
ENDCOMPONENT;
SIGNALCLK1S:
std_logic;
SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALTIME1H,TIME1L,TIME2H,TIME2L:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
U1:
fpPORTMAP(clk=>clk,CLK1S=>CLK1S);
U2:
kzPORTMAP(CLK1S=>CLK1S,car=>car,count=>count,led=>led,TIME1H=>TIME1H,TIME1L=>TIME1L,TIME2H=>TIME2H,TIME2L=>TIME2L);
U3:
xsPORTMAP(clk=>clk,CLK1S=>CLK1S,car=>car,count=>count,sel=>sel,seg=>seg,TIME1H=>TIME1H,TIME1L=>TIME1L,TIME2H=>TIME2H,TIME2L=>TIME2L);
END;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 交通灯 课程设计 CPLD 实现 控制系统