EDA报告交通灯控制器Word文件下载.docx
《EDA报告交通灯控制器Word文件下载.docx》由会员分享,可在线阅读,更多相关《EDA报告交通灯控制器Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
![EDA报告交通灯控制器Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/5/3d8ee56d-03fc-432f-831e-274bb22197af/3d8ee56d-03fc-432f-831e-274bb22197af1.gif)
五、各模块功能介绍
1.顶层原理图及基本原理
如图1-1所示,系统时钟(48M)经过分频得到1HZ方波,为状态机和计数器提供时钟,lsdsn[5..0]六位总线分别表示主干道和支干道的绿灯、黄灯、红灯。
ledsn[5]:
主干道绿灯,ledsn[4]:
主干道黄灯,ledsn[3]:
主干道红灯,ledsn[2]:
支干道绿灯,ledsn[1]:
支干道黄灯,ledsn[0]:
支干道红灯。
当系统复位后,如果s输入一个低电平(主、支干道均有车时,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒)状态机进入s0,主控电路c45输出一个高电平使能45s倒计时计数器(此时主干道绿灯亮,支干道红灯亮);
当计数结束后,45s倒计时计数器的cout输出一个进位信号,使状态机进入下一个状态s1,此时主控电路(状态机)c545输出一个高电平使能主干道5s倒计时计数器(此时主干道黄灯亮,支干道红灯亮);
当计数结束后,5s倒计时计数器的cout输出一个进位信号,使状态机进入下一个状态s2,此时主控电路c25输出一个高电平使能25s倒计时计数器(此时主干道红灯亮,支干道绿灯亮);
当计数结束后,25s倒计时计数器的cout输出一个进位信号,使状态机进入下一个状态s3,此时主控电路c525输出一个高电平使能支干道5s倒计时计数器(干道红灯亮,支干道黄灯亮);
当计数结束后,5s倒计时计数器的cout输出一个进位信号,使状态机重新进入下一个状态s0,依次循环.....
当系统复位后,如果s输入一个高电平(主干道处于常允许通行的状态),此时状态机一直保持在s0状态。
图1-1顶层原理图
图1-2s=0时原理图仿真结果
当s=0时,表示主、支干道均有车时,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒,从仿真波形图上可以看到,ledsn[5..0]分别表示主干道绿、黄、红灯,支干道绿、黄、红灯,当复位后,主干道绿灯(ledsn[5]=1),支干道红灯(ledsn[0]=1);
计满45秒后进入下个状态,主干道黄灯(ledsn[4]=1),支干道红灯(ledsn[0]=1);
计满5秒后进入下个状态,主干道红灯(ledsn[3]=1),支干道绿灯(ledsn[2]=1);
计满25秒后进入下个状态,主干道红灯(ledsn[3]=1),支干道黄灯(ledsn[1]=1);
计满5秒后进入下个状态,主干道绿灯(ledsn[5]=1),支干道红灯(ledsn[0]=1),依次循环.....(sg和bt为译码电路的仿真结果,在此可以忽略)
图1-3s=1时原理图仿真结果
当s=1时,表示主干道处于常允许通行的状态,此时从仿真图上可以看到
状态一直保持在主干道绿灯(ledsn[5]=1),支干道红灯(ledsn[0]=1)。
2.分频器
如图2-1所示,这次交通灯的设计用到了两个分频器,一个是将系统时钟进行48M分频得到1HZ的时钟提供给状态机和计数器;
另一个分频器是将系统时钟进行48K分频得到1KHZ的时钟,给数码管动态显示模块作为扫频时钟用。
这里采用的是事先写好的通用程序,分频系数可以根据具体需要进行修改,在此只给出原理图及VHDL源代码。
图2-1分频器原理图
其VHDL代码如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.NUMERIC_BIT.ALL;
--包含移位函数等.
ENTITYint_div2IS
GENERIC
(
F_DIV:
Integer:
=48000;
--分频系数
F_DIV_WIDTH:
=32--分频计数器宽度
);
PORT(
clock:
INSTD_LOGIC;
clock_out:
OUTSTD_LOGIC
END;
ARCHITECTUREoneOFint_div2IS
SIGNALclk_p_r:
STD_LOGIC;
--上升沿输出时钟
SIGNALclk_n_r:
--下降沿输出时钟
SIGNALcount_p:
STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);
--上升沿脉冲计数器
SIGNALcount_n:
--下降沿脉冲计数器
--SIGNALf_div_width_r:
STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);
SIGNALclock_out_r:
STD_LOGIC;
SIGNALfull_div_p:
--上升沿计数满标志
SIGNALhalf_div_p:
--上升沿计数半满标志
SIGNALfull_div_n:
--下降沿计数满标志
SIGNALhalf_div_n:
--下降沿计数半满标志
BEGIN
clock_out<
=clock_out_r;
--clock_out<
=clockWHEN(F_DIV=1)ELSE((clk_p_r='
1'
ANDclk_n_r='
)WHEN(F_DIV(0)='
)clk_p_r);
-------------------------<
<
判断计数标志位置位与否.
full_div_p<
='
WHEN(count_p<
F_DIV-1)ELSE'
0'
;
half_div_p<
(F_DIV/2)-1)ELSE'
full_div_n<
WHEN(count_n<
F_DIV-1)ELSE'
half_div_n<
(F_DIV/2)-1)ELSE'
PROCESS(clock)--上升沿脉冲计数
--VARIABLEi:
IntegerRANGE0TO31;
IFRISING_EDGE(clock)THEN
IFfull_div_p='
THEN
count_p<
=count_p+1;
IF(half_div_p='
)THEN
clk_p_r<
ELSE
ENDIF;
ELSE
=(OTHERS=>
'
);
clk_p_r<
='
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(clock)--下降沿脉冲计数
IFFALLING_EDGE(clock)THEN
IFfull_div_n='
count_n<
=count_n+1;
IFhalf_div_n='
clk_n_r<
=(OTHERS=>
clk_n_r<
PROCESS(clock)
IFF_DIV=1THEN
clock_out_r<
=clock;
IF(F_DIVREM2)=1THEN
clock_out_r<
=clk_p_rANDclk_n_r;
=clk_p_r;
3.主控电路(状态机)
主控电路是一个单进程的Moore型有限状态机,状态转换图如图3-1所示。
图3-1状态转换图
每种状态说明如下:
原状态
目的状态
转换条件
状态输出
s0
s1
s=’1’且s45=’1’
ledsn<
="
100001"
c45<
c25<
c545<
c525<
s2
s545=’1’
010001"
s3
s25=’1’
001100"
s525=’1’
001010"
状态机原理图如图3-2所示。
图3-2状态机原理图
状态机仿真结果如图3-3所示。
图3-3状态机仿真结果
从仿真结果可以看到,满足状态转换条件后,状态机就会从现在的状态转移到下一个状态,具体的转换结果与上表相同。
libraryieee;
useieee.std_logic_1164.all;
entitytrafficis
port(CLK,RST,s,s45,s25,s545,s525:
instd_logic;
c45,c25,c545,c525:
outstd_logic;
ledsn:
outstd_logic_vector(5downto0));
endtraffic;
architectureoneoftrafficis
typesxis(s0,s1,s2,s3);
signalcurrent_state:
sx;
begin
process(RST,CLK)
ifRST='
then
current_state<
=s0;
elsifCLK'
eventandCLK='
then
casecurrent_stateis
whens0=>
ifs='
thencurrent_state<
elsifs45='
=s1;
elsecurrent_state<
endif;
ledsn<
whens1=>
ifs545='
=s2;
whens2=>
ifs25='
=s3;
whens3=>
ifs525='
ledsn<
c45<
endcase;
endif;
endprocess;
endone;
4.45秒倒计时电路
45秒倒计时电路是一个45秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。
其原理图如图4-1所示。
图4-145秒计数器原理图
45秒倒计时电路的仿真结果如图4-2所示。
图4-245秒计数器仿真结果
useieee.std_logic_unsigned.all;
entitycnt45is
port(CLK,RST,EN:
CQ:
outstd_logic_vector(5downto0);
cout:
outstd_logic);
end;
architecturebehavofcnt45is
begin
process(CLK,RST,EN)
variableCQI:
std_logic_vector(5downto0);
ifCLK'
thenCQI:
101100"
elsifEN='
ifCQI>
0thenCQI:
=CQI-1;
cout<
elseCQI:
CQ<
=CQI;
endbehav;
5.25秒倒计时电路
25秒倒计时电路是一个25秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。
其原理图如图5-1所示。
图5-125秒计数器原理图
25秒倒计时电路的仿真结果如图5-2所示。
图5-225秒计数器仿真结果
entitycnt25is
outstd_logic_vector(4downto0);
architecturebehavofcnt25is
std_logic_vector(4downto0);
11000"
6.5秒倒计时电路
5秒倒计时电路是一个5秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。
其原理图如图6-1所示。
图6-15秒计数器原理图
5秒倒计时电路的仿真结果如图6-2所示,由于交通灯没有对黄灯5秒的倒计时进行显示,所以没有添加计数输出的端口,只用到了进位端口,在仿真图中可以看到,每次5个计数脉冲之后计数器就会输出一个进位信号。
图6-25秒计数器仿真结果
entitycnt5is
port(CLK,RST,EN:
architecturebehavofcnt5is
std_logic_vector(2downto0);
100"
7.数码管动态扫描译码电路
数码管动态扫描译码电路如图7-1所示,此电路负责将主干道和支干道的45秒和25秒倒计时进行译码然后显示输出。
考虑到实验箱上的数码管位8位数码管,这里采用动态扫描的显示方式。
由于仿真结果并不能正确的看到数码管的输出结果,这里没有给出仿真图。
图7-1数码管动态扫描译码电路原理图
entitydecl7s4is
port(clk:
instd_logic;
a45:
instd_logic_vector(5downto0);
a25:
instd_logic_vector(4downto0);
sg:
outstd_logic_vector(6downto0);
bt:
outstd_logic_vector(3downto0));
end;
architectureoneofdecl7s4is
signalcnt4:
std_logic_vector(2downto0);
signala:
std_logic_vector(5downto0);
signala1:
signala2:
signala3:
signala4:
p0:
process(a45)
begin
casea45is
when"
000000"
=>
a2<
a1<
---0
000001"
---1
000010"
---2
000011"
---3
000100"
---4
000101"
---5
000110"
---6
000111"
---7
001000"
---8
001001"
---9
---10
001011"
---11
---12
001101"
---13
001110"
---14
001111"
---15
010000"
---16
when