资源描述
石家庄经济学院
信息工程学院
数字逻辑课程设计报告
题 目 十字路口交通灯控制器
姓 名 赵永超
学 号 409109070609
班 号 4091090706
指导老师
成 绩
2010年6月
目 录
1. 功能描述 52
2. 开发工具选择 52
3. 设计方案 52
4. 模块描述 52
5. VHDL实现 52
6. 调试仿真 52
7. 课程设计回顾总结 52
参 考 文 献 52
附录 52
1.功能描述
ar,ay,ag 和br,by,bg分别表示A和B道的红灯,黄灯,绿灯的驱动信号。信号灯在高电平时亮,低电平时熄灭。十字路口的交通灯控制电路功能:
十字路口交通灯控制规则为:当A道无车时,传感器输出X=0,A道红灯一直亮,B道绿灯一直亮,直到15s定时时间到且A道有车为止;当B道通行15s且A道有车时,B道绿灯亮变成黄灯,经过5s后变成红灯亮,A道由红灯亮变成绿灯亮,直到10s定时时间到或者X=0为止;最后A道黄灯亮,B道红灯亮,直到5s定时时间到,再回到B道绿灯亮,A道红灯亮的初始状态。
2.开发工具选择
选择VHDL语言描述,利用Quartus II 5.1工具。
3. 设计方案
在设计方案之前,我们应明确课程设计的任务和要求:该数字系统完成对十字路口交通信号灯的控制,十字路口由一条南北方向的支干道(简称A道)和东西方向的主干道(简称B道)构成。A道安装有车辆检测传感器X,当该道有车时,传感器输出信号为高电平,当该道无车时,传感器输出低电平信号。
十字路口交通灯控制规则为:当A道无车时,传感器输出X=0,A道红灯一直亮,B道绿灯一直亮,直到15s定时时间到且A道有车为止;当B道通行15s且A道有车时,B道绿灯亮变成黄灯,经过5s后变成红灯亮,A道由红灯亮变成绿灯亮,直到10s定时时间到或者X=0为止;最后A道黄灯亮,B道红灯亮,直到5s定时时间到,再回到B道绿灯亮,A道红灯亮的初始状态。
(1)、首先对问题进行仔细分析
设东西和南北方向的车流量大致相同,从题目中计数值与交通灯的亮灭的关系如下图所示:
5s
15s
0sec
35sec
黄灯亮
红灯亮
15sec
红灯亮
绿灯亮
黄灯亮
10s
5s
图2
绿灯亮
B道
A道
(2) 经过认真分析后制定设计方案
如图3十字路口交通灯控制系统由定时器模块、控制器模块和输出模块组成。定时器模块由15s、5s、10s三个定时器构成,分别确定A道、B道通行时间(绿灯亮时间)、缓冲时间(黄灯亮时间)和禁止时间(红灯亮时间)。三个定时器采用以秒为时钟的计数器来实现,e15,e5,e10分别是三个定时计数器的工作使能信号,即当e15,e5,e10为1时,相应的定时器计数;tm15、tm5、tm10为定时计数器的计数指示信号,当计数器在计数过程中,相应的指示信号为0,当计时时间到即计时结束时,相应的指示信号为1。
交通灯控制器模块的作用是对系统工作状态的转换进行控制,根据十字路口交通控制信号灯控制规则则可得到系统状态转换表如图4示,其中ar,ay,ag和br,by,bg分别表示由控制器输出的A道和B道红、黄、绿灯点亮信号,e15、e10、e5分别表示由控制器输出传给15s、10s、5s三个定时计数器的计数使能信号,x为输入控制器的车辆传感器信号,tm15、tm5、tm10分别表示由15s、10s、5s定时计数器产生的计时时间到信号,它们是控制器的输入信号。从图4可知系统有5个状态,编码为S0(00)、S1(01)、S2(10)、S3(11)、S4(xx),各信号高电平有效,低电平无效。输出模块的作用是将控制器输出的各个信号进行驱动以点亮对应的信号灯,。
cp
reset
x
定时器模块
控制器模块
10s
定时器
5s
定时器
25s
定时器
e10
tm10
e5
tm5
e15
tm15
控 制 器
br
byy
bg
ar
ay
ag
clk
clr
x
输出模块
图3
十字路口交通灯控制器状态转换表(图4)
控制器输入
控制器输出
说明
现态
状态转换条件
次态
输出
x*tm15 tm5 not(x)tm20
br by bg
ar ay ag
e15 e5 e10
B道绿灯,A道红灯
S0(0 0)
1 x x
S1(0 1)
001
100
100
B道黄灯,A道红灯
S1(0 1)
x 1 x
S2(1 0)
010
100
010
B道红灯,A道绿灯
S2(1 0)
x x 1
S3(1 1)
100
001
001
B道红灯,A道绿灯
S3(1 1)
x 1 x
S0(0 0)
100
010
010
4. 模块描述
该控制系统主要分为三大模块:定时计数器模块和控制器模块和连接模块
Ⅰ、定时计数器模块:该模块分为三个定时电路,假设时基脉冲为1Hz,则需要设计一个15进制计数器、一个5进制计数器和一个10进制计数器,且每个计数器应具有计数使能控制端和计时时间到信号输出端。本设计中可采用异步清零、同步置位的4位十进制加法计数器74LS160构成。
(1)、模10定时计数器的简化形式如下图:
表二 模10计数器功能真值表
输入
计数变量
输出
reset
cp
eg
count
T_5
1 × ×
置数0
当count=10时,T_10=’1’
否则T_10=’0’
0 ↑ 1
当count<10计数值加一
否则置0
0 ↑ 0
0
Counter10
cp
e10
reset
tm10
模10定时计数器
(2)、模5定时计数器的简化形式如下图:
输入
计数变量
输出
reset
cp
ey
count
T_5
1 × ×
置数1
当count=5时,T_5=’1’
否则T_5=’0’
0 ↑ 1
当count<5计数值加一
否则置1
0 ↑ 0
1
cp
e5
reset
tm5
Counter5
模5定时计数器
(3)、模15定时计数器的简化形式如下图:
表三 模15计数器功能真值表
输入
计数变量
输出
reset
cp
ey
count
T_5
1 × ×
置数0
当count=45时,T_15=’1’
否则T_15=’0’
0 ↑ 1
当count<15计数值加一
否则置1
0 ↑ 0
0
cp
e15
reset
Tm15
Counter15
模15定时计数器
Ⅱ、控制器模块的简化形式如下图:
tm10
tm5
tm15
x
cp
reset
br
by
bg
ar
ay
ag
e10
e5
e15
controller
控 制 器 模 块
5. VHDL实现:
下面是程序实现的vhdl代码
(1)模5定时计数器实现代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY counter5 is
PORT (cp, e5,reset: IN STD_LOGIC; --定义输入信号
tm5: OUT STD_LOGIC); --定义输出信号
END counter5;
ARCHITECTURE cnt5 of counter5 is --结构体
BEGIN
PROCESS(cp, reset) --进程的敏感信号是cp和reset,进程描述摸5计数过程
VARIABLE cnt: INTEGER RANGE 5 DOWNTO 0; --定义变量cnt为整数,范围5到0
BEGIN
IF reset='1' THEN
cnt:=0;
ELSIF (cp'EVENT AND cp='1') THEN --如果CP信号发生变化且变化后结果是CP=’1’
IF e5='1' AND cnt<5 THEN
cnt:=cnt+1;
ELSE
cnt:=0;
END IF;
END IF;
IF cnt=5 THEN
tm5<='1' ;
ELSE
tm5<='0';
END IF;
END PROCESS;
END cnt5;
(2)、模10定时计数器实现代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY counter10 IS
PORT(cp, e10, reset: IN STD_LOGIC; --定义输入信号
tm10: OUT STD_LOGIC); --定义输出信号
END counter10;
ARCHITECTURE cnt10 OF counter10 IS
BEGIN
PROCESS(cp, reset) --进程的敏感信号是cp和reset,进程描述摸5计数过程
VARIABLE cnt: INTEGER RANGE 10 DOWNTO 0; --定义变量cnt为整数,范围10到0
BEGIN
IF reset='1' then
cnt:=0;
ELSIF (cp'EVENT AND cp='1') THEN --如果CP信号发生变化且变化后结果是CP=’1’
IF e10='1' and cnt<10 THEN
cnt:=cnt+1;
ELSE
cnt:=0;
END IF;
END IF;
IF cnt=10 then
tm10<='1';
ELSE
tm10<='0';
END IF;
END process;
END cnt10;
(3)、模15定时计数器实现代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY counter15 is
PORT (cp, e15, reset: IN STD_LOGIC; --定义输入信号
tm15: OUT STD_LOGIC); --定义输出信号
END counter15;
ARCHITECTURE cnt15 of counter15 is
BEGIN
PROCESS(cp, reset) --进程的敏感信号是cp和reset,进程描述摸15计数过程
VARIABLE cnt: INTEGER RANGE 15 DOWNTO 0; --定义变量cnt为整数,范围15到0
BEGIN
IF reset='1' THEN
cnt:=0;
ELSIF (cp'EVENT AND cp='1') THEN --如果CP信号发生变化且变化后结果是CP=’1’
IF e15='1' AND cnt<15 THEN
cnt:=cnt+1;
ELSE
cnt:=0;
END IF;
END IF;
IF cnt=15 THEN
tm15<='1' ;
ELSE
tm15<='0';
END IF;
END PROCESS;
END cnt15;
(4)、控制器controller实现代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY controller IS
PORT(cp,x,reset,tm10,tm5,tm15:IN STD_LOGIC; --定义输入信号
br,by,bg,ar,ay,ag,e10,e5,e15:OUT STD_LOGIC); --定义输出信号
end controller;
ARCHITECTURE behave_control OF controller IS --结构体
TYPE CONTROL_STATE IS (S0,S1,S2,S3) ; --定义枚举类型数据,4个状态
SIGNAL state:CONTROL_STATE:=S0; --定义初始信号为S0
BEGIN
PROCESS(CP,X,RESET) --进程的敏感信号是cp,x和reset,进程描述控制器运行
BEGIN
IF RESET='1' THEN
state<=S0;
ELSIF (cp'EVENT AND cp='1') THEN --如果CP信号发生变化且变化后结果是CP=’1’
CASE state IS
WHEN S0=>
IF (x AND tm15)='1' THEN
state<=S1;
END IF;
WHEN S1=>
IF tm5='1' THEN
state<=S2;
END IF;
WHEN S2=>
IF ((NOT x)OR tm10)='1' THEN
state<=S3;
END IF;
WHEN S3=>
IF tm5='1' THEN
state<=S0;
END IF;
END CASE;
END IF;
END PROCESS;
br<='1' when state=S2 or state=S3 else '0';
by<='1' when state=S1 else '0';
bg<='1' when state=S0 else '0';
ar<='1' when state=S0 or state=S1 else '0';
ay<='1' when state=S3 else '0';
ag<='1' when state=S2 else '0';
e10<='1' when state=S2 else '0';
e5<='1' when state=S1 or state=S3 else '0';
e15<='1' when state=S0 else '0';
END behave_control;
(5)、连接模块(对各接口进行例化)实现代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
LIBRARY LATTICE;
ENTITY RYG IS
PORT(cp, reset, x: IN STD_LOGIC;
br, by, bg, ar, ay, ag: OUT STD_LOGIC);
END RYG;
ARCHITECTURE BE_RYG OF RYG IS
COMPONENT counter10 --元件说明:模10计数器
PORT(cp, e10, reset: IN STD_LOGIC;
tm10: OUT STD_LOGIC);
END COMPONENT;
COMPONENT counter5 --元件说明:模5计数器
PORT (cp, e5, reset: IN STD_LOGIC;
tm5: OUT STD_LOGIC);
END COMPONENT;
COMPONENT counter15 --元件说明:模15计数器
PORT (cp, e15, reset: IN STD_LOGIC;
tm15: OUT STD_LOGIC);
END COMPONENT;
COMPONENT controller --元件说明:控制器
PORT(cp, x, reset, tm10, tm5, tm15: IN STD_LOGIC;
br, by,bg, ar, ay, ag, e10, e5, e15: OUT STD_LOGIC);
END COMPONENT;
signal tag1, tag2, tag3, tag4, tag5, tag6: std_logic;
BEGIN
U1: counter10 PORT MAP(cp=>cp, e10=>tag1, reset=>reset, tm10=>tag4); --模10元件例化
U2: counter5 PORT MAP(cp=>cp, e5=>tag2, reset=>reset, tm5=>tag5); --模5元件例化
U3: counter15 PORT MAP(cp=>cp, e15=>tag3,reset=> reset, tm15=>tag6); --模15元件例化
U4: controller PORT MAP(cp=>cp, x=>x, reset=>reset, tm10=>tag4,tm5=>tag5, tm15=>tag6, br=>br, by=>by, bg=>bg, ar=>ar, ay=>ay, ag=>ag, e10=>tag1, e5=>tag2, e15=>tag3); --控制器元件例化
END BE_RYG;
6. 调试仿真
(1)、模5计数器调试仿真结果:
(2)、模10计数器调试仿真结果:
(3)、模15计数器调试仿真结果:
(4)、控制器controller调试仿真结果:
(5)、十字路口交通灯控制系统仿真波形:
7. 课程设计回顾总结及心得体会
设计逻辑电路时,首先分析功能,确定输入和输出,划分功能模块。设
计控制模块,处理各模块间的关系,然后针对各个功能模块,编写代码,调试程序。
8. 参 考 文 献:
徐志军:数字逻辑与VHDL设计
数字逻辑实验范例(FPT://202.206.159.243)
平时实验的参考资料
VHDL语言设计指南
展开阅读全文