北邮课程设计—十字路口交通灯控制系统实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

十字路口交通灯控制系统
实验报告
综合设计:
程序编写:
硬件测试:
实验报告撰写:北京邮电大学计算机学院某人
一.实验目的
1.学习采用状态机的方法设计时许逻辑电路。

2.掌握ispLEVER软件的使用方法。

3.掌握用VHDL语言实现有限状态自动机。

4.掌握ISP器件的使用。

二.实验所用器件和设备
1.在系统可编程逻辑器件ISP1032E
2.示波器
3.逻辑测试笔
4.TEC-5实验系统
三.问题描述
十字路口4个方向各有一个交通灯,分别控制着各个方向的交通通行状况。

东西方向按照“绿灯-黄灯-红灯”的顺序变化,而南北方向则按照“红灯-绿灯-黄灯”的顺序变化。

当出现紧急状况,4个方向均禁止通行,直到紧急状况结束。

设计一个交通灯控制系统,实现以上功能。

四.实验要求
1.起始状态,4个方向红灯亮起,延时2秒。

2.东西方向绿灯,表示可以通行,延时5秒;5秒后,东西方向黄灯亮起,延时2秒,期间,南北方向一直保持红灯,延时7秒。

3.南北方向随后按以上规律执行,南北方向和东西方向的交通灯循环执行以上步骤。

4.突遇紧急状况,4个方向均红灯亮起,直到紧急状况结束,并能恢复出现紧急
状况前的状态。

五.综合设计方案
1.设计思想
❶输入端,clk=5kHz,作为时钟信号。

同时设置一个紧急状态的逻辑位输入alarm,当alarm为1,手动启动紧急状态,alarm为0,回复到正常状态。

❷输出端,用th1,tl1作为倒计时信号,输入到数码显示管用来显示剩余时间;同样,用th2,tl2作为南北方向的倒计时信号。

❸用R1,R2,R3,R4表示东南西北4个方向的红灯信号,同理用Y1,Y2,Y3,Y4表示4个方向的和黄灯信号,G1,G2,G3,G4表示4个方向的绿灯信号❹当可以通行的时间仅剩下2秒时,发出警报声;如果在紧急状况下,也发出警报声,这个警报声由Make_Sound来控制,输入到喇叭中。

❺这是一个典型的时序状态机,一共6个大的状态。

由于各个状态停留时间不同,但都是秒的倍数。

可以考虑设计当前状态与下一状态两个枚举型数据,每秒刷新旧状态值,紧急事件发生时,要注意保存必要的信息,已被紧急事件结束后,恢复到原状态继续运行使用。

❻选择实验台上的5kHz频率时钟,作为设计中分频的初始时钟。

2.状态转移图
状态说明:
❶All_Red:起始状态,延时2秒后自动转入EW_Green,4个方向都是红灯。

❷EW_Green:此状态下,东西方向绿灯,南北方向红灯,延时5秒。

如果没有紧急状况,转入EW_Yellow。

❸EW_Yellow:此状态下,东西方向黄灯,南北方向红灯,延时2秒。

如果没有紧急状态,转入SN_Green。

❹SN_Green:此状态下,南北方向绿灯,东西方向红灯,延时5秒。

如果没有紧急状态,转入SN_Yellow。

❺SN_Yellow:此状态下,南北方向黄灯,东西方向红灯,延时2秒。

如果没有紧急状态,转入EW_Green。

❻Emergency:紧急状态,手动控制。

可以随时启动紧急状态,由其他4个正常状态进入Emergency;也可以随时结束紧急状态,由Emergency恢
复到原先状态。

3.模块设计
❶输入信号处理模块:
将外部时钟信号clk和紧急情况信号alarm经过模块1的处理之后送到系统中执行。

❷分频模块:
将5kHz的时钟信号进行分频,得到新的脉冲,每秒输出一个脉冲,方便计时。

❸正常情况下状态转移模块:
如果紧急情况信号无效,根据分频得到的始终信号计时,严格在各个状态之间跳转,并给出相应的控制信号,指挥是否报警和各个灯的亮与灭。

❹紧急状态处理模块:
当紧急信号有效,模块3终止执行,完全转到紧急状态处理模块。

当紧急状态结束,回到模块3继续执行原先状态。

❺输出信号处理模块:
各个模块的输出信号汇集到这里,经过处理,决定各个灯的亮与灭,警报声以及黄灯的闪烁等。

六.程序设计
1.输入输出信号的定义
❶clk(5kHz):输入信号,时钟脉冲
❷alarm:输入信号,决定是否是紧急状态
❸R1,R2,R3,R4:输出信号,4个方向的红灯信号
❹Y1,Y2,Y3,Y4:输出信号,4个方向的黄灯信号
❺G1,G2,G3,G4:输出信号,4个方向的绿灯信号
❻Make_Sound:输出信号,警报声信号
❼H1,L1:输出信号,东西方向的倒计时
❽H2,L2:输出信号,南北方向的倒计时
2.内部模块之间接口信号的定义
❶clk1:将clk分频后得到的新时钟信号,每秒输出一个脉冲
❷step:用于分频时,计算clk脉冲的个数
❸flag:标志位,用于判断是否是刚进入某一个状态,是则为0,反之为1 ❹th1,th2,tl1,tl2:计时信号,每加1表示1秒
❺state:状态表示信号,有6个状态,分别是All_Red,EW_Green,EW_Yellow,SN_Green,SN_Yellow和Emergency
❻count:计算脉冲个数
3.各主要模块实际程序设计
❶分频模块(将5kHz的时钟分频每秒输出一个脉冲的信号)
process(clk)--对时钟进行分频,每5000个脉冲即1秒
variable step:integer range 0 to 4999;
begin
if clk'event and clk='1' then
if step=4999 then
step:=0;
clk1<='1';--5000个脉冲,step重新赋值为0,同时产生新脉冲
else
step:=step+1;
clk1<='0';--不足5000个脉冲,不断加1,同时不产生新脉冲
end if;
end if;
end process;
❷正常状况下状态转移模块
******************************定义变量****************************** process(alarm,clk1,clk)--非紧急情况下5个状态的转换
variable flag:std_logic;--标志位,表示刚进入还是已经进入该状态
variable th1,tl1,th2,tl2:std_logic_vector(2 downto 0);--剩余时间高位和低位 variable s:std_logic;--警报信号
variable state:Light;--状态
variable count:integer range 0 to 999;--1000个信号表示0.2秒
begin
if (clk1'event and clk1='1')and(alarm='0') then--时钟信号有效
Make_Sound<='0';--发声信号初始为0
case state is
************************4个方向全部红灯的************************ when All_Red=>--全红状态
if flag='0' then--标志位为0,表示刚进入这个状态
th1:="000";
tl1:="010";--对剩余时间高低位赋值
th2:="000";
tl2:="010";--对剩余时间高低位赋值
flag:='1';--修改标志位
R1<='1';
R2<='1';
R3<='1';
R4<='1';--4个方向的红灯信号全为1,表示红灯亮
else--已经进入该状态
if not(tl1="001" and tl2="001") then--低位不为0
tl1:=tl1-1;--不断减1
tl2:=tl2-1;
else--低位为0
flag:='0';
tl1:="000";
tl2:="000";
state:=EW_Green;--标志位变为0,进入下一个状态
end if;
end if;
********************东西方向绿灯,南北方向红灯*********************** when EW_Green=>--东西方向可以通行的状态
if flag='0' then--标志位为0,表示刚进入这个状态
th1:="000";
th2:="000";
tl1:="101";
tl2:="111";--对剩余时间高低位赋值
flag:='1';--修改标志位
G1<='1';Y1<='0';R1<='0';
G2<='0';Y2<='0';R2<='1';
G3<='1';Y3<='0';R3<='0';
G4<='0';Y4<='0';R4<='1';--东西方向绿灯亮起,南北方向红
灯亮起
else
G1<='1';Y1<='0';R1<='0';
G2<='0';Y2<='0';R2<='1';
G3<='1';Y3<='0';R3<='0';
G4<='0';Y4<='0';R4<='1';--东西方向绿灯亮起,南北方向红
灯亮起
if not(tl1="001") then--还有通过时间
tl1:=tl1-1;
tl2:=tl2-1;--时间不断减少
if tl1<3 then
Make_Sound<='1';--剩余时间少于3秒,警报声 end if;
else
tl1:="010";
tl2:="010";
flag:='0';
Make_Sound<='0';
state:=EW_Yellow;--通过的倒计时为0,东西方向不能通
过,进入黄灯状态,标志位重新为0 end if;
end if;
**********************东西方向黄灯,南北方向红灯******************** when EW_Yellow=>--东西方向进入黄灯状态
if flag='0' then--标志位为0,表示刚进入这个状态
th1:="000";
tl1:="001";
th2:="000";
tl2:="001";--对剩余时间高低位赋值
flag:='1';--修改标志位
Y1<='1'; G1<='0';R1<='0';
Y2<='0'; G2<='0';R2<='1';
Y3<='1'; G3<='0';R3<='0';
Y4<='0'; G4<='0';R4<='1';--东西方向黄灯亮起,南北方向依
旧红灯
else
Y1<='1'; G1<='0';R1<='0';
Y2<='0'; G2<='0';R2<='1';
Y3<='1'; G3<='0';R3<='0';
Y4<='0'; G4<='0';R4<='1';--东西方向黄灯亮起,南北方向依
旧红灯
if not(tl1="001" and tl2="001") then
tl1:=tl1-1;
tl2:=tl2-1;--时间不断减少
else
tl1:="000";
tl2:="000";
flag:='0';
state:=SN_Green;--黄灯计时结束,修改标志位,进入南
北方向绿灯状态
end if;
end if;
**********************南北方向绿灯,东西方向红灯********************* when SN_Green=>--南北方向进入绿灯通行状态
if flag='0' then--标志位为0,表示刚进入这个状态
th1:="000";
tl1:="111";
th2:="000";
tl2:="101";--对剩余时间高低位赋值
flag:='1';--修改标志位
G2<='1';R2<='0';Y2<='0';
G4<='1';R4<='0';Y4<='0';
Y1<='0';R1<='1';G1<='0';
Y3<='0';R3<='1';G3<='0';--南北方向绿灯亮起,东西方向红

else
G2<='1';R2<='0';Y2<='0';
G4<='1';R4<='0';Y4<='0';
Y1<='0';R1<='1';G1<='0';
Y3<='0';R3<='1';G3<='0';--南北方向绿灯亮起,东西方向红

if not(tl2="001") then--还有通过时间
tl2:=tl2-1;
tl1:=tl1-1;--时间不断减少
if tl2<3 then
Make_Sound<='1';--如果剩余通过时间少于3秒,
警报声响起,提醒
end if;
else
tl2:="010";
tl1:="010";
flag:='0';
Make_Sound<='0';
state:=SN_Yellow;--通过的倒计时为0,南北方向不能通
过,进入黄灯状态,标志位重新为0 end if;
end if;
*********************南北方向黄灯,东西方向红灯********************* when SN_Yellow=>--南北方向进入黄灯状态
if flag='0' then--标志位为0,表示刚进入这个状态
th1:="000";
tl1:="001";
th2:="000";
tl2:="001";--对剩余时间高低位赋值
flag:='1';--修改标志位
Y1<='0';R1<='1';G1<='0';
Y2<='1';R2<='0';G2<='0';
Y3<='0';R3<='1';G3<='0';
Y4<='1';R4<='0';G4<='0';--南北方向黄灯,东西方向依旧红

else
Y1<='0';R1<='1';G1<='0';
Y2<='1';R2<='0';G2<='0';
Y3<='0';R3<='1';G3<='0';
Y4<='1';R4<='0';G4<='0';--南北方向黄灯,东西方向依旧红

if not(tl1="001" and tl2="001") then
tl1:=tl1-1;
tl2:=tl2-1;--时间不断减少
else
tl1:="000";
tl2:="000";
flag:='0';
state:=EW_Green;--黄灯计时结束,修改标志位,进入东
西绿灯状态
end if;
end if;
end case;
end if;
H1<=th1;
L1<=tl1;
H2<=th2;
L2<=tl2;--对信号赋值
end process;
❸紧急状况处理模块
if alarm='1' then--紧急状态信号有效
Make_Sound<='1';
Y1<='0';
Y2<='0';
Y3<='0';
Y4<='0';
G1<='0';
G2<='0';
G3<='0';
G4<='0';
R1<='1';
R2<='1';
R3<='1';
R4<='1';--紧急状态下,各个方向的黄灯和绿灯不亮,红灯亮起,发出警报 end if;
❹输出信号处理模块
注:这里仅列出使东西方向黄灯闪烁的进程,南北方向黄灯闪烁的进程好这类似,将Y1,Y11,Y33分别修改为Y2,Y22,Y44即可
process(clk,Y1,alarm)--使黄灯闪烁的进程
variable count1:integer range 0 to 999;
begin
if (clk'event and clk='1') and (Y1='1') and (alarm='0') then
if count1=999 then
count1:=0;
Y11<=not Y11;
Y33<=not Y33;--每0.2秒闪烁一下
else
count1:=count1+1;
end if;
end if;
if Y1='0' then—如果没有黄灯信号,那么黄灯一直保持灭的状态
Y11<='0';
Y33<='0';
end if;
end process;
七.程序调试过程中遇到的问题以及解决方法
❶第一版本的代码中,过多的使用了if-else的嵌套,但由于TEC-5实验台逻辑块数量的限制,使得程序并没有能够在试验台上正确得到运行起来。

后来,查询资料才知道,减少使用if-else的嵌套可以大大减少逻辑块的使用。

因此,我将程序作了改进,增加了case模块,最后使程序初步在实验台上运行起来。

❷在程序运行过程中,有时候程序运行得并不稳定,有时候有效信号或者脉冲已经输入到系统,但是程序并没有做出正确的反应。

经过反复比对和确认,造成程序运行不稳定也不够灵敏的原因是使用了过多的进程,系统并不是一
定捕捉到每个有效的脉冲信号。

找出原因以后,我着手将某些进程合并,最后由原来的8个进程缩减到了3个进程,减少了激励信号和时钟脉冲的使用,从实验台只有时钟信号和紧急状态信号两个外界输入,大大增加了程序的稳定性,运行也更加平稳灵敏。

❸在硬件调试过程中,发现当某个方向进入黄灯时,如果来了个紧急状态会导致程序的执行出现错误,也就是说,当紧急状态结束以后,黄灯不但没有灭,反而一直保持亮的状态。

开始以为是程序的问题,但是不断检查程序,也在QuartusII上做了软件仿真,没有发现程序有太大的问题。

后来,详细检查了一遍硬件连线,才发现有两根连线反接了,才解决了问题。

❹黄灯闪烁问题是最后一个解决的问题。

之前要么黄灯不闪烁,要么黄灯闪烁之后到了灭灯的时候却还保持闪烁状态,要么就是黄灯根本不闪烁。

这个必然是程序的设计问题,因此将修改的重心放在程序上。

经过多次修改,增加了一个黄灯闪烁的进程,和其他进程独立开来,终于使黄灯正确的闪烁起来。

八.程序基于QuartusII 9.0的模拟效果
1.仿真波形图
❶紧急状态下的仿真波形
❷非紧急状态下的仿真波形
2.模拟实验电路图



















相关文档
最新文档