EDA报告交通灯控制器.docx

上传人:b****5 文档编号:6992840 上传时间:2023-01-15 格式:DOCX 页数:20 大小:290.96KB
下载 相关 举报
EDA报告交通灯控制器.docx_第1页
第1页 / 共20页
EDA报告交通灯控制器.docx_第2页
第2页 / 共20页
EDA报告交通灯控制器.docx_第3页
第3页 / 共20页
EDA报告交通灯控制器.docx_第4页
第4页 / 共20页
EDA报告交通灯控制器.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

EDA报告交通灯控制器.docx

《EDA报告交通灯控制器.docx》由会员分享,可在线阅读,更多相关《EDA报告交通灯控制器.docx(20页珍藏版)》请在冰豆网上搜索。

EDA报告交通灯控制器.docx

EDA报告交通灯控制器

 

天津工业大学

EDA课程设计报告

 

题目:

交通灯控制器

班级:

电子1301

学号:

姓名:

 

一、设计目的

1.了解交通灯的变化规律;

2.掌握VHDL编程语言,了解实际设计中的优化方案。

二、开发软件

QuartusII

三、设计任务及分析

1.设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。

2.红、绿、黄发光二极管作信号灯。

3.主干道处于常允许通行的状态,支干道有车来时才允许通行。

主干道亮绿灯时,支干道亮红灯;支干道亮绿灯时,主干道亮红灯。

4.主、支干道均有车时,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒,设立45秒、25秒计时、显示电路。

5.在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡,使行驶中的车辆有时间停到禁行线外,设立5秒计时、显示电路。

题目分析:

根据题目要求可以知道,系统需要在几种不同的状态之间进行切换,为了设计的方便,并且实现高效率和高可靠的逻辑控制,这里我们采用状态机的方法进行设计。

四、设计方案

主控电路是一个单进程Moore型有限状态机,通过接收计数器发送的“时间到”(进位)信号以及根据s(用来指示支干道是否有车来,‘1’表示支干道没有车来,‘0’支干道有车来)的值进行状态的切换,实现对十字路口主干道、支干道两个方向的红、黄、绿灯状态的控制。

系统框图如图一所示。

图一系统整体框图

具体控制过程为:

当s=‘1’时,支干道没有车来,主干道处于常允许通行的状态,此时主干道亮绿灯,支干道亮红灯;当s=‘0’时,支干道有车来,即主、支干道均有车,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒,且在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡。

变化规律为:

主干道绿灯亮,支干道红灯亮→主干道黄灯亮,支干道红灯亮→主干道红灯亮,支干道绿灯亮→主干道红灯亮,支干道黄灯亮→主干道绿灯亮,支干道红灯亮…,这样依次循环。

由于主、支干道有45秒和25秒的放行时间,以及每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡,所以设计45秒、25秒和5秒计时电路,均采用倒计时。

关于显示的问题,译码电路是把对应的二进制码直接转换成数码管显示时的码字,并且由于实验箱上采用的是8位数码管,所以必须采用数码管的动态扫描。

五、各模块功能介绍

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:

Integer:

=32--分频计数器宽度

);

PORT(

clock:

INSTD_LOGIC;

clock_out:

OUTSTD_LOGIC

);

END;

ARCHITECTUREoneOFint_div2IS

SIGNALclk_p_r:

STD_LOGIC;--上升沿输出时钟

SIGNALclk_n_r:

STD_LOGIC;--下降沿输出时钟

SIGNALcount_p:

STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);--上升沿脉冲计数器

SIGNALcount_n:

STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);--下降沿脉冲计数器

--SIGNALf_div_width_r:

STD_LOGIC_VECTOR(f_div_width-1DOWNTO0);

SIGNALclock_out_r:

STD_LOGIC;

SIGNALfull_div_p:

STD_LOGIC;--上升沿计数满标志

SIGNALhalf_div_p:

STD_LOGIC;--上升沿计数半满标志

SIGNALfull_div_n:

STD_LOGIC;--下降沿计数满标志

SIGNALhalf_div_n:

STD_LOGIC;--下降沿计数半满标志

BEGIN

clock_out<=clock_out_r;

--clock_out<=clockWHEN(F_DIV=1)ELSE((clk_p_r='1'ANDclk_n_r='1')WHEN(F_DIV(0)='1')clk_p_r);

-------------------------<<判断计数标志位置位与否.

full_div_p<='1'WHEN(count_p

half_div_p<='1'WHEN(count_p<(F_DIV/2)-1)ELSE'0';

full_div_n<='1'WHEN(count_n

half_div_n<='1'WHEN(count_n<(F_DIV/2)-1)ELSE'0';

PROCESS(clock)--上升沿脉冲计数

--VARIABLEi:

IntegerRANGE0TO31;

BEGIN

IFRISING_EDGE(clock)THEN

IFfull_div_p='1'THEN

count_p<=count_p+1;

IF(half_div_p='1')THEN

clk_p_r<='0';

ELSE

clk_p_r<='1';

ENDIF;

ELSE

count_p<=(OTHERS=>'0');

clk_p_r<='0';

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clock)--下降沿脉冲计数

BEGIN

IFFALLING_EDGE(clock)THEN

IFfull_div_n='1'THEN

count_n<=count_n+1;

IFhalf_div_n='1'THEN

clk_n_r<='0';

ELSE

clk_n_r<='1';

ENDIF;

ELSE

count_n<=(OTHERS=>'0');

clk_n_r<='0';

ENDIF;

ENDIF;

ENDPROCESS;

PROCESS(clock)

BEGIN

IFRISING_EDGE(clock)THEN

IFF_DIV=1THEN

clock_out_r<=clock;

ELSE

IF(F_DIVREM2)=1THEN

clock_out_r<=clk_p_rANDclk_n_r;

ELSE

clock_out_r<=clk_p_r;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

END;

 

3.主控电路(状态机)

主控电路是一个单进程的Moore型有限状态机,状态转换图如图3-1所示。

图3-1状态转换图

每种状态说明如下:

原状态

目的状态

转换条件

状态输出

s0

s1

s=’1’且s45=’1’

ledsn<="100001";c45<='1';c25<='0';c545<='0';c525<='0';

s1

s2

s545=’1’

ledsn<="010001";c45<='0';c25<='0';c545<='1';c525<='0';

s2

s3

s25=’1’

ledsn<="001100";c45<='0';c25<='1';c545<='0';c525<='0';

s3

s0

s525=’1’

ledsn<="001010";c45<='0';c25<='0';c545<='0';c525<='1';

状态机原理图如图3-2所示。

图3-2状态机原理图

状态机仿真结果如图3-3所示。

 

图3-3状态机仿真结果

从仿真结果可以看到,满足状态转换条件后,状态机就会从现在的状态转移到下一个状态,具体的转换结果与上表相同。

其VHDL代码如下:

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)

begin

ifRST='1'then

current_state<=s0;ledsn<="100001";c45<='1';c25<='0';c545<='0';c525<='0';

elsifCLK'eventandCLK='1'then

casecurrent_stateis

whens0=>ifs='1'thencurrent_state<=s0;

elsifs45='1'thencurrent_state<=s1;

elsecurrent_state<=s0;endif;

ledsn<="100001";c45<='1';c25<='0';c545<='0';c525<='0';

whens1=>ifs545='1'thencurrent_state<=s2;

elsecurrent_state<=s1;endif;

ledsn<="010001";c45<='0';c25<='0';c545<='1';c525<='0';

whens2=>ifs25='1'thencurrent_state<=s3;

elsecurrent_state<=s2;endif;

ledsn<="001100";c45<='0';c25<='1';c545<='0';c525<='0';

whens3=>ifs525='1'thencurrent_state<=s0;

elsecurrent_state<=s3;endif;

ledsn<="001010";c45<='0';c25<='0';c545<='0';c525<='1';

endcase;

endif;

endprocess;

endone;

4.45秒倒计时电路

45秒倒计时电路是一个45秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。

其原理图如图4-1所示。

图4-145秒计数器原理图

45秒倒计时电路的仿真结果如图4-2所示。

图4-245秒计数器仿真结果

其VHDL代码如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitycnt45is

port(CLK,RST,EN:

instd_logic;

CQ:

outstd_logic_vector(5downto0);

cout:

outstd_logic);

end;

architecturebehavofcnt45is

begin

process(CLK,RST,EN)

variableCQI:

std_logic_vector(5downto0);

begin

ifCLK'eventandCLK='1'then

ifRST='1'thenCQI:

="101100";

elsifEN='1'then

ifCQI>0thenCQI:

=CQI-1;cout<='0';

elseCQI:

="101100";cout<='1';

endif;

endif;

endif;

CQ<=CQI;

endprocess;

endbehav;

5.25秒倒计时电路

25秒倒计时电路是一个25秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。

其原理图如图5-1所示。

图5-125秒计数器原理图

25秒倒计时电路的仿真结果如图5-2所示。

图5-225秒计数器仿真结果

其VHDL代码如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitycnt25is

port(CLK,RST,EN:

instd_logic;

CQ:

outstd_logic_vector(4downto0);

cout:

outstd_logic);

end;

architecturebehavofcnt25is

begin

process(CLK,RST,EN)

variableCQI:

std_logic_vector(4downto0);

begin

ifCLK'eventandCLK='1'then

ifRST='1'thenCQI:

="11000";

elsifEN='1'then

ifCQI>0thenCQI:

=CQI-1;cout<='0';

elseCQI:

="11000";cout<='1';

endif;

endif;

endif;

CQ<=CQI;

endprocess;

endbehav;

6.5秒倒计时电路

5秒倒计时电路是一个5秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。

其原理图如图6-1所示。

图6-15秒计数器原理图

5秒倒计时电路的仿真结果如图6-2所示,由于交通灯没有对黄灯5秒的倒计时进行显示,所以没有添加计数输出的端口,只用到了进位端口,在仿真图中可以看到,每次5个计数脉冲之后计数器就会输出一个进位信号。

图6-25秒计数器仿真结果

其VHDL代码如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitycnt5is

port(CLK,RST,EN:

instd_logic;

cout:

outstd_logic);

end;

architecturebehavofcnt5is

begin

process(CLK,RST,EN)

variableCQI:

std_logic_vector(2downto0);

begin

ifCLK'eventandCLK='1'then

ifRST='1'thenCQI:

="100";

elsifEN='1'then

ifCQI>0thenCQI:

=CQI-1;cout<='0';

elseCQI:

="100";cout<='1';

endif;

endif;

endif;

endprocess;

endbehav;

7.数码管动态扫描译码电路

数码管动态扫描译码电路如图7-1所示,此电路负责将主干道和支干道的45秒和25秒倒计时进行译码然后显示输出。

考虑到实验箱上的数码管位8位数码管,这里采用动态扫描的显示方式。

由于仿真结果并不能正确的看到数码管的输出结果,这里没有给出仿真图。

图7-1数码管动态扫描译码电路原理图

其VHDL代码如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

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:

std_logic_vector(5downto0);

signala2:

std_logic_vector(5downto0);

signala3:

std_logic_vector(5downto0);

signala4:

std_logic_vector(5downto0);

begin

p0:

process(a45)

begin

casea45is

when"000000"=>a2<="000000";a1<="000000";---0

when"000001"=>a2<="000000";a1<="000001";---1

when"000010"=>a2<="000000";a1<="000010";---2

when"000011"=>a2<="000000";a1<="000011";---3

when"000100"=>a2<="000000";a1<="000100";---4

when"000101"=>a2<="000000";a1<="000101";---5

when"000110"=>a2<="000000";a1<="000110";---6

when"000111"=>a2<="000000";a1<="000111";---7

when"001000"=>a2<="000000";a1<="001000";---8

when"001001"=>a2<="000000";a1<="001001";---9

when"001010"=>a2<="000001";a1<="000000";---10

when"001011"=>a2<="000001";a1<="000001";---11

when"001100"=>a2<="000001";a1<="000010";---12

when"001101"=>a2<="000001";a1<="000011";---13

when"001110"=>a2<="000001";a1<="000100";---14

when"001111"=>a2<="000001";a1<="000101";---15

when"010000"=>a2<="000001";a1<="000110";---16

when

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1