EDA课程设计报告 交通灯控制器.docx
《EDA课程设计报告 交通灯控制器.docx》由会员分享,可在线阅读,更多相关《EDA课程设计报告 交通灯控制器.docx(38页珍藏版)》请在冰点文库上搜索。
EDA课程设计报告交通灯控制器
---------------------考试---------------------------学资学习网---------------------押题------------------------------
.
EDA课程设计报告
交通灯控制器
.
一、设计任务要求
1、控制器按东西、南北两个方向控制两组交通灯(红、绿、黄)
2、两组灯亮的顺序满足交通安全的规则要求.
3、东西向绿灯每次亮30S,接着黄灯亮2S,红灯亮20S;南北向绿灯每次亮28S,接着黄灯亮2S,红灯亮30S.
4、有两组数码管给出灯亮的时间倒计时显示。
二、设计思路及总体结构框图
设计思路:
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/State1
交通灯stas
resetState2
南北方向on_off4/交通灯
7/Showtime1
7/Showtime2
7/Showtime3
7/Showtime4
Choose4
4/
-2-
2.软件:
(1)在VHDL设计描述中,采用自顶向下的设计思路,该思路,首先要描述顶层的接口,上面的描述已经规定了交通灯控制的输入输出信号:
输入信号:
复位开关信号reset;
紧急情况控制信号on_off;
外部时钟信号clk。
输出信号:
LED七段显示数码管的选通信号choose4(3downto0);
LED七段显示数码管的输出信号showtime1(6downto0),showntime2(6
downto0),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个模块:
键输入模块,时钟分频模块,计时模块,选通模块,显示模块,控制模块
三、总体结构框图
-3-
通电
No
复位yes
东西为红,南北为绿,计时开始
YesNo
NoYesNo
YesYesNoNo
YesYesNoNo
Yes
Yes
No
Yes
是否有紧急情况计时到20s东西为黄,南北为绿是否有紧急情况计时到
两方红,
向均为计时停止
5s
是否消除?
东西为红,南北为绿
是否有紧急情况计时到20s
东西为红,南北为黄
是否有紧急情况5s
计时到
六、仿真波形
状态变化仿真图:
以下显示选通信号的仿真波形
-4-
-5-
七、源程序
去抖模块:
--------keyinmodule-----
libraryieee;
useieee.std_logic_1164.all;
entitykeyinis
port(A,B:
instd_logic;
C:
outstd_logic);
endkeyin;
architecturekeyin_arcofkeyinis
componentkand2
port(A,B:
instd_logic;
C:
outstd_logic);
endcomponent;
componentkdf
port(A,B:
instd_logic;
C,D:
outstd_logic);
endcomponent;
componentknand2
port(A,B:
instd_logic;
C:
outstd_logic);
endcomponent;
signalTMP1,TMP2,TMP3,TMP4,TMP5,TMP6:
std_logic;
begin
u0:
knand2portmap(A,TMP1,TMP2);
u1:
knand2portmap(TMP2,TMP3,TMP1);
U2:
kdfportmap(TMP2,B,TMP4,TMP3);
U3:
kdfportmap(TMP4,B,TMP6,TMP5);
u4:
kand2portmap(TMP4,TMP5,C);
endkeyin_arc;
libraryieee;---twoinputsandgatedescription
useieee.std_logic_1164.all;
entitykand2is
port(A,B:
instd_logic;
C:
outstd_logic);
endkand2;
architecturekand2_arcofkand2is
begin
C<=AandB;
endkand2_arc;---endoftwoinputsandgatedescription
libraryieee;---twoinputsand_notgatedescription
useieee.std_logic_1164.all;
entityknand2is
port(A,B:
instd_logic;
-6-
C:
outstd_logic);
endknand2;
architectureknand2_arcofknand2is
begin
C<=not(AandB);
endknand2_arc;---endoftwoinputsand_notgatedescription
libraryieee;---Dtriggerdescription
useieee.std_logic_1164.all;
entitykdfis
port(A,B:
instd_logic;
C,D:
outstd_logic);
endkdf;
architecturekdf_arcofkdfis
begin
process(B)
begin
if(B'eventandB='1')thenC<=A;D<=notA;
endif;
endprocess;
endkdf_arc;
控制模块:
---------keepmodule---------
libraryieee;
useieee.std_logic_1164.all;
entitykeepis
port(a,b,c,g,j:
instd_logic;
d,e:
outstd_logic_vector(3downto0);
f:
outstd_logic_vector(1downto0));
endkeep;
architecturekeep_arcofkeepis
typestate_typeis(s0,s1,s2,s3,s4);
signalcurrent_state:
state_type;
signalnew_state:
state_type;
begin
newstate_logic:
process(current_state,b,a,g)
variablem:
integerrange0to3;
begin
if(g='0')thennew_state<=s1;--------通电后给交通灯状态赋初值
elsecasecurrent_stateis
whens1=>m:
=0;
if(b='1'andj='0'anda='0')then--当计数到20s且无紧急情况时,交通灯跳至下一状态
new_state<=s2;
elsif(a='1')thennew_state<=s0;-有紧急情况时,交通灯变为紧急状态
-7-
elsenew_state<=s1;-------------计时未到的时候保持原状态不变
endif;
whens2=>m:
=1;
if(b='1'andj='1'anda='0')thennew_state<=s3;-当记数到5s且无紧急情况时,交通灯变为下一状态
elsif(a='1')thennew_state<=s0;---------有紧急情况时,交通灯变为紧急状态
elsenew_state<=s2;--------------------计时未到的时候保持原状态不变
endif;
whens3=>m:
=2;
if(j='1'andb='0'anda='0')thennew_state<=s4;-当记数到20s且无紧急情况时,交通灯变为下一状态
elsif(a='1')thennew_state<=s0;----有紧急情况时,交通灯变为紧急状态
elsenew_state<=s3;---------------计时未到的时候保持原状态不变
endif;
whens4=>m:
=3;
if(j='1'andb='1'anda='0')thennew_state<=s1;--当记数到5s且无紧急情况时,交通灯变为下一状态
elsif(a='1')thennew_state<=s0;-----有紧急情况时,交通灯变为紧急状态
elsenew_state<=s4;----------------计时未到的时候保持原状态不变
endif;
whens0=>if(a='0')then---------------紧急情况消除后,回到原来状态
casemiswhen0=>new_state<=s1;
when1=>new_state<=s2;
when2=>new_state<=s3;
when3=>new_state<=s4;
endcase;
elsenew_state<=s0;
endif;
endcase;
endif;
endprocess;
state_register:
process(c)
begin
if(c'eventandc='1')thencurrent_state<=new_state;--当时钟上升沿触发时,交通灯状态发生改变
endif;
endprocess;
output_logic:
process(current_state)---------------产生与交通灯状态相对应的提示信号,以控制计时模块的不同状态下的不同赋植
begin
casecurrent_stateiswhens0=>d<=0;e<=0;
whens1=>d<=0;e<=@1;f<=
whens2=>d<=0;e<=0;f<=;
-8-
whens3=>d<=@1;e<=0;f<=;
whens4=>d<=0;e<=0;f<=;
endcase;
endprocess;
endkeep_arc;
计时模块:
-------timemodule-------
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytimeis
port(a,b,k:
instd_logic;
c:
instd_logic_vector(1downto0);
d,e,f,g:
outstd_logic_vector(3downto0);
j,h:
outstd_logic);
endtime;
architecturetime_arcoftimeis
signall,m,n,p:
std_logic_vector(3downto0);
begin
process(a,b,k)
begin
if(k='0')thenl<=1;m<=0;n<=通电后赋初值
elseif(a'eventanda='1')then
if(b='1')thenl<=l;m<=m;n<=n;p<=p;-----------------有紧急情况时,计时停止
else
if(n=当东西方向倒计时到0时,重新赋值,并产生使能信号控制交通灯的状态
when
when=>n<=1;p<=0;j<='1';
when=>n<=
when=>n<=
whenothers=>null;
endcase;
elsej<='0';-----------------------计时未到0时,输出使能信号为0
if(n=当各位倒计时到0,而十位没到0时十位减一,个位赋9
elsen<=n-1;---------------------否则,各位减一
endif;
endif;
if(l=当南北方向倒计时到0时,重新赋值,并产生使能信号控制交通灯的状态
caseciswhen
when=>l<=
when=>l<=1;m<=
when=>l<=1;m<=0;h<='1';
-9-
whenothers=>null;
endcase;
elseh<='0';---------------------计时未到0时,输出使能信号为0
if(l=m/=l<=@1;m<=m-1;-当各位倒计时到0,而十位没到0时十位减一,个位赋9
elsel<=l-1;-----------------------------否则,各位减一
endif;
endif;
endif;
endif;
endif;
f<=n;g<=p;d<=l;e<=m;
endprocess;
endtime_arc;
-10-
-11-
-12-
-13-
-14-
-15-
-16-
-17-
-18-
-19-
-20-
-21-
-22-
-23-
-24-
-25-
-26-
-27-
-28-
-29-
-30-
-31-