交通灯控制器的设计.docx

上传人:b****4 文档编号:27507425 上传时间:2023-07-02 格式:DOCX 页数:16 大小:148.49KB
下载 相关 举报
交通灯控制器的设计.docx_第1页
第1页 / 共16页
交通灯控制器的设计.docx_第2页
第2页 / 共16页
交通灯控制器的设计.docx_第3页
第3页 / 共16页
交通灯控制器的设计.docx_第4页
第4页 / 共16页
交通灯控制器的设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

交通灯控制器的设计.docx

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

交通灯控制器的设计.docx

交通灯控制器的设计

 

EDA实验报告

 

一、课程设计题目及要求

题目:

十字路口交通灯

具体要求:

设计一个十字路口的交通灯控制器,能显示十字路口东西、南北两个方向红、黄、绿灯的指示状态。

用两组红、黄、绿三种颜色的灯分别作为东西、南北两个方向红、黄、绿等。

变化规律为:

东西绿灯亮,南北红灯亮——东西黄灯亮,南北红灯亮——东西红灯亮,南北绿灯亮——东西红灯亮,南北黄灯亮——东西绿灯亮,南北红灯亮······,这样循环下去。

南北方向每次通行时间为45秒,东西方向每次通行时间为45秒,要求两条交叉道路上的车辆交替运行,时间可设置修改。

绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道。

并要求所有交通灯的状态变化在时钟脉冲上升沿处。

二、实验编程环境

QuartusII8.0

三、课程设计的详细设计方案

(一)、总体设计方案的描述

1.1、根据交通灯系统设计要求,可以用一个有限状态机来实现这个交通灯控制器。

首先根据功能要求,明确两组交通灯的状态,这两组交通灯总共共有四种状态,我们用ST0,ST1,ST2,ST3来表示:

St0表示东西路绿灯亮,南北路红灯亮;

St1表示东西路黄灯亮,南北路红灯亮;

St2表示东西路红灯亮,南北路绿灯亮;

St3表示东西路红灯亮,南北路黄灯亮;

1.2、根据上述四种状态描述列出的状态转换表

表9-1交通灯控制器状态转换表

当前状态

下一状态

转换条件

St0

St1

主路绿灯亮了40秒

St1

St2

主路黄灯亮了5秒

St2

St3

主路绿灯亮了40秒

St3

St0

支路黄灯亮了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

begin

waituntilclk'eventandclk='1';

ifhold='0'then

counter<=counter;

else

ifcounter<89then

counter<=counter+1;

else

counter<=(others=>'0');

endif;

endif;

endprocess;

process

begin

waituntilclk'eventandclk='1';

current_state<=next_state;

endprocess;

state_trans:

process(current_state)

begin

casecurrent_stateis

whens0=>

ifhold='0'then

next_state<=s4;

else

ifcounter<39then

next_state<=s0;

else

next_state<=s1;

endif;

endif;

whens1=>

ifhold='0'then

next_state<=s4;

else

ifcounter<44then

next_state<=s1;

else

next_state<=s2;

endif;

endif;

whens2=>

ifhold='0'then

next_state<=s4;

else

ifcounter<84then

next_state<=s2;

else

next_state<=s3;

endif;

endif;

whens3=>

ifhold='0'then

next_state<=s4;

else

ifcounter<89then

next_state<=s3;

else

next_state<=s0;

endif;

endif;

whens4=>

ifhold='0'then

next_state<=s4;

else

ifcounter<39then

next_state<=s0;

elsifcounter<44then

next_state<=s1;

elsifcounter<84then

next_state<=s2;

elsifcounter<89then

next_state<=s3;

endif;

endif;

endcase;

endprocess;

output:

process(current_state)

begin

casecurrent_stateis

whens0=>

ared<='0';

agreen<='1';

ayellow<='0';

bred<='1';

bgreen<='0';

byellow<='0';

whens1=>

ared<='0';

agreen<='0';

ayellow<='1';

bred<='1';

bgreen<='0';

byellow<='0';

whens2=>

ared<='1';

agreen<='0';

ayellow<='0';

bred<='0';

bgreen<='1';

byellow<='0';

whens3=>

ared<='1';

agreen<='0';

ayellow<='0';

bred<='0';

bgreen<='0';

byellow<='1';

whens4=>

ared<='1';

agreen<='0';

ayellow<='0';

bred<='1';

bgreen<='0';

byellow<='0';

endcase;

endprocess;

endbehavior;

45秒倒计时计数器模块:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitym45is

port(

CLK:

instd_logic;

EN:

instd_logic;

CR:

instd_logic;

QL,QH:

outstd_logic_vector(3downto0);

OC:

outstd_logic

);

endm45;

architecturebehavofm45is

signalcouL,couH:

std_logic_vector(3downto0);

begin

process(CR,CLK,EN)

begin

ifCR='0'then

couL<="0000";

couH<="0000";

elsifclk'eventandclk='1'then

ifEN='1'then

if(couL=0andcouH=0)then

couL<="0100";

couH<="0100";

elsifcouL=0then

couL<="1001";

couH<=couH-1;

else

couL<=couL-1;

endif;

endif;

endif;

endprocess;

process(couL,couH)

begin

if(couL=0andcouH=0)then

OC<='1';

else

OC<='0';

endif;

endprocess;

QL<=couL;

QH<=couH;

endbehav;

7位译码器模块:

libraryieee;

useieee.std_logic_1164.all;

entityseg7is

port(dat:

instd_logic_vector(3downto0);

a,b,c,d,e,f,g:

outstd_logic);

endseg7;

architecturearcofseg7is

signaltmp:

std_logic_vector(6downto0);

begin

process(dat)

begin

casedatis

when"0000"=>tmp<="0000001";

when"0001"=>tmp<="1001111";

when"0010"=>tmp<="0010010";

when"0011"=>tmp<="0000110";

when"0100"=>tmp<="1001100";

when"0101"=>tmp<="0100100";

when"0110"=>tmp<="0100000";

when"0111"=>tmp<="0001111";

when"1000"=>tmp<="0000000";

when"1001"=>tmp<="0000100";

when"1010"=>tmp<="0001000";

when"1011"=>tmp<="1100000";

when"1100"=>tmp<="0110001";

when"1101"=>tmp<="1000010";

when"1110"=>tmp<="0110000";

when"1111"=>tmp<="0111000";

whenothers=>null;

endcase;

endprocess;

a<=tmp(6);

b<=tmp(5);

c<=tmp(4);

d<=tmp(3);

e<=tmp

(2);

f<=tmp

(1);

g<=tmp(0);

endarc;

50MHZ分频器模块:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitydevideis

port(

clk:

instd_logic;

clk_out:

outstd_logic

);

enddevide;

architecturearc_devideofdevideis

begin

process(clk)

variablecount:

integerrange0to49999999;

begin

ifclk'eventandclk='1'then

if(count=49999999)then

count:

=0;

clk_out<='1';

else

count:

=count+1;

clk_out<='0';

endif;

endif;

endprocess;

endarchitecturearc_devide;

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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