数字系统课程设计交通灯 vhdl.docx
- 文档编号:18249002
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:22
- 大小:122.73KB
数字系统课程设计交通灯 vhdl.docx
《数字系统课程设计交通灯 vhdl.docx》由会员分享,可在线阅读,更多相关《数字系统课程设计交通灯 vhdl.docx(22页珍藏版)》请在冰豆网上搜索。
数字系统课程设计交通灯vhdl
数字系统课程设计---交通灯系统
一、设计要求
设计一个交通灯控制系统,具体要求如下:
在两个相邻十字路口处各有四处交通灯,标为A和B,每一处的要求如下:
每一处都有3个灯指示左转,直行和右转车辆,并且灯也分红色和黄色绿色,并配有时间显示,调研实际的运行情况并设计出对应的电路。
并且要完成以下附加功能:
第一,可以将系统根据时间来调整,在白天某一路段比较繁忙对应的通行时间较长,晚上因为另一路段繁忙则做适当的调整;第二,如系统出现故障不能正常显示,则黄灯全部闪烁以提醒车辆注意。
要求系统有一个系统时钟,按照24小时计时,A处和B处早上7点到晚上8点,南北方向绿灯通行时间为50秒,黄灯5秒,左拐灯15秒,黄灯5秒,红灯40秒。
其余时间分别为60秒,5秒,20秒,5秒,30秒。
A处和B处的交通灯是联动的,即A处驶往B处的车辆,在A处南北方向交通灯绿灯后20秒钟后B处的南北方向交通灯绿灯通行。
二、课题分析
三、系统结构图
四、系统流程图
五、系统单个模块的实现及仿真
1、时基脉冲发生模块设计
时基脉冲发生模块向时钟模块提供标准的1秒时钟信号,故需要产生1Hz方波。
因此可以采用对外接时钟信号进行分频得到精确的秒钟计时信号。
本设计用VHDL实现一个计数器,为了实现仿真,对输入时钟信号计数5输出低电平,计数10后输出高电平,得到占空比为50%的放大的。
1Hz输出时钟信号。
其VHDL源程序见附录。
仿真后波形如图三:
图三、时基脉冲发生模块仿真图
2、时钟模块设计
时钟模块由一个24进制计数器和两个60进制计数器构成,分别应用于时、分、秒的计算。
每个60进制计数器都有一进位输出,为下一级计数器提供计数脉冲。
每一个计数器都具有设置输入当前时间的功能,都可以由设定模块控制其值。
时钟模块的主要作用是为提供准确时间输入到时间控制模块,实现交通灯状态机的控制要求,在22点到7点之间使交通灯实现夜间状态。
当需要对时钟进行设定时,只要输入四位BCD码,设置信号LOAD为高电平,作为交通灯计时出错时的修正,以使系统正常的的实现白天夜间的转换。
其中24进制和60进制计数器的VHDL源程序见附录。
24进制和60进制计数器仿真波形如图四、五所示。
图四60进制计数器仿真波形
图五24进制计数器仿真波形
3、时间控制模块设计
时间控制模块的功能是判断小时的数值HOUR1和HOUR2,如果确定时间在7:
00~20:
00点,则该模块输出信号CONT=0,使交通灯处于白天模式显示,否则输出信号CNT=1,交通灯处于夜模式。
其VHDL源程序见附录。
时间控制模块仿真波形如图六所示。
图六、时间控制模块仿真波形
4、状态机模块设计
该模块是交通灯系统的核心,主要根据nstate信号实现状态转换,显示交通灯亮暗情况,并在正常工作情况下输出倒计时秒数,用于显示译码模块显示计时。
当道路出现故障时,可赋予tbreak信号一高电平,使交通灯进入故障状态(黄灯闪烁),故障解除后又可由clr信号进行初始化(路口所有指示灯亮红灯3秒),之后又回到正常工作状态。
状态转换顺序及对应交通灯、倒计时显示情况如表1所示,VHDL源程序见附录[程序5]。
表1状态转换顺序及对应交通灯、倒计时显示情况
状态
交通灯显示情况
倒计时时间
道路情况
状态名
南北方向(ns)
东西方向(e)
白天
故障
guzhang1
010010010
010010010
0
0
guzhang2
000000000
000000000
0
0
初始化
chushi
100100100
100100100
3
3
正
常
s0
100100100
001100100
10
8
s1
100100100
010100100
3
3
s2
100100100
100001001
24
16
s3
100100100
100010010
3
3
s4
001100100
100100100
15
20
s5
010100100
100100100
5
5
s6
100001001
100100100
50
60
s7
100010010
100100100
5
5
状态机模块仿真波形如图七所示。
图七、状态机模块仿真波形
5、显示译码模块设计
显示译码模块显示由状态机模块输出的计时秒数cont,并倒计时且用七段码显示,当计时结束时输出一高电平,使交通灯转入下一状态显示。
译码器真值表如表2所示,VHDL源程序见附录[程序6]。
表2七段译码真值表
十进制数
七段码
十进制数
七段码
0
0000001
5
0100100
1
1001111
6
0100000
2
0010010
7
0000111
3
0000110
8
0000000
4
1001100
9
0001100
显示模块仿真波形如图八所示。
图八显示模块仿真波形
附录:
1、时基脉冲发生模块程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCLKGENIS
PORT(CLK:
INSTD_LOGIC;
NEWCLK:
OUTSTD_LOGIC);
ENDCLKGEN;
ARCHITECTUREbehavOFCLKGENIS
SIGNALCNTER:
INTEGERRANGE0TO10;
BEGIN
PROCESS(CLK)--计数器计数;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCNTER=10THENCNTER<=0;--xiugai32000000
ELSECNTER<=CNTER+1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CNTER)--32M晶振分频;
BEGIN
IFCNTER=5THENNEWCLK<='1';
ELSIFCNTER=10THENNEWCLK<='0';
ENDIF;
ENDPROCESS;
ENDbehav;
2、60进制计数器程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT60IS
PORT(CLK:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
LOAD:
INSTD_LOGIC;
MIN1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
MIN2:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CQ1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CQ2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CARRY_OUT:
OUTSTD_LOGIC);
ENDCNT60;
ARCHITECTUREbehavOFCNT60IS
SIGNALCQI1:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALCQI2:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALC:
STD_LOGIC;
BEGIN
PROCESS(CLK,CLR,LOAD)--计数器的个位输出;
BEGIN
IFCLR='1'THENCQI1<="0000";
ELSIFLOAD='1'THENCQI1<=MIN1;
ELSIFCLK'EVENTANDCLK='1'THEN
IFCQI1<"1001"THENCQI1<=CQI1+1;
ELSECQI1<="0000";
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK,CQI1)--进位输出;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCQI1="1001"THENC<='1';
ELSEC<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(C,CLR,LOAD)--计数器的十位输出;
BEGIN
IFCLR='1'THENCQI2<="0000";
ELSIFLOAD='1'THENCQI2<=MIN2;
ELSIFC'EVENTANDC='1'THEN
IFCQI2<"0101"THENCQI2<=CQI2+1;
ELSECQI2<="0000";
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK,CQI1,CQI2)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCQI2="0101"ANDCQI1="1001"THENCARRY_OUT<='1';
ELSECARRY_OUT<='0';
ENDIF;
ENDIF;
ENDPROCESS;
CQ1<=CQI1;
CQ2<=CQI2;
ENDbehav;
3、24进制计数模块
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT24IS
PORT(CLK:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
LOAD:
INSTD_LOGIC;
HOUR1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
HOUR2:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CQ1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CQ2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
--CARRY_OUT:
OUTSTD_LOGIC
ENDCNT24;
ARCHITECTUREbehavOFCNT24IS
SIGNALCQI1:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALCQI2:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALC:
STD_LOGIC;
BEGIN
PROCESS(CLK,CLR,LOAD,HOUR1)--计数器的个位输出;
BEGIN
IFCLR='1'THENCQI1<="0000";
ELSIFLOAD='1'THENCQI1<=HOUR1;
ELSIFCLK'EVENTANDCLK='1'THEN
IFCQI1<"1001"ANDCQI2<"0010"THENCQI1<=CQI1+1;
ELSIFCQI1<"0011"ANDCQI2="0010"THENCQI1<=CQI1+1;
ELSECQI1<="0000";
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK,CQI1)--进位输出;
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCQI1="1001"THENC<='1';
ELSIFCQI1="0011"ANDCQI2="0010"THENC<='1';
ELSEC<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(C,CLR,LOAD,HOUR2)--计数器的十位输出;
BEGIN
IFCLR='1'THENCQI2<="0000";
ELSIFLOAD='1'THENCQI2<=HOUR2;
ELSIFC'EVENTANDC='1'THEN
IFCQI2<"0010"THENCQI2<=CQI2+1;
--ELSIFCQI2=2ANDCQI1=3THENCQI2<=0;
ELSECQI2<="0000";
ENDIF;
ENDIF;
ENDPROCESS;
CQ1<=CQI1;
CQ2<=CQI2;
ENDbehav;
4、时间控制模块程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcontrolIS
PORT(HOUR1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
HOUR2:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CNTW:
OUTSTD_LOGIC);
ENDcontrol;
ARCHITECTUREbehavOFcontrolIS
BEGIN
PROCESS(HOUR1,HOUR2)
BEGIN
IFHOUR2="0010"ANDHOUR1>="0000"THENCNTW<='0';
ELSIFHOUR2="0000"ANDHOUR1<"0111"THENCNTW<='0';
ELSECNTW<='1';
ENDIF;
ENDPROCESS;
ENDbehav;
5、状态机模块程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtrafficIS
PORT(break,clr,CNTW,nstate,clk:
INSTD_LOGIC;
cont:
outSTD_LOGIC_VECTOR(5DOWNTO0);
ns,we:
OUTSTD_LOGIC_VECTOR(8DOWNTO0));
ENDtraffic;
ARCHITECTUREbehavOFtrafficIS
TYPESTATESIS(guzhang1,chushi,s0,s1,s2,s3,s4,s5,s6,s7);--guzhang2,
SIGNALCURRENT_STATE,NEXT_STATE:
STATES;
--SIGNALCcmt:
STD_LOGIC;
--SIGNALcnt:
INTEGERRANGE0TO50;
CONSTANTgu:
STD_LOGIC_VECTOR(5DOWNTO0):
="111111";
CONSTANTstart:
STD_LOGIC_VECTOR(5DOWNTO0):
="000011";
CONSTANTd0:
STD_LOGIC_VECTOR(5DOWNTO0):
="001010";
CONSTANTd1:
STD_LOGIC_VECTOR(5DOWNTO0):
="000011";
CONSTANTd2:
STD_LOGIC_VECTOR(5DOWNTO0):
="011000";
CONSTANTd3:
STD_LOGIC_VECTOR(5DOWNTO0):
="000011";
CONSTANTd4:
STD_LOGIC_VECTOR(5DOWNTO0):
="001111";
CONSTANTd5:
STD_LOGIC_VECTOR(5DOWNTO0):
="000101";
CONSTANTd6:
STD_LOGIC_VECTOR(5DOWNTO0):
="110010";
CONSTANTd7:
STD_LOGIC_VECTOR(5DOWNTO0):
="000101";
CONSTANTn0:
STD_LOGIC_VECTOR(5DOWNTO0):
="001000";
CONSTANTn1:
STD_LOGIC_VECTOR(5DOWNTO0):
="000011";
CONSTANTn2:
STD_LOGIC_VECTOR(5DOWNTO0):
="010000";
CONSTANTn3:
STD_LOGIC_VECTOR(5DOWNTO0):
="000011";
CONSTANTn4:
STD_LOGIC_VECTOR(5DOWNTO0):
="010100";
CONSTANTn5:
STD_LOGIC_VECTOR(5DOWNTO0):
="000101";
CONSTANTn6:
STD_LOGIC_VECTOR(5DOWNTO0):
="111100";
CONSTANTn7:
STD_LOGIC_VECTOR(5DOWNTO0):
="000101";
BEGIN
PROCESS(clr,break,nstate,clk)
BEGIN
ifclk'eventandclk='1'then
IFclr='1'THENCURRENT_STATE<=chushi;
elsIFbreak='1'THENCURRENT_STATE<=guzhang1;
--ifccmt='1'thenCURRENT_STATE<=guzhang1;
--elsifccmt='0'thenCURRENT_STATE<=guzhang2;
--endif;
elsIFnstate='1'THENcurrent_state<=next_state;
ELSEcurrent_state<=current_state;
endif;
endif;
ENDPROCESS;
PROCESS(CURRENT_STATE,CNTW)
BEGIN
CASECURRENT_STATEIS
WHENguzhang1=>cont<=gu;
ns<="010010010";
we<="010010010";
--ccmt<='0';
--WHENguzhang2=>cont<=gu;
--ns<="000000000";
--we<="000000000";
--ccmt<='1';
WHENchushi=>NEXT_STATE<=s0;
cont<=start;
ns<="100100100";
we<="100100100";
WHENs0=>NEXT_STATE<=s1;
ifCNTW='1'thencont<=d0;elsecont<=n0;endif;
ns<="100100100";
we<="001100100";
WHENs1=>NEXT_STATE<=s2;
ifCNTW='1'thencont<=d1;elsecont<=n1;endif;
ns<="100100100";
we<="010100100";
WHENs2=>NEXT_STATE<=s3;
ifCNTW='1'thencont<=d2;elsecont<=n2;endif;
ns<="100100100";
we<="100001001";
WHENs3=>NEXT_STATE<=s4;
ifCNTW='1'thencont<=d3;elsecont<=n3;endif;
ns<="100100100";
we<="100010010";
WHENs4=>NEXT_STATE<=s5;
ifCNTW='1'thencont<=d4;elsecont<=n4;endif;
ns<="001100100";
we<="100100100";
WHENs5=>NEXT_STATE<=s6;
ifCNTW='1'thencont<=d5;elsecont<=n5;endif;
ns<="010100100";
we<="100100100";
WHENs6=>NEXT_STATE<=s7;
ifCNTW='1'thencont<=d6;elsecont<=n6;endif;
ns<="100001001";
we<="100100100";
WHENs7=>NEXT_STATE<=s0;
ifCNTW='1'thencont<=d7;elsecont<=n7;endif;
ns<="100010010";
we<="100100100";
ENDCASE;
ENDPROCESS;
ENDBEHAV;
6、显示译码模块程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDECLEDIS
PORT(CLK:
INSTD_LOGIC;
CNT:
INSTD_LOGIC_VECTOR(5DOWNTO0);
led1:
outstd_logic_vector(6downto0);
led2:
outstd_logic_vector(6downto0);
NSTATE:
OUTSTD_LOGIC);
ENDDECLED;
ARCHITECTUREbehavOFDECLEDIS
SIGNALCNTQ:
STD_LOGIC_VECTOR(5DOWNTO0):
="000000";
BEGIN
PROCESS(CNT,clk)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
ifcnt="111111"thenled1(6downto0)<="0000001";led2(6downto0)<="0000001";
elsIFCNTQ=CNT-1THENled1(6downto0)<="0000001";led2(6downto0)<="1001111";
--cntq<="000000";
CnTQ<=CnTQ+1;
NSTATE<='1';
elsifcntq CASE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字系统课程设计交通灯 vhdl 数字 系统 课程设计 交通灯