交通灯控制器设计答案
- 格式:doc
- 大小:53.50 KB
- 文档页数:5
交通灯控制器
随着各种交通工具的发展和交通指挥的需要,交通灯的诞生大大改善了城市交通状
况。本题将设计一个交通控制器,控制十字路口主、支两条道路的红、绿、黄三色灯,
指挥车辆和行人安全通行。
一、 系统设计要求
设计一个十字路口的交通灯控制器,能显示十字路口东西、南北两个方向的红、黄、
绿灯的指示状态。用两组红、黄、绿三种颜色的灯分别作为东西、南北两个方向的红、
黄、绿灯。变化规律为:东西绿灯亮,南北红灯亮→东西黄灯亮,南北红灯亮→东西红
灯亮,南北绿灯亮→东西红灯亮,南北黄灯亮→东西绿灯亮,南北红灯亮……,这样依
次循环。
南北方向是主干道车道,东西方向是支干道车道,要求两条交叉道路上的车辆交替
运行,主干道每次通行时间都设为30秒,支干道每次通行时间为20秒,时间可设置修
改。
在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道。
要求交通灯控制器有复位功能,在复位信号使能的情况下能够实现交通灯的自动复
位,并且要求所有交通灯的状态变化,包括复位信号引起的均发生在时钟脉冲的上升沿
处。
主路
主路
支路支路
二、 系统设计方案
根据交通灯系统设计要求,可以用一个有限状态机来实现这个交通灯控制器。首先
根据功能要求,明确两组交通灯的状态,这两组交通灯总共有四种状态,我们用st0,
st1,st2,st3来表示:
st0表示主路绿灯亮、支路红灯亮;
st1表示主路黄灯亮、支路红灯亮;
st2表示主路红灯亮、支路绿灯亮;
st3表示主路红灯亮、支路黄灯亮;
根据上述四种状态描述列出的状态转换表如下:
当前状态 下一状态 转换条件
st0 st1 主路绿灯亮了25秒
st1 st2 主路黄灯亮了5秒
st2 st3 支路绿灯亮了15秒
st3 st0 支路黄灯亮了5秒
st0 or st1 or st2 or st3 st0 复位信号使能
三、 VHDL编程
交通灯控制器系统的VHDL有限状态机实现如下:
Library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY traffic_ctrl IS
GENERIC ( green1_cnt: INTEGER:=25; --定义主通道绿灯亮的时间
yellow1_cnt: INTEGER:= 5; --定义主通道黄灯亮的时间
green2_cnt: INTEGER:=15; --定义支路绿灯亮的时间
yellow2_cnt: INTEGER:= 5); --定义支路黄灯亮的时间);
PORT ( clk : IN STD_LOGIC;
reset : IN STD_LOGIC;
lgt1_red: OUT STD_LOGIC; --主通道红、黄、绿灯控制信号
lgt1_yellow: OUT STD_LOGIC;
lgt1_green: OUT STD_LOGIC;
lgt2_red: OUT STD_LOGIC; --支路红、黄、绿灯控制信号
lgt2_yellow: OUT STD_LOGIC;
lgt2_green: OUT STD_LOGIC);
END ENTITY traffic_ctrl;
ARCHITECTURE rtl OF traffic_ctrl IS
TYPE STATES IS --定义枚举类型,描述状态机各状态
(st0, st1, st2, st3);
SIGNAL state: STATES:=st0; --初始化状态
SIGNAL cnt: integer range 0 to 30 :=1; --定义计数器
SIGNAL cnt_enb: std_logic :='0'; --初始化计数器使能信号
BEGIN
PROCESS (RESET, CLK) --当敏感信号RESET和CLK发生变化时,启动进程
BEGIN
IF RESET='1' THEN --如果清零信号为有效
state<=st0;
cnt<=1;
ELSIF (rising_edge(clk)) then
IF (cnt_enb='1') THEN --计数器计数
cnt<=cnt+1;
ELSE
cnt<=1;
end if;
CASE state IS
WHEN st0=> --主通道绿灯亮了一段时间时转换状态st1
IF (cnt=green1_cnt) THEN
state<=st1;
cnt<=1;
ELSE state<=st0;
END IF;
WHEN st1=> --主通道黄灯亮了一段时间时转换状态st2
IF (cnt=yellow1_cnt) THEN
state<=st2;
cnt<=1;
ELSE state<=st1;
END IF;
WHEN st2=> --支路绿灯亮了一段时间时转换状态st3
IF (cnt=green2_cnt) THEN
state<=st3;
cnt<=1;
ELSE state<=st2;
END IF;
WHEN st3=> --支路黄灯亮了一段时间时转换状态st0
IF (cnt=yellow2_cnt) THEN
state<=st0;
cnt<=1;
ELSE state<=st3;
END IF;
END CASE;
END IF;
END PROCESS;
PROCESS (state)
BEGIN
CASE state IS
WHEN st0=> --st0表示主路绿灯亮、支路红灯亮
lgt1_red<='0';
lgt1_yellow<='0';
lgt1_green<='1';
lgt2_red<='1';
lgt2_yellow<='0';
lgt2_green<='0';
cnt_enb<='1';
IF(cnt=green1_cnt) then cnt_enb<='0';
END if;
WHEN st1=> --st1表示主路黄灯亮、支路红灯亮
lgt1_red<='0';
lgt1_yellow<='1';
lgt1_green<='0';
lgt2_red<='1';
lgt2_yellow<='0';
lgt2_green<='0';
cnt_enb<='1';
IF(cnt=yellow1_cnt) then cnt_enb<='0';
END if;
WHEN st2=> --st2示主路红灯亮、支路绿灯?lgt1_red<=’1’;
lgt1_yellow<='0';
lgt1_green<='0';
lgt2_red<='0';
lgt2_yellow<='0';
lgt2_green<='1';
cnt_enb<='1';
IF(cnt=green2_cnt) then cnt_enb<='0';
END if;
WHEN st3=> --st3表示主路红灯亮、支路黄灯亮
lgt1_red<='1';
lgt1_yellow<='0';
lgt1_green<='0';
lgt2_red<='0';
lgt2_yellow<='1';
lgt2_green<='0';
cnt_enb<='1';
IF(cnt=yellow2_cnt) then cnt_enb<='0';
END if;
END CASE;
END PROCESS;
END rtl;