基于quartusll 交通灯控制系统.docx

上传人:b****2 文档编号:24539736 上传时间:2023-05-28 格式:DOCX 页数:26 大小:84.38KB
下载 相关 举报
基于quartusll 交通灯控制系统.docx_第1页
第1页 / 共26页
基于quartusll 交通灯控制系统.docx_第2页
第2页 / 共26页
基于quartusll 交通灯控制系统.docx_第3页
第3页 / 共26页
基于quartusll 交通灯控制系统.docx_第4页
第4页 / 共26页
基于quartusll 交通灯控制系统.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

基于quartusll 交通灯控制系统.docx

《基于quartusll 交通灯控制系统.docx》由会员分享,可在线阅读,更多相关《基于quartusll 交通灯控制系统.docx(26页珍藏版)》请在冰豆网上搜索。

基于quartusll 交通灯控制系统.docx

基于quartusll交通灯控制系统

一、设计任务要求

交通灯控制器:

用于十字路口的交通灯控制器。

实验要求:

1.东西方向各有一组红,黄,绿灯用于指挥交通,红,黄,绿的持续时间分别为25s,5s,20s.

2.当有紧急情况(如消防车)时,两个方向均为红灯亮,计时停止,当特殊情况结束后,控制器恢复原来状态,正常工作。

3.组数码管,以倒计时方式显示两个方向允许通行或禁止通行的时间。

二、设计思路及总体结构框图

设计思路:

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/

stas

reset

on_off4/

7/

7/

7/

7/

 

4/

2.软件:

(1)在VHDL设计描述中,采用自顶向下的设计思路,该思路,首先要描述顶层的接口,上面的描述已经规定了交通灯控制的输入输出信号:

输入信号:

复位开关信号reset;

紧急情况控制信号on_off;

外部时钟信号clk。

输出信号:

LED七段显示数码管的选通信号choose4(3downto0);

LED七段显示数码管的输出信号showtime1(6downto0),showntime2(6downto0),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个模块:

键输入模块,时钟分频模块,计时模块,选通模块,显示模块,控制模块。

各个模块之间的连接关系如下:

resetshowtime

on_off

reset0on_off0

clk1

timel,times

clk2clk0choose4

三、总体结构框图

 

No

yes

 

Yes

No

No

Yes

 

No

YesYes

No

No

Yes

 

Yes

No

No

Yes

 

Yes

 

No

Yes

四、分块电路设计。

(1)键输入模块(keyin)

输入信号:

紧急情况on_off;用来消除抖动的时钟信号clk1,由时钟分频模块提供。

输出信号:

去抖后的提示信号on_off0。

(2)时钟分频模块(clk_div)

输入信号:

外部时钟信号clk;

输出信号:

消除抖动的时钟信号clk1;计时内部时钟信号clk2;产生选通信号的时钟信号clk0。

(3)计时模块(time):

输入信号:

定时计时时钟clk2,由时钟分频模块提供;去抖动后的提示信号on_off0;复位信号reset;状态提示信号state(1downto0);

输出信号:

东西方向的十位信号eq1(3downto0);东西方向的个位信号eq0(3downto0);南北方向的十位信号sq1(3downto0);南北方向的个位信号sq0(3downto0);使能信号timel,times。

(4)选通模块(choose):

输入信号:

选通时钟信号clk0,由时钟分频模块提供。

输出信号:

选通信号choose4(3downto0)。

(5)显示模块(display):

输入信号:

计时的十位或个位信号;

输出信号:

控制LED七段显示数码管的七位数组型信号。

(6)控制模块(keep):

输入信号:

复位信号reset;去抖后的紧急情况提示信号on_off0;定时计时时钟信号clk2;使能信号timel,times;

输出信号:

东西方向交通灯状态控制信号state1(3downto0);南北方向交通灯状态控制信号state2(3downto0);交通灯状态提示信号state(1downto0)。

五、总体电路图(图形法)。

六、仿真波形

状态变化仿真图:

以下显示选通信号的仿真波形

七、源程序

主模块:

-—————————trafficmodule---—--——-

libraryieee;

useieee.std_logic_1164.all;

useieee。

std_logic_arith。

all;

useieee.std_logic_unsigned.all;

entitytracficis

port(reset:

instd_logic;-——-——--———-——--——--—-—复位信号

clk:

instd_logic;-——-————-——--—-—-——-———外部时钟信号

showtime1,showtime2,showtime3,showtime4:

outstd_logic_vector(6downto0);-———-————-————-—-——-—-——-—控制LED七段显示数码管的七位数组型信号

choose4:

outstd_logic_vector(3downto0);-———-——-选通信号

on_off:

instd_logic;--—---------—-----—-—-——紧急情况控制信号

state1,state2:

outstd_logic_vector(3downto0));———交通灯状态控制信号

endtracfic;

architecturesystemoftracficis-——---——-—--—————元件例化调用

componentkeyin-—---------——-———-—-——----——--———去抖动模块

port(a,b:

instd_logic;

c:

outstd_logic);

endcomponent;

componenttime--——-——--—---——-—--—-—--——-—--—-—--计时模块

port(a,b,k:

instd_logic;

c:

instd_logic_vector(1downto0);

d,e,f,g:

outstd_logic_vector(3downto0);

j,h:

outstd_logic);

endcomponent;

componentchoose————-—-—-———--------—————-—--—--选通模块

port(a:

instd_logic;

b:

outstd_logic_vector(3downto0));

endcomponent;

componentdisplay-—---—--—-————--—-—-----—-——-—-显示模块

port(a:

instd_logic_vector(3downto0);

b:

outstd_logic_vector(6downto0));

endcomponent;

componentclk_div—-——-————--——-—-———--———----—-—-时钟分频模块

port(a:

instd_logic;

b,c,d:

outstd_logic);

endcomponent;

componentkeep----—--—-———---—--—-——-——--—-—--———状态控制模块

port(a,b,c,g,j:

instd_logic;

d,e:

outstd_logic_vector(3downto0);

f:

outstd_logic_vector(1downto0));

endcomponent;

signalon_off0:

std_logic;紧急情况经去抖后的输出信号;

signalstate:

std_logic_vector(1downto0);控制计数器的状态提示信号;

signalclk0,clk1,clk2:

std_logic;时钟分频后的输出信号;

signaleq0,sq0:

std_logic_vector(3downto0);南北和东西计数器的个位输出;

signaleq1,sq1:

std_logic_vector(3downto0);南北和东西计数器的十位输出;

signaltimel,times:

std_logic;计数器对控制器的反馈信号;

begin用信号把各个模块连起来;

u1:

keyinportmap(clk1,on_off,on_off0);

u3:

timeportmap(clk2,on_off0,reset,state,eq0,eq1,sq0,sq1,timel,times);

u4:

chooseportmap(clk0,choose4);

u5:

displayportmap(eq0,showtime1);

u6:

displayportmap(eq1,showtime2);

u7:

displayportmap(sq0,showtime3);

u8:

displayportmap(sq1,showtime4);

u9:

keepportmap(on_off0,timel,times,clk2,reset,state1,state2,state);

u10:

clk_divportmap(clk,clk0,clk1,clk2);

endsystem;

去抖模块:

————---—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;

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;

选通模块:

该模块是为节省资源而设的,实验中有四个LED七段数码管显示计数,点亮一个LED需电流5-50mA,同时点亮4个LED,CPLD可能无法负荷这样的电流驱动,而且功率太大,散热也是问题。

同时这么做也容易造成电路被烧毁,因此需要逐个循环点亮。

又为使显示结果持续不致闪烁抖动,只需每个扫描频率超过人眼视觉暂留频率24Hz以上,就能达到。

选择200Hz作为时钟,分到4个数码管,每个数码管50Hz(大于24Hz),故不会有闪烁。

libraryieee;—---——-choosemodule-—---————-

useieee。

std_logic_1164.all;

useieee。

std_logic_unsigned.all;

entitychooseis

port(a:

instd_logic;

b:

outstd_logic_vector(3downto0));

endchoose;

architecturechoose_arcofchooseis

signalm:

integerrange0to3;

begin

process(a)

begin

if(a'eventanda=’1’)then

if(m=3)thenm<=0;

elsem〈=m+1;

endif;

endif;

casemiswhen0=〉b<="0111";

when1=〉b<="1011”;

when2=〉b<=”1101”;

when3=〉b〈="1110”;

endcase;

endprocess;

endchoose_arc;

分频模块:

实验中需要三个不同频率的时钟:

消抖电路需要10Hz的时钟,选通电路需要200Hz的时钟,计时需要1Hz的时钟。

外部提供的时钟的频率为1MHz,故需要经过分频得到,但由于外部时钟的频率和我们所需要的时钟的频率相差太远,一次分频到底又占用太多的资源,所以我采用的是先对外部时钟进行一定的分频,再依次向下分,得到我们需要的时钟,这样可以节省很多资源。

libraryieee;---—-clk_divmodule--—-—--

useieee。

std_logic_1164。

all;

entityclk_divis

port(a:

instd_logic;—------——-————-———---——----———外部时钟信号

b:

outstd_logic;—————-——--—————-——-——————-———频率为200Hz的时钟信号

c:

outstd_logic;———-------—-—-------——--—-—-—频率为10Hz的时钟信号

d:

outstd_logic);-—————--—--————————-——--—-——频率为1Hz的时钟信号

endclk_div;

architectureclk_div_arcofclk_divis

signalclk_10k:

std_logic;

signalclk_200:

std_logic;

signalclk_10:

std_logic;

signalclk_1:

std_logic;

signalm:

integerrange0to100;

signaln:

integerrange0to50;

signall:

integerrange0to20;

signalg:

integerrange0to10;

begin

p1:

process(a)-——-—---———先对外部时钟进行100分频,得到频率为10KHz的时钟信号

begin

if(a’eventanda=’1’)then

ifm=99thenm〈=0;

elsem<=m+1;

endif;

if(m〈=49)thenclk_10k〈='0’;

elseclk_10k〈='1’;

endif;

endif;

endprocess;

p2:

process(clk_10k)—-—-—--对10KHz的时钟信号再进行50分频,得到200Hz的时钟信号

begin

if(clk_10k'eventandclk_10k=’1')then

ifn=49thenn〈=0;

elsen<=n+1;

endif;

ifn〈=24thenclk_200〈=’0';

elseclk_200<='1’;

endif;

endif;

endprocess;

b<=clk_200;

p3:

process(clk_200)--——对200Hz的时钟信号进行20分频,得到10Hz的时钟信号

begin

if(clk_200'eventandclk_200=’1’)then

ifl=19thenl〈=0;

elsel<=l+1;

endif;

ifl<=9thenclk_10<=’0';

elseclk_10<='1';

endif;

endif;

endprocess;

c<=clk_10;

p4:

process(clk_10)-—-—对10Hz的时钟信号进行10分频,得到需要的1Hz的时钟信号

begin

if(clk_10’eventandclk_10=’1')then

ifg=9theng<=0;

elseg<=g+1;

endif;

ifg〈=4thenclk_1<=’0’;

elseclk_1〈='1';

endif;endif;

endprocess;

d<=clk_1;

endclk_div_arc;

显示模块:

---—-—displaymodule——-----—

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_signed。

all;

useieee。

std_logic_unsigned。

all;

entitydisplayis

port(a:

instd_logic_vector(3downto0);—--——-—-—-——-输入记数结果

b:

outstd_logic_vector(6downto0));-—--———--译码成七段数码管的控制信号

enddisplay;

architecturedisplay_arcofdisplayis

signala0:

std_logic_vector(3downto0);

begin

process(a0)

begin

a0〈=a;

casea0iswhen”0000"=>b〈="0111111";-—-—--—-—以下是译码部分

when"0001"=〉b〈=”0000110”;

when"0010"=>b<="1011011";

when"0011”=>b〈="1001111”;

when"0100"=>b<=”1100110";

when”0101"=>b〈="1101101”;

when”0110"=〉b<="1111101”;

when”0111”=>b<="0000111";

when”1

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

当前位置:首页 > 法律文书 > 判决书

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

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