交通灯控制逻辑电路设计与总结报告.docx
《交通灯控制逻辑电路设计与总结报告.docx》由会员分享,可在线阅读,更多相关《交通灯控制逻辑电路设计与总结报告.docx(13页珍藏版)》请在冰豆网上搜索。
交通灯控制逻辑电路设计与总结报告
交通灯控制逻辑电路设计与总结报告
一、设计任务
用CPLD设计路口交通灯控制器
二、设计要求
1、满足一下时序要求:
南北方向红灯亮,东西方向绿灯亮;南北方向绿灯亮,东西方向红灯亮;
2、每一方向的红(绿)黄灯总共维持30秒;
3、十字路口要有时间显示,具体为:
当某一方向绿灯亮时,置显示器为30秒,然后以每秒减一技术方式工作,直至减到数为4秒时,红绿灯熄灭,黄灯开始间隙闪耀4秒,减到0时,红绿灯交换,一次工作循环结束,进入下一步另一方向的工作循环;
4、红绿灯均采用发光二极管;
5、设计由晶振电路产生1Hz标准秒信号的单元电路(实际秒脉冲由开发箱提供);
6、要求对整体电路进行仿真,观察并记录下仿真波形;
7、选作部分:
a、手动调整和自动控制,夜间为黄灯闪耀;
b、白天黄灯亮时,以2Hz的速度闪烁点亮四秒;
c、红绿灯循环点亮时间可以自由修改。
三、设计设备
含有Quartus软件的电脑一台,可下载的试验台;
四、设计方法
使用VHDL语言进行程序的设计运行和仿真,以及波形的运行仿真,最后进行下载仿真;
五、方案论证
方案1:
把整个流程分成几个进程来做;
方案2:
每个进程都使用if和case语句实现功能的实现;
方案3:
使用状态机来实现状态间的转换;
方案论证:
1、要实现整个流程,需要做的输出内容类型不同,如果放在一个进程里面就比较容易混淆,产生混乱。
而采用分成几个进程来做的方式就明确了每个模块的内容和分工,使其调理清晰,一目了然;
2、if语句是条件语句,是VHDL语言中常用的基本语句。
该流程中的变量比较繁多,而使用case语句分情况列出来,简洁明了。
3、状态机的使用格式简洁,使用简单方便,特别是在进行状态的转换时候。
并行的状态转换不易出错,可将状态转换、赋值、计数等多个功能封装在某一个状态中,并且更加便于为系统添加新的状态功能。
方案选定:
通过以上分析,确定用以上方案为本次设计的方案。
六、工作原理
先对所给时钟脉冲进行分频到标准时钟脉冲;设计两个时钟控制倒计时,倒计时的时间可自由修改,由输入决定;设计另一个时钟,用以控制白天与夜间模式的转换;在白天时,根据倒计时的数字进行红绿灯的状态转换;夜间时,红绿灯状态改为夜间模式:
黄灯闪烁。
七、程序设计
------交通灯控制系统所使用的库和包
----------------------------------------------------------------------------------------------------------------------
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
----------------------------------------------------------------------------------------------------------------------
------交通灯控制系统的实体
----------------------------------------------------------------------------------------------------------------------
entityjtis
port(clk,reset:
instd_logic;------------------时钟脉冲clk由系统直接提供,需要进行分频;reset是启动键,当reset为1是,系统启动
t0:
integerrange0to30;------------------红绿灯循环点亮的时间,根据输入的不同系统运行的不同
r1,y1,g1,r2,y2,g2:
outstd_logic;------------------r1为东西方向红灯,y1为东西方向黄灯,g1为东西方向绿灯;r2为南北方向红灯,y2为南北方向黄灯,g2为南北方向绿灯
ec0,ec1,nc0,nc1:
outstd_logic_vector(3downto0));
------------------ec0,ec1分别为东西方向的倒计时间的个位和十位;nc0,nc1分别为南北方向的倒计时间的个位和十位
endjt;
----------------------------------------------------------------------------------------------------------------------
------交通灯控制系统的结构体(5个进程)
----------------------------------------------------------------------------------------------------------------------
architectureoneofjtis
typestate_typeis(s0,s1,s2,s3);------------------定义状态的类型
signalstate:
state_type;------------------使用状态机
signalk:
std_logic;------------------分频后的1Hz的标准时钟脉冲
signalc1,c2:
integerrange0to30;------------------定义东西、南北方向的两个倒计时的计数
signalt1:
integerrange0to3600;
signalt2:
integerrange0to24;------------------定义一个时钟,用以控制白天与夜间模式
Begin
------该进程用以分频
----------------------------------------------------------------------------------------------------------------------
q0:
process(clk)
variablett:
std_logic_vector(9downto0);------------------中间变量
begin
ifclk'eventandclk='1'then
iftt="1111101000"then----------------------把所给1kHz分频成1Hz的脉冲k,10000分频,仿真值用“0000000100”八分频
tt:
=(others=>'0');
k<='1';
else
tt:
=tt+1;
k<='0';
endif;
endif;
endprocessq0;
----------------------------------------------------------------------------------------------------------------------
------该进程用以设计时钟
----------------------------------------------------------------------------------------------------------------------
q1:
process(k,reset)
begin
ifreset='1'then------------------启动开关为1时,系统开始运行
t1<=0;
t2<=0;------------------从0点开始
elsifk='1'andk'eventthen
ift1=3599then------------------一个t1循环是一个秒,仿真值用“35”
ift2=23then-------------------一个t1循环是一个小时,一天24小时
t2<=0;
else
t2<=t2+1;
endif;
t1<=0;
else
t1<=t1+1;
endif;
endif;
endprocessq1;
----------------------------------------------------------------------------------------------------------------------
------该进程用以控制白天黑天模式和红绿灯状态转换
----------------------------------------------------------------------------------------------------------------------
q2:
process(k,reset,t2)
begin
ift2>=5andt2<=22then-------------------白天模式5:
00到22:
00之间
ifreset='1'then-------------------启动开关为1时,系统开始运行,进行状态转换
r1<='0';y1<='0';g1<='1';-------------------东西方向绿灯亮
r2<='1';y2<='0';g2<='0';-------------------南北方向红灯亮
state<=s0;-------------------红绿灯处于初始状态s0
c1<=t0;
c2<=t0;-------------------倒计时从自由输入值开始递减
elsifk='1'andk'eventthen
casestateis
whens0=>-------------------当处于第1状态时,讨论
ifc1=5then--------------由于进程内部的并列进行,当倒计时第4秒时,进入到第2状态s1
state<=s1;
c1<=c1-1;
c2<=c2-1;--------------倒计时递减
elsifc2=0then------------倒计时减到0时,再从初始值开始
c1<=t0;
c2<=t0;
else----------------否则继续保持第1状态s0
state<=s0;
c1<=c1-1;
c2<=c2-1;
endif;
whens1=>-------------------当处于第2状态时,讨论
ifc1=1then--------------由于进程内部的并列进行,当倒计时第t0秒时,进入到第3状态s2
state<=s2;
c1<=c1-1;
c2<=c2-1;
else----------------否则继续保持第2状态
state<=s1;
c1<=c1-1;
c2<=c2-1;
endif;
whens2=>-------------------当处于第3状态时,讨论
ifc2=5then--------------由于进程内部的并列进行,当倒计时第4秒时,进入到第4状态s3
state<=s3;
c1<=c1-1;
c2<=c2-1;
elsifc1=0then------------倒计时减到0时,再从初始值开始
c1<=t0;
c2<=t0;
else----------------否则继续保持第3状态
state<=s2;
c1<=c1-1;
c2<=c2-1;
endif;
whens3=>-------------------当处于第4状态时,讨论
ifc2=1then--------------由于进程内部的并列进行,当倒计时第t0秒时,进入到第1状态s0
state<=s0;
c1<=c1-1;
c2<=c2-1;
else----------------否则继续保持第4状态
state<=s3;
c1<=c1-1;
c2<=c2-1;
endif;
whenothers=>state<=s0;
endcase;
ifstate=s0then
r1<='0';y1<='0';g1<='1';
r2<='1';y2<='0';g2<='0';
elsifstate=s1then
r1<='0';g1<='0';
r2<='1';y2<='0';g2<='0';
ifc1=4orc1=2theny1<='1';
elsey1<='0';
endif;
elsifstate=s2then
r1<='1';y1<='0';g1<='0';
r2<='0';y2<='0';g2<='1';
elsifstate=s3then
r1<='1';y1<='0';g1<='0';
r2<='0';g2<='0';
ifc2=4orc2=2theny2<='1';
elsey2<='0';
endif;
endif;
---------------------------------各个状态的红绿灯变量的赋值,‘1’亮‘0’熄
endif;
else-------------------夜间模式22:
00到次日5:
00之间
c2<=0;c1<=0;
r1<='0';r2<='0';g1<='0';g2<='0';
y1<=k;y2<=k----------------红绿灯的状态:
脉冲k赋给黄灯变量,黄灯闪烁
endif;
endprocessq2;
----------------------------------------------------------------------------------------------------------------------
------该进程用于东西方向倒计时的译码显示
----------------------------------------------------------------------------------------------------------------------
q3:
process(c1)
begin
casec1is
when0=>ec0<="0000";ec1<="0000";
when1=>ec0<="0001";ec1<="0000";
when2=>ec0<="0010";ec1<="0000";
when3=>ec0<="0011";ec1<="0000";
when4=>ec0<="0100";ec1<="0000";
when5=>ec0<="0101";ec1<="0000";
when6=>ec0<="0110";ec1<="0000";
when7=>ec0<="1000";ec1<="0000";
when9=>ec0<="1001";ec1<="0000";
when10=>ec0<="0000";ec1<="0001";
when11=>ec0<="0001";ec1<="0001";
when12=>ec0<="0010";ec1<="0001";
when13=>ec0<="0011";ec1<="0001";
when14=>ec0<="0100";ec1<="0001";
when15=>ec0<="0101";ec1<="0001";
when16=>ec0<="0110";ec1<="0001";
when17=>ec0<="0111";ec1<="0001";
when18=>ec0<="1000";ec1<="0001";
when19=>ec0<="1001";ec1<="0001";
when20=>ec0<="0000";ec1<="0010";
when21=>ec0<="0001";ec1<="0010";
when22=>ec0<="0010";ec1<="0010";
when23=>ec0<="0011";ec1<="0010";
when24=>ec0<="0100";ec1<="0010";
when25=>ec0<="0101";ec1<="0010";
when26=>ec0<="0110";ec1<="0010";
when27=>ec0<="0111";ec1<="0010";
when28=>ec0<="1000";ec1<="0010";
when29=>ec0<="1001";ec1<="0010";
when30=>ec0<="0000";ec1<="0011";
----------------------------当在设定范围内时,分别为个位十位译码并显示
whenothers=>ec0<="0000";ec1<="0000";
--------------------------------------------------------否则,LED灯显示0
endcase;
endprocessq3;
----------------------------------------------------------------------------------------------------------------------
------该进程用于南北方向倒计时的译码显示
----------------------------------------------------------------------------------------------------------------------
q4:
process(c2)
begin
casec2is
when0=>nc0<="0000";nc1<="0000";
when1=>nc0<="0001";nc1<="0000";
when2=>nc0<="0010";nc1<="0000";
when3=>nc0<="0011";nc1<="0000";
when4=>nc0<="0100";nc1<="0000";
when5=>nc0<="0101";nc1<="0000";
when6=>nc0<="0110";nc1<="0000";
when7=>nc0<="0111";nc1<="0000";
when8=>nc0<="1000";nc1<="0000";
when9=>nc0<="1001";nc1<="0000";
when10=>nc0<="0000";nc1<="0001";
when11=>nc0<="0001";nc1<="0001";
when12=>nc0<="0010";nc1<="0001";
when13=>nc0<="0011";nc1<="0001";
when14=>nc0<="0100";nc1<="0001";
when15=>nc0<="0101";nc1<="0001";
when16=>nc0<="0110";nc1<="0001";
when17=>nc0<="0111";nc1<="0001";
when18=>nc0<="1000";nc1<="0001";
when19=>nc0<="1001";nc1<="0001";
when20=>nc0<="0000";nc1<="0010";
when21=>nc0<="0001";nc1<="0010";
when22=>nc0<="0010";nc1<="0010";
when23=>nc0<="0011";nc1<="0010";
when24=>nc0<="0100";nc1<="0010";
when25=>nc0<="0101";nc1<="0010";
when26=>nc0<="0110";nc1<="0010";
when27=>nc0<="0111";nc1<="0010";
when28=>nc0<="1000";nc1<="0010";
when29=>nc0<="1001";nc1<="0010";
when30=>nc0<="0000";nc1<="0011";
---------------------------当在设定范围内时,分别为个位十位译码并显示
whenothers=>nc0<="0000";nc1<="0000";
----------------------------------------------------------否则,LED灯显示0
endcase;
endprocessq4;
----------------------------------------------------------------------------------------------------------------------
endarchitectureone;-----------------------------------所有进程结束
----------------------------------------------------------------------------------------------------------------------
八、仿真结果
1、clk为输入脉冲;开始令reset为’1’,启动系统,系统正常工作后值为’0;t0为红绿灯循环时间,可自由修改,如果输入值为’0010000’,则为16秒倒计时。
如下图:
系统从0点开始运行,处于夜间模式时,倒计时都为“00”,两个方向都为黄灯闪烁,红绿灯都熄灭。
2、5:
00之后,进入到白天模式:
从第1状态(东西方向绿灯亮、南北方向红灯)开始,倒计时从16秒开始递减。
倒计时第4秒后进入第2状态(东西方向黄灯闪烁,南北方向红灯亮)。
3、倒计时第0秒后进入第3状态(东西方向红灯亮,南北方向绿灯亮),倒计时再从16秒开始递减;倒计时第4秒后进入第4状态(东西方向红灯亮,南