4.2 简易交通灯实验
4.2.1 简易交通灯实验一、实验目的
⑴ 学习状态机设计。
⑵ 掌握数字逻辑系统的设计方法。
⑶ 掌握 EDA 软件 Quartus Ⅱ的基本使用方法。
⑷ 掌握用 VHDL 语言设计复杂数字电路的方法。
二、实验原理
交通灯控制是一种常见的控制,几乎在每个十字路口上都可以看到交通灯。本实验通过南北和东西 2 个方向上的 12 个指示灯(4 个黄灯、4 个红灯、4 个绿灯)模拟路口的交通灯控制情况。TEC-8 实验台上的交通灯电路如图 4.2 所示。
图 4.2 交通灯实验电路图
12 个发光二极管代表 12 个交通灯。2 个 7 引脚的排电阻向 12 个发光二极管提供电流。排电阻的引脚 1 为公共端,它和排电阻其他引脚之间的电阻值为 1K 欧姆。当短路子 DZ9 断开时,两个排电阻的引脚 1 悬空;当短路子 DZ3 短接时,两个排电阻的引脚 1 接+5V,通过排电阻给 12 个发光二极管供电。控制信号 TL0~TL11 分别控制各发光二极管的负极。由于 2 个 7404 器件对控制信号
TL0~TL11 反相后接到发光二极管的负极,因此当 TL0~TL11 中的某一个信号为 1 时,对应的发光二极管有电流流过而被点亮。只要对信号 TL0~TL11 进行合适的控制,就能使 12 个发光二极管按要求亮、灭。
三、实验设备
序 号
|
名 称
|
数 量
|
备 注
|
1
|
个人计算机
|
1 台
|
|
2
|
TEC-8 实验系统
|
1 台
|
|
3
|
双踪示波器
|
1 台
|
|
4
|
万用表
|
1 只
|
|
四、实验任务
模拟十字路口交通灯的运行情况,完成下列功能。
⑴ 按下复位按钮 CLR 后,进入⑵。
⑵ 南、北方向的 2 个绿灯亮,允许车辆通行;东、西方向的 2 个红灯亮,禁止车辆通行。时间
10 秒。
⑶ 南、北的 2 个黄灯闪烁,已经过了停车线的车辆继续通行,没有过停车线的车辆停止通行; 东、西方向的 2 个红灯亮,禁止车辆通行。时间 2 秒。
⑷ 南、北方向 2 个红灯亮,禁止车辆通行;东、西方向 2 个绿灯亮,允许车辆通行。时间 10 秒。
⑸ 南、北方向 2 个红灯亮,禁止车辆通行;东、西 2 个黄灯闪烁,已经过了停车线的车辆继续
通行,没有过停车线的车辆停止通行。时间 2 秒。
⑹ 返回⑵,继续运行。
⑺ 如果在⑵状态情况下,按一次紧急按钮 QD,立即结束⑵状态,进入⑶状态,以使东、西方向车辆尽快通行。如果在⑷状态情况下,按一次紧急按钮,立即结束⑷状态,进入⑸状态,以使南、北方向车辆尽快通行。
五、实验提示
1.EPM7128 器件引脚信号
本实验中使用的信号对应的 EPM7128 引脚如下:
序号
|
信号名
|
信号属性
|
引脚号
|
信 号 说 明
|
1
|
MF
|
55
|
in
|
频率 1MHz 的时钟
|
2
|
CLR#
|
1
|
in
|
复位信号,低电平有效
|
3
|
QD
|
60
|
in
|
按下启动按钮 QD 后产生的 QD 脉冲
|
4
|
TL0
|
20
|
out
|
控制北方红灯
|
5
|
TL1
|
21
|
out
|
控制北方黄灯
|
6
|
TL2
|
22
|
out
|
控制北方绿灯
|
7
|
TL3
|
24
|
out
|
控制西方绿灯
|
8
|
TL4
|
25
|
out
|
控制西方黄灯
|
9
|
TL5
|
27
|
out
|
控制西方红灯
|
10
|
TL6
|
28
|
out
|
控制南方绿灯
|
11
|
TL7
|
29
|
out
|
控制南方黄灯
|
12
|
TL8
|
30
|
out
|
控制南方红灯
|
13
|
TL9
|
31
|
out
|
控制东方红灯
|
14
|
TL10
|
33
|
out
|
控制东方黄灯
|
15
|
TL11
|
34
|
out
|
控制东方绿灯
|
由于信号 MF、QD 的 EPM7128 引脚和实验台上的相应信号没有直接连接,因此在实验时首先要将扁平电缆的 34 芯端插到插座 J6 上,将扁平电缆的 6 芯端插到插座 J5 上,将 DZ9 左侧短接为连通, 右侧短界为短开。注意:扁平电缆进行插接或者拔出必须在关电源后进行。
2. 状态机
本实验是典型的状态机实验。首先从 1MHz 的 MF 时钟信号经过 5 次 10 分频产生 0.1 秒的计数时钟,用以对计数器计数,用计数器的值控制状态机状态之间的转换。当按下一次 QD 按钮时,直接修改计数器的值,使状态转换提前产生。
本实验中有的状态机有 4 个状态,分别对应四中的⑵~⑸。状态机的示例程序如下: state_p: process(clr,clk)
begin
if clr = '0' then state <= "00";
elsif clk'event and clk = '1' then --clk 为 0.1 秒的时钟信号state <= next_state;
end if; end process;
state_trans: process(clk,state,count) begin
case state is
when "00" => --0 状态
if count = "1100011" then --10 秒到了吗? next_state <= "01"; --转到 1 状态。
else
next_state <= "00"; --继续 0 状态。end if;
when "01" => --1 状态
if count = "1110111" then --12 秒到了吗? next_state <= "11"; --转到 2 状态。
else
next_state <= "01"; --继续 1 状态。end if;
when "11" => --2 状态
if count = "1100011" then --10 秒到了吗? next_state <= "10"; --转到 3 状态。
else
next_state <= "11"; --继续 2 状态。end if;
when "10" => --3 状态
if count = "1110111" then --12 秒到了吗? next_state <= "00"; --转到 0 状态
else
next_state <= "10"; --继续 3 状态。end if;
end case; end process;
上述的状态机由 2 个 PROCESS 语句构成。第一个 PROCESS 语句给出了状态机中每 0.1 秒用
next_state 代替 state;第 2 个 PROCESS 语句根据时间控制 next_state 的产生。
2.黄灯闪烁可通过连续亮 0.2 秒、灭 0.2 秒实现。
3.本实验中短路子 DZ9 需要左侧短接。实验完毕后,短路子 DZ9 右侧短界。
4.如果只进行演示性实验,则可以直接把交通灯文件夹中的.sof 文件下载到 EPM7128 中进行。六、实验完成后,必须要将硬连线控制器重新装入 EPM7128 中。以备以后做其他实验使用。
4.2.2 实验报告
