交通灯实验报告.docx
《交通灯实验报告.docx》由会员分享,可在线阅读,更多相关《交通灯实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
![交通灯实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/15/19fd8d26-28b2-4959-881e-e5c3e71e4ded/19fd8d26-28b2-4959-881e-e5c3e71e4ded1.gif)
交通灯实验报告
数字电路综合实验报告
交通灯控制器
院系:
电信工程学院通信工程系
班级:
0111105班
姓名:
***
学号:
******号(1号)
一、设计任务要求
交通灯控制器:
用于十字路口的交通灯控制器。
实验要求:
1.东西方向各有一组红,黄,绿灯用于指挥交通,红,黄,绿的持续时间分别为25s,5s,20s。
2.当有紧急情况(如消防车)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,正常工作。
3.组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间。
二、设计思路及总体结构框图
设计思路:
1.硬件:
由设计任务要求可知,总体输入电路有:
(1)在开始计时之前的等待状态,复位键reset接低电位,接通电源后,首先要将它接高电位,表示计时开始。
(2)当按一下(on_off)键,表示紧急情况发生,两个方向均为红灯亮,计时停止,当再次按下(on_off)键时,控制器恢复原来状态,正常工作。
输出电路:
(1)由于东西和南北方向都要显示时间,因此需要4个数码管,这样在设计中就需要四条输出线choose4,用来选通指定一个LED七段显示数码管。
(2)显示器的每一位都采用LED七段显示数码管进行显示,每一个LED七段显示数码管都要有七条输出线控制,一共使用4个七段数码管,故输出电路使用四个七位输出信号:
showtime1,showtime2,showtime3,showtime4。
(3)东西和南北方向都有交通灯亮的情况,故输出电路中要有两个状态控制信号state1,state2分别控制东西和南北的灯,每个方向上有4个灯(增加了左、右转弯显示控制功能),所以state1,state2的类型应该是4位数组型的。
外部电路图如下:
clk4/
stas
reset
on_off4/
7/
7/
7/
7/
4/
2.软件:
(1)在VHDL设计描述中,采用自顶向下的设计思路,该思路,首先要描述顶层的接口,上面的描述已经规定了交通灯控制的输入输出信号:
输入信号:
复位开关信号reset;
紧急情况控制信号on_off;
外部时钟信号clk。
输出信号:
LED七段显示数码管的选通信号choose4(3downto0);
LED七段显示数码管的输出信号showtime1(6downto0),showntime2(6downto0),showtime3(6downto0),showtome4(6downto0);
交通灯状态控制信号state1(3downto0),state2(3downto0)。
(2)在自顶向下的VHDL设计描述中,通常把整个设计的系统划分为几个模块,然后采用结构描述方式对整个系统进行描述。
根据实验设计的结构功能,来确定使用哪些模块以及这些模块之间的关系。
由于紧急情况控制信号是采用按键的输入方式,其产生时刻和持续时间的长短是随机不定的,且存在因开关簧片反弹引起的电平抖动现象,因此必须在每个开关后面安排一个消抖和同步化电路模块,以保证系统能捕捉到输入脉冲,故需要有防抖动的模块。
由于外部时钟信号clk的频率为1MHz,而实际需要的内部计时时钟频率为1Hz,提供给消抖同步电路的频率为50Hz(满足按键)和提供给产生选通信号电路的时钟频率为200Hz(满足视觉暂留效应)。
当正常计时开始后,需要进行定时计数操作,由于东西和南北两个方向上的时间显示器是由两个LED七段显示数码管组成的,因此需要产生两个2位的计时信息:
2个十位信号,2个个位信号,这个定时计数操作可以由一个定时计数器来完成,又因为交通灯的状态变化是在计时为0的情况下才能进行的,因此需要一个计时电路来产生使能信号,因此定时计数的功能就是用来产生2个2位计时信息和使能信号。
另外还需要将时间显示出来,为了节省资源,我采用了循环点亮LED七段显示数码管的方法来显示计时输出。
通过信号choose4(3downto0)来对4个LED七段显示数码管进行选择。
由于不能使用7448自动译码集成电路,故在LED七段显示数码管显示时间时,要把计时结果转换为七段码输出到相应的LED七段显示数码管上,因此还需要一个转换电路。
交通灯状态控制也需要一个电路,当有使能信号及无紧急情况下,交通灯状态不发生变化,有紧急情况时,两个方向上均为红灯亮,紧急情况消除后,回到原来状态,无使能信号时,交通灯状态不变。
通过上面的分析,不难得知可以把交通灯控制系统划分为6个模块:
键输入模块,时钟分频模块,计时模块,选通模块,显示模块,控制模块。
各个模块之间的连接关系如下:
resetshowtime
on_off
reset0on_off0
clk1
timel,times
clk2clk0choose4
三、总体结构框图
No
yes
Yes
No
No
Yes
No
YesYes
No
No
Yes
Yes
No
No
Yes
Yes
No
Yes
四、分块电路设计.
(1)键输入模块(keyin)
输入信号:
紧急情况on_off;用来消除抖动的时钟信号clk1,由时钟分频模块提供。
输出信号:
去抖后的提示信号on_off0。
(2)时钟分频模块(clk_div)
输入信号:
外部时钟信号clk;
输出信号:
消除抖动的时钟信号clk1;计时内部时钟信号clk2;产生选通信号的时钟信号clk0。
(3)计时模块(time):
输入信号:
定时计时时钟clk2,由时钟分频模块提供;去抖动后的提示信号on_off0;复位信号reset;状态提示信号state(1downto0);
输出信号:
东西方向的十位信号eq1(3downto0);东西方向的个位信号eq0(3downto0);南北方向的十位信号sq1(3downto0);南北方向的个位信号sq0(3downto0);使能信号timel,times。
(4)选通模块(choose):
输入信号:
选通时钟信号clk0,由时钟分频模块提供。
输出信号:
选通信号choose4(3downto0)。
(5)显示模块(display):
输入信号:
计时的十位或个位信号;
输出信号:
控制LED七段显示数码管的七位数组型信号。
(6)控制模块(keep):
输入信号:
复位信号reset;去抖后的紧急情况提示信号on_off0;定时计时时钟信号clk2;使能信号timel,times;
输出信号:
东西方向交通灯状态控制信号state1(3downto0);南北方向交通灯状态控制信号state2(3downto0);交通灯状态提示信号state(1downto0)。
五、总体电路图(图形法).
六、仿真波形
状态变化仿真图:
以下显示选通信号的仿真波形
七、源程序
主模块:
----------trafficmodule---------
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitytracficis
port(reset:
instd_logic;-----------------------复位信号
clk:
instd_logic;-----------------------外部时钟信号
showtime1,showtime2,showtime3,showtime4:
outstd_logic_vector(6downto0);--------------------------控制LED七段显示数码管的七位数组型信号
choose4:
outstd_logic_vector(3downto0);--------选通信号
on_off:
instd_logic;------------------------紧急情况控制信号
state1,state2:
outstd_logic_vector(3downto0));---交通灯状态控制信号
endtracfic;
architecturesystemoftracficis-----------------元件例化调用
componentkeyin---------------------------------去抖动模块
port(a,b:
instd_logic;
c:
outstd_logic);
endcomponent;
componenttime-----------------------------------计时模块
port(a,b,k:
instd_logic;
c:
instd_logic_vector(1downto0);
d,e,f,g:
outstd_logic_vector(3downto0);
j,h:
outstd_logic);
endcomponent;
componentchoose--------------------------------选通模块
port(a:
instd_logic;
b:
outstd_logic_vector(3downto0));
endcomponent;
componentdisplay-------------------------------显示模块
port(a:
instd_logic_vector(3downto0);
b:
outstd_logic_vector(6downto0));
endcomponent;
componentclk_div--------------------------------时钟分频模块
port(a:
instd_logic;
b,c,d:
outstd_logic);
endcomponent;
componentkeep-----------------------------------状态控制模块
port(a,b,c,g,j:
instd_logic;
d,e:
outstd_logic_vector(3downto0);
f:
outstd_logic_vector(1downto0));
endcomponent;
signalon_off0:
std_logic;紧急情况经去抖后的输出信号;
signalstate:
std_logic_vector(1downto0);控制计数器的状态提示信号;
signalclk0,clk1,clk2:
std_logic;时钟分频后的输出信号;
signaleq0,sq0:
std_logic_vector(3downto0);南北和东西计数器的个位输出;
signaleq1,sq1:
std_logic_vector(3downto0);南北和东西计数器的十位输出;
signaltimel,times:
std_logic;计数器对控制器的反馈信号;
begin用信号把各个模块连起来;
u1:
keyinportmap(clk1,on_off,on_off0);
u3:
timeportmap(clk2,on_off0,reset,state,eq0