交通灯控制逻辑电路设计与总结报告
一、设计任务
用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、状态机的使用格式简洁,使用简单方便,特别是在进行状态的转换时候。并行的状态转换不易出错,可将状态转换、赋值、计数等多个功能封装在某一个状态中,并且更加便于为系统添加新的状态功能。
方案选定:
通过以上分析,确定用以上方案为本次设计的方案。
六、工作原理
先对所给时钟脉冲进行分频到标准时钟脉冲;设计两个时钟控制倒计时,倒计时的时间可自由修改,由输入决定;设计另一个时钟,用以控制白天与夜间模式的转换;在白天时,根据倒计时的数字进行红绿灯的状态转换;夜间时,红绿灯状态改为夜间模式:黄灯闪烁。
七、程序设计
------交通灯控制系统所使用的库和包
------------------------- library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
------------------------- ------交通灯控制系统的实体
------------------------- entity jt is
port(clk,reset:in std_logic;
------------------时钟脉冲clk由系统直接提供,需要进行分
频;reset是启动键,当reset为1是,系统启动
t0:integer range 0 to30;
------------------红绿灯循环点亮的时间,根据输入的不同
系统运行的不同
r1,y1,g1,r2,y2,g2:out std_logic;
------------------ r1为东西方向红灯, y1为东西方
向黄灯,g1为东西方向绿灯;r2为南北方向红灯,
y2为南北方向黄灯,g2为南北方向绿灯
ec0,ec1,nc0,nc1:out std_logic_vector(3 downto 0));
------------------ ec0,ec1分别为东西方向的倒计时间的个位和十位;
nc0,nc1分别为南北方向的倒计时间的个位和十位
end jt; ------------------------- ------交通灯控制系统的结构体(5个进程)
------------------------- architecture one of jt is
type state_type is (s0,s1,s2,s3);
------------------定义状态的类型
signal state:state_type;
------------------使用状态机
signal k:std_logic;
------------------分频后的1Hz的标准时钟脉冲
signal c1,c2:integer range 0 to 30;
------------------定义东西、南北方向的两个
倒计时的计数
signal t1:integer range 0 to 3600;
signal t2:integer range 0 to 24; ------------------定义一个时钟,用以控制白天与夜间模式 Begin ------该进程用以分频
------------------------- q0:proce(clk)
variable tt:std_logic_vector(9 downto 0);
------------------中间变量
begin
if clk\'event and clk=\'1\' then
if tt=\"1111101000\" then
----------------------把所给1kHz分频成1Hz的脉冲
k,10000分频,仿真值用“ 0000000100”八分频
tt:=(others=>\'0\');
k
else
tt:=tt+1; k
end if;
end if; end proce q0; -------------------------
------该进程用以设计时钟
------------------------- q1:proce(k,reset)
begin
if reset=\'1\' then
------------------启动开关为1时,系统开始运行
t1
------------------从0点开始 elsif k=\'1\' and k\'event then if t1=3599 then
------------------一个t1循环是一个秒,仿真值用“35” if t2=23 then
-------------------一个t1循环是一个小时,一天24小时 t2
else t2
------------------------- q2:proce(k,reset,t2)
begin
if t2>=5 and t2
-------------------白天模式5:00到22:00之间
if reset=\'1\' then
-------------------启动开关为1时,系统开始运
行,进行状态转换
r1
c2
case state is
when s0=>-------------------当处于第1状态时,讨论
if c1=5 then
--------------由于进程内部的并列进
行,当倒计时第4秒时,进入到第2状态s1
state
c1
c2
--------------倒计时递减
elsif c2=0 then
------------倒计时减到0时,再从
初始值开始
c1
c2
else
----------------否则继续保持第1状态s0
state
c1
c2
end if;
when s1=>-------------------当处于第2状态时,讨论
if c1=1 then--------------由于进程内部的并列进行,当
倒计时第t0秒时,进入到第3状态s2
state
c1
c2
else----------------否则继续保持第2状态
state
c1
c2
end if;
when s2=>-------------------当处于第3状态时,讨论
if c2=5 then--------------由于进程内部的并列进行,
当倒计时第4秒时,进入到第4状态s3
state
c1
c2
elsif c1=0 then
------------倒计时减到0时,再从初
始值开始
c1
c2
else
----------------否则继续保持第3状态
state
c1
c2
end if;
when s3=>-------------------当处于第4状态时,讨论 if c2=1 then--------------由于进程内部的并列进行,当倒
计时第t0秒时,进入到第1状态s0
state
c1
c2
else----------------否则继续保持第4状态
state
c1
c2
end if;
when others=> state
end case; if state=s0 then
r1
r2
r1
r2
if c1=4 or c1=2 then y1
else y1
end if; elsif state=s2 then
r1
r2
r1
r2
if c2=4 or c2=2 then y2
else y2
end if; end if;
--各个状态的红绿灯变量的赋值,‘1’亮‘0’熄 end if; else -------------------夜间模式22:00到次日5:00之间
c2
end if ; end proce q2; ------------------------- ------该进程用于东西方向倒计时的译码显示
------------------------- q3:proce(c1)
begin case c1 is when 0=>ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0ec0
when others=>ec0
-------------------------否则,LED灯显示0
end case;
end proce q3; ------------------------- ------该进程用于南北方向倒计时的译码显示
------------------------- q4:proce(c2)
begin
case c2 is when 0=>nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0nc0
when others=>nc0
end proce q4; ------------------------- end architecture one;
----所有进程结束 -------------------------
八、仿真结果
1、clk为输入脉冲;开始令reset为’1’,启动系统,系统正常工作后值为’0; t0为红绿灯循环时间,可自由修改,如果输入值为’0010000’,则为16秒倒计时。如下图:系统从0点开始运行,处于夜间模式时,倒计时都为“00”,两个方向都为黄灯闪烁,红绿灯都熄灭。
---------------------------否则,LED灯显示0
end case;
2、5:00之后,进入到白天模式:从第1状态(东西方向绿灯亮、南北方向红灯)开始,倒计时从16秒开始递减。倒计时第4秒后进入第2 状态(东西方向黄灯闪烁,南北方向红灯亮)。
3、倒计时第0秒后进入第3 状态(东西方向红灯亮,南北方向绿灯亮),倒计时再从16秒开始递减;倒计时第4秒后进入第4 状态(东西方向红灯亮,南北方向黄灯闪烁);倒计时第0秒后进入第1 状态(东西方向绿灯亮,南北方向红灯亮),倒计时再从16秒开始递减
。如此循环。
4、当计时器到22:00时,再次进入夜间模式:东西南北方向黄灯闪烁;到次日5:00时又回到白天模式。如此循环。
九、讨论与改进
特点:
1、在整个设计过程中,分进程实现整个功能,简单明了;
2、状态机的功能和优点得到了较为完整的体现;
3、分夜间和白天模式不同,系统自动调节;
4、黄灯以闪烁的形式亮;系统运行后红绿灯循环点亮的时间也可自由修改。 不足:
1、整个系统启动后从夜间0点开始运行,而不能随意调为哪个时间的交通灯状态,只能从程序中改,不能手动调节;
2、整个功能还是比较简单,未能分左右转和直行的情况;
3、紧急情况处理时也无特殊处理的设置。
改进:
1、在进程中可增加一个输入量,用以控制系统的时钟时间,方便调节模式和交通灯状态;
2、在进程中可加入几个红绿灯状态来分别控制东西方向和南北方向的左转、右转和直行的红绿灯状态;
3、在原有程序的基础上,可通过增加一个输入量来控制一种特殊状态,用以控制特殊情况的处理,视该特殊情况而定。
二○一○年九月三日