交通灯控制器的设计Word文档格式.docx
《交通灯控制器的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《交通灯控制器的设计Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
表9-1交通灯控制器状态转换表
当前状态
下一状态
转换条件
St0
St1
主路绿灯亮了40秒
St2
主路黄灯亮了5秒
St3
主路绿灯亮了40秒
支路黄灯亮了5秒
1.3、根据状态转换表得到交通灯控制器的状态转移图如图所示。
交通灯控制器的状态转移图
(二)各个模块设计
2.1、控制器模块
控制器模块示意图
其中,clk为时钟信号,时钟上升沿有效。
hold为紧急制动信号,低电平有效。
ared,agreen,ayellow分别表示东西方向的红灯,黄灯,绿灯显示信号,高电平有效。
bred,bgreen,byellow分别表示南北方向的红灯,黄灯,绿灯显示信号,高电平有效。
用于控制红绿黄灯的亮暗情况。
2.2、45秒倒计时计数器模块
45秒倒计时计数器模块示意图
其中,CLK为时钟信号,时钟上升沿有效。
EN为使能端,高电平有效。
CR为紧急制动信号低电平有效。
QL{3..0}是计数低位。
QH{3..0}是计数高位。
用于45秒的倒计时计数。
2.3、7位译码器模块
7位译码器模块示意图
其中dat{3..0}为要译码的信号。
a,b,c,d,e,f,g为译码后的信号。
用于将45秒倒计时计数的信号译码成数码管可以识别的信号。
2.4、50MHZ分频器模块
50MHZ分频器模块示意图
其中clk为50MHZ时钟信号,时钟上升沿有效。
输出clk_out为1HZ时钟信号,时钟上升沿有效。
用于将50MHZ的时钟信号转变成1HZ的时钟信号。
(三)结构图设计
(四)仿真电路
时序仿真图
从图中可看到首先进入st0状态,此时东西路绿灯亮,南北路红灯亮;
计数器计数到40秒时,交通灯控制器进入st1状态,此时东西路黄灯亮,南北路红灯亮;
在st1状态计数器又开始计数,计数器计数到5秒后,交通灯控制器状态进入st2,此时东西路红灯亮,南北路绿灯亮;
在st2状态计数器又开始计数,计数器计数到40秒后,交通灯控制器状进入st3状态,此时东西路红灯亮,南北路绿灯亮;
在st3状态计数器又开始计数,计数器计数到5秒后,交通灯控制器状态进入st0状态,此时东西路绿灯亮,南北路红灯亮,如些循环反复,完成十字交通路口的红绿灯控制。
A0-G0,A1-G1分别为45到0的译码。
(五)分配引脚
为了对此工程进行硬件测试,应将编译成功后的程序下载到目标芯片上,并指定输入输出信号的管脚,以便添加激励信号和测试输出信号。
在下载编译成功的文件之前,需要制定器件的管脚,选择Assignments|Pins命令,在随后出现的下拉列表框中选择对应端口信号名的器件引脚号,如下图:
四、设计总结和心得
通过此次EDA设计,我系统性的学习了课本上相关的知识,对课堂上的知识更加了解。
通过认真研究课本,使我对EDA程序设计有了一定思路;
通过实验课的学习,在程序的设计,程序的调试方面都学到了很多东西,在这几天时间里,实验室的氛围对我们的影响很大,大家一起努力,这也是我们能完成课设的动力。
其中在编程中也出现了很多的问题,但通过老师和同学的帮助下,把问题一一解决。
其实只要我们自己认真看书,仔细分析,仔细调试,就一定会发下错误,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习EDA更是如此,程序只有经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
五、源代码
控制器模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycontrolis
port(clk,hold:
instd_logic;
ared,agreen,ayellow,bred,bgreen,byellow:
outstd_logic);
endcontrol;
architecturebehaviorofcontrolis
typestate_typeis(s0,s1,s2,s3,s4);
signalcurrent_state,next_state:
state_type;
signalcounter:
std_logic_vector(6downto0);
begin
synch:
process
waituntilclk'
eventandclk='
1'
;
ifhold='
0'
then
counter<
=counter;
else
ifcounter<
89then
=counter+1;
=(others=>
'
);
endif;
endprocess;
process
eventandclk='
current_state<
=next_state;
endprocess;
state_trans:
process(current_state)
casecurrent_stateis
whens0=>
next_state<
=s4;
39then
=s0;
=s1;
whens1=>
44then
=s2;
whens2=>
84then
=s3;
whens3=>
whens4=>
elsifcounter<
endcase;
output:
casecurrent_stateis
whens0=>
ared<
='
agreen<
ayellow<
bred<
bgreen<
byellow<
whens1=>
whens2=>
whens3=>
whens4=>
endcase;
endbehavior;
45秒倒计时计数器模块:
entitym45is
port(
CLK:
EN:
CR:
QL,QH:
outstd_logic_vector(3downto0);
OC:
outstd_logic
);
endm45;
architecturebehavofm45is
signalcouL,couH:
std_logic_vector(3downto0);
process(CR,CLK,EN)
begin
ifCR='
couL<
="
0000"
couH<
elsifclk'
ifEN='
if(couL=0andcouH=0)then
couL<
0100"
couH<
elsifcouL=0then
1001"
=couH-1;
else
=couL-1;
endif;
endif;
endif;
process(couL,couH)
if(couL=0andcouH=0)then
OC<
QL<
=couL;
QH<
=couH;
endbehav;
7位译码器模块:
entityseg7is
port(dat:
instd_logic_vector(3downto0);
a,b,c,d,e,f,g:
outstd_logic);
endseg7;
architecturearcofseg7is
signaltmp:
std_logic_vector(6downto0);
process(dat)
begin
casedatis
when"
=>
tmp<
0000001"
0001"
1001111"
0010"
0010010"
0011"
0000110"
1001100"
0101"
0100100"
0110"
0100000"
0111"
0001111"
1000"
0000000"
0000100"
1010"
0001000"
1011"
1100000"
1100"
0110001"
1101"
1000010"
1110"
0110000"
1111"
0111000"
whenothers=>
null;
endcase;
a<
=tmp(6);
b<
=tmp(5);
c<
=tmp(4);
d<
=tmp(3);
e<
=tmp
(2);
f<
=tmp
(1);
g<
=tmp(0);
endarc;
50MHZ分频器模块:
entitydevideis
clk:
clk_out:
enddevide;
architecturearc_devideofdevideis
process(clk)
variablecount:
integerrange0to49999999;
ifclk'
if(count=49999999)then
count:
=0;
clk_out<
else
=count+1;
endarchitecturearc_devide;