计算机与信息学院
数字逻辑课程设计
设计题目:交通控制灯
姓名学号:徐昕 20072448
合 作 者:万松 20072458
专业班级:计算机科学与技术 07-1 班
指导教师:黄正峰
2009 年 9 月 9 日
一、 设计要求
以实验台上的 4 个红色指示灯、4 个绿色指示灯和 4 个黄色指示灯模仿路口
的东、西、南、北四个方向的红、绿、黄交通灯。控制这些指示灯,使它们按
下列规律亮、灭:
① 初始状态为四个方向的红灯全亮,时间 1 秒。
② 东、西方向绿灯亮,南、北方向红灯亮。东、西方向通车,时间 5 秒。
③ 东、西方向黄灯闪烁,南、北方向红灯亮,时间 2 秒。
④ 东、西方向红灯亮,南、北方向绿灯亮。南、北方向通车,时间 5 秒。
⑤ 东、西方向红灯亮,南、北方向黄灯闪烁,时间 2 秒。
⑥ 返回 2,继续运行。
⑦ 若发生紧急事件,例如救护车、警车通过时,则按下单脉冲按钮,使得
的东、西、南、北四个方向的红灯亮。紧急事件结束后,恢复到原状态继续运
行使用。
二、 器件设备
1. TDS 系列数字电路实验系统
2. 器件:ISP1016E 可编程逻辑器件
3. 软件:在 Windows 平台上运行的 ispLEVER 编程软件
4. 编程电缆线及导线若干
三、 设计方案
此题即为一个典型的时序状态机,共有六个大的状态,现设定:
S0: 四个方向的红灯全亮
S1: 东、西方向绿灯亮,南、北方向红灯亮
S2:东、西方向黄灯闪烁,南、北方向红灯亮
S3:东、西方向红灯亮,南、北方向绿灯亮
S4:东、西方向红灯亮,南、北方向黄灯闪烁
S5:东、西、南、北四个方向的红灯亮
则状态图如下:
图 3.1 状态机的状态图
1
此状态机是该设计的核心模块,由其控制着东、西、南、北方向的交通。
仔细分析设计要求可知,东西方向交通灯状态变化相同,南北方向亦相同,故
实际上只需控制两组交通灯,所以状态机有六个输出变量,分别控制东西、南
北方向的红、绿、黄灯的亮灭状态。另外,状态机还有三个输入变量,分别为
复位信号、紧急状况控制信号、时钟信号。
由于在 vhdl 语言中,同一个进程内只能有一个时钟,所以紧急信号宜以电
平来触发。但实验要求通过单脉冲来控制紧急信号,为了解决这个矛盾,可以
设计一个边沿触发的紧急信号发生器,当输入一个单脉冲时,输出电平为高,
即进入紧急状态;再输入一单脉冲,输出电平为低,解除紧急状态。
为了控制各个状态持续的时间,需在状态机中设置计时装置。考虑到状态
变化的最小单位时间是 0.2s,可将输入状态机的时钟信号的频率设计为 10Hz,
即一个脉冲周期为 0.1s。由于实验台上最小的确定时钟频率为 100kHz,若将此
时钟分频为 10Hz,则需要模为 10000 的计数器,这需要较多的硬件资源。为
了节省资源,可利用实验台上 1000Hz~100kHz 的可调时钟,将时钟频率调
节为 1000Hz,这样就只需要模为 100 的计数器来分频。此外,复位信号利用
高低电平来控制,当电平为高时,状态机保持东、西、南、北四个方向红灯均
亮的状态,若为低则由初始状态进入状态循环。
综上所述,可得总体设计结构框图如下:
图 3.2 总体设计结构框图
其中模块 l1(emergency_signal)为紧急信号发生器,clk1 为输入单脉冲;z
为输出高低电平。l2(counter100)为模为 100 的计数器,用于分频,即将外
S
01
S1
S
4
S5 S
2
S3
2
部输入时钟(从 clk 输入,频率为 1000Hz)分频为 10Hz,由进位输出端 z 输出
并连到状态机的时钟输入端 clk。l3(state_machine)为控制交通的状态机,
clk 为输入时钟(用于计时,由计数器分频后提供);reset 为复位信号,与计数
器的复位信号连接在一起,由一个电平开关控制;hold 为紧急信号(由紧急信
号发生器控制);输出变量 red1、green1、yellow1 控制东西方向红、绿、黄
交通灯的亮灭状态;南北方向则由 red2、green2、yellow2 控制。
四、 vhdl 源程序
各模块的 vhdl 源代码如下,此亦为最终提交的代码。
1. 紧急信号发生器
根据前面的功能描述,可知该模块初始输出为低电平(0),每来一个输入单
脉冲,输出翻转一次,其代码如下:
4.1 emergency_signal.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY emergency_signal IS
PORT(clk:IN STD_LOGIC; --输入单脉冲
z:OUT STD_LOGIC); --输出电平
END;
ARCHITECTURE emergency_signal_function OF emergency_signal IS
SIGNAL z1:STD_LOGIC:='0'; --初始时为低电平
BEGIN
PROCESS(clk)
BEGIN
IF(clk'event AND clk='1') THEN
z1<=not z1; --在单脉冲的上升沿翻转
END IF;
END PROCESS;
z<=z1;
END emergency_signal_function;
2. 模 100 的计数器
对输入时钟脉冲计数,每计满 100 个,则进位输出为高,否则为低。用于
将输入的 1000Hz 的时钟分频为 10Hz,源代码如下:
3
4.2 counter100.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY counter100 IS
PORT(reset,clk:IN STD_LOGIC; --复位信号和时钟信号
z:OUT STD_LOGIC); --进位输出
END;
ARCHITECTURE counter100_function OF counter100 IS
SIGNAL z_temp:STD_LOGIC;
BEGIN
PROCESS(reset,clk)
VARIABLE count:INTEGER RANGE 0 TO 99;
BEGIN
IF(reset='0') THEN --复位
count:=0;
z<='0';
ELSIF(clk'event AND clk='1') THEN
IF(count>=99) THEN --计数满 100
count:=0;
z_temp<='1';
ELSE
count:=count+1; --加计数
z_temp<='0';
END IF;
z<=z_temp;
END IF;
END PROCESS;
END counter100_function;
3. 状态机
状态机用于控制十字路口交通灯的状态变化。此模块中我设计的是异步复
位和异步等待(即进入紧急状态),复位信号是低电平有效,紧急信号是高电平
有效。另外,为了控制各个状态的持续时间,此状态机中还设计了一个计数装
置,用于计时。状态 SO 持续时间为 1s,由于输入状态机的时钟频率为 10Hz,即
一个脉冲持续时间为 0.1s,所以在计数为 1—10 内状态机为 S0 状态。同理,在
计数为 11~60 内,为 S1 状态;在计数为 61~80 内,为 S2 状态;S3 状态
所处的计数范围为 81~130;S4 状态所处的计数范围为 131~150(各状态的
定义可见第三部分:设计方案,后同)。状态机的源代码如下:
4.3 state_machine.vhd
4
评论1