基于quartusll 交通灯控制系统企业管理.docx

上传人:b****1 文档编号:487726 上传时间:2023-04-29 格式:DOCX 页数:27 大小:208.82KB
下载 相关 举报
基于quartusll 交通灯控制系统企业管理.docx_第1页
第1页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第2页
第2页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第3页
第3页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第4页
第4页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第5页
第5页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第6页
第6页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第7页
第7页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第8页
第8页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第9页
第9页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第10页
第10页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第11页
第11页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第12页
第12页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第13页
第13页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第14页
第14页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第15页
第15页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第16页
第16页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第17页
第17页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第18页
第18页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第19页
第19页 / 共27页
基于quartusll 交通灯控制系统企业管理.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于quartusll 交通灯控制系统企业管理.docx

《基于quartusll 交通灯控制系统企业管理.docx》由会员分享,可在线阅读,更多相关《基于quartusll 交通灯控制系统企业管理.docx(27页珍藏版)》请在冰点文库上搜索。

基于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位数组型的。

外部电路图如下:

 clk          4/

     stas

 reset

on_off           4/

7/

7/

7/

7/

 

           4/

2.软件:

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

输入信号:

复位开关信号reset;

紧急情况控制信号on_off;

外部时钟信号clk。

输出信号:

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

LED七段显示数码管的输出信号showtime1(6 downto0),showntime2(6 downto0),showtime3(6downto0),showtome4(6downto0);

交通灯状态控制信号state1(3downto0),state2(3 downto 0)。

(2)在自顶向下的VHDL设计描述中,通常把整个设计的系统划分为几个模块,然后采用结构描述方式对整个系统进行描述。

根据实验设计的结构功能,来确定使用哪些模块以及这些模块之间的关系.

由于紧急情况控制信号是采用按键的输入方式,其产生时刻和持续时间的长短是随机不定的,且存在因开关簧片反弹引起的电平抖动现象,因此必须在每个开关后面安排一个消抖和同步化电路模块,以保证系统能捕捉到输入脉冲,故需要有防抖动的模块。

由于外部时钟信号clk的频率为1MHz,而实际需要的内部计时时钟频率为1Hz,提供给消抖同步电路的频率为50Hz(满足按键)和提供给产生选通信号电路的时钟频率为200Hz(满足视觉暂留效应)。

当正常计时开始后,需要进行定时计数操作,由于东西和南北两个方向上的时间显示器是由两个LED七段显示数码管组成的,因此需要产生两个2位的计时信息:

2个十位信号,2个个位信号,这个定时计数操作可以由一个定时计数器来完成,又因为交通灯的状态变化是在计时为0的情况下才能进行的,因此需要一个计时电路来产生使能信号,因此定时计数的功能就是用来产生2个2位计时信息和使能信号。

另外还需要将时间显示出来,为了节省资源,我采用了循环点亮LED七段显示数码管的方法来显示计时输出。

通过信号choose4(3downto 0)来对4个LED七段显示数码管进行选择。

由于不能使用7448自动译码集成电路,故在LED七段显示数码管显示时间时,要把计时结果转换为七段码输出到相应的LED七段显示数码管上,因此还需要一个转换电路。

交通灯状态控制也需要一个电路,当有使能信号及无紧急情况下,交通灯状态不发生变化,有紧急情况时,两个方向上均为红灯亮,紧急情况消除后,回到原来状态,无使能信号时,交通灯状态不变.

通过上面的分析,不难得知可以把交通灯控制系统划分为6个模块:

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

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

reset                  showtime

on_off

reset0 on_off0

        clk1

    timel,times

  clk2   clk0 choose4

 

三、总体结构框图

 

 No

    yes

 

            Yes

  No

 No    

     Yes

 

 No

        Yes         Yes

  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(1downto 0);

输出信号:

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

(4)选通模块(choose):

输入信号:

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

输出信号:

选通信号choose4(3downto 0)。

(5)显示模块(display):

输入信号:

计时的十位或个位信号;

输出信号:

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

(6)控制模块(keep):

输入信号:

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

输出信号:

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

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

六、仿真波形

状态变化仿真图:

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

七、源程序

主模块:

---—-----—traffic module----——---

libraryieee;

use ieee。

std_logic_1164。

all;

useieee.std_logic_arith.all;

useieee。

std_logic_unsigned。

all;

entitytracficis

port(reset :

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

   clk :

in std_logic;-——-——--—---——-—---——-—外部时钟信号

  showtime1,showtime2,showtime3,showtime4:

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

 choose4:

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

  on_off  :

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

state1,state2:

 out std_logic_vector(3downto0));---交通灯状态控制信号

 end tracfic;

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

component keyin-—---——---—-—-—---——--—---———--—-去抖动模块

   port(a,b:

instd_logic;

  c:

outstd_logic);

 endcomponent;

component time-—-———-—---—-—-—--——-—---—-—---——--计时模块

 port(a,b,k:

in std_logic;

 c:

instd_logic_vector(1downto0);

  d,e,f,g:

out std_logic_vector(3downto 0);

  j,h:

outstd_logic);

 endcomponent;

 component choose—----—-———-—--—---—-——--———-————选通模块

 port(a:

instd_logic;

b:

out std_logic_vector(3downto0));

 end component;

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

 port(a:

instd_logic_vector(3downto0);

     b:

outstd_logic_vector(6downto0));

  end component;

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

 port(a:

instd_logic;

      b,c,d:

outstd_logic);

 endcomponent;

component keep—--—-—---—-——-—----————------------状态控制模块

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

instd_logic;

  d,e:

out std_logic_vector(3downto 0);

 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(3downto 0);南北和东西计数器的个位输出;

signaleq1,sq1:

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

signaltimel,times:

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

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

 u1:

keyin   portmap(clk1,on_off,on_off0);

u3:

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

u4:

choose portmap(clk0,choose4);

u5:

display portmap(eq0,showtime1);

 u6:

displayportmap(eq1,showtime2);

u7:

displayport map(sq0,showtime3);

 u8:

displayport map(sq1,showtime4);

u9:

keep  portmap(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);

end keyin;

architecture keyin_arcof keyinis

  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;

signal TMP1,TMP2,TMP3,TMP4,TMP5,TMP6:

std_logic;

begin

 u0:

knand2 portmap(A,TMP1,TMP2);

u1:

knand2portmap(TMP2,TMP3,TMP1);

 U2:

kdfportmap(TMP2,B,TMP4,TMP3);

U3:

 kdf    portmap(TMP4,B,TMP6,TMP5);

 u4:

kand2portmap(TMP4,TMP5,C);

endkeyin_arc;

libraryieee;—-—twoinputsandgatedescription

useieee.std_logic_1164.all;

entity kand2 is

port(A,B:

instd_logic;

   C :

outstd_logic);

endkand2;

architecturekand2_arcofkand2is

begin

 C<=Aand B;

endkand2_arc;———end oftwoinputsandgatedescription

libraryieee;--—twoinputs and_notgatedescription

useieee.std_logic_1164。

all;

entity knand2 is

port(A,B:

in std_logic;

  C :

outstd_logic);

endknand2;

architectureknand2_arc ofknand2 is

begin

 C〈=not(Aand B);

end knand2_arc;—--endoftwoinputs and_not gate description

libraryieee;-—-D triggerdescription

useieee。

std_logic_1164.all;

entity  kdfis

   port(A,B:

in std_logic;

C,D:

outstd_logic);

endkdf;

architecturekdf_arcofkdf is

begin

process(B)

begin

 if(B'eventandB='1’)thenC〈=A;D<=notA;

  endif;

 end process;

end kdf_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;

architecture choose_arcofchooseis

signalm :

integer range0to3;

begin

 process(a)

 begin

  if(a'event and a='1')then

 if(m=3)thenm〈=0;

 elsem<=m+1;

  end if;

 endif;

casemiswhen0=〉b〈=”0111";

 when 1=>b〈=”1011";

 when2=〉b〈=”1101";

   when3=>b<="1110";

endcase;

endprocess;

endchoose_arc;

分频模块:

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

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

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

libraryieee;---——clk_div module--—-——-

use ieee.std_logic_1164.all;

entity clk_divis

 port(a:

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

   b:

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

c:

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

 d:

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

endclk_div;

architectureclk_div_arcofclk_divis

signalclk_10k:

std_logic;

signal clk_200:

std_logic;

signal clk_10:

std_logic;

signalclk_1:

std_logic;

signal m:

integerrange 0to100;

signal n:

integerrange0to50;

signall:

integerrange0to20;

signalg:

integerrange0to10;

begin

p1:

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

begin

if(a'event anda=’1')then

 ifm=99thenm<=0;

 elsem〈=m+1;

  endif;

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

 elseclk_10k<='1';

  end if;

  endif;

endprocess;

p2:

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

begin

if(clk_10k'eventandclk_10k=’1')then

   ifn=49thenn<=0;

elsen<=n+1;

 endif;

   if n<=24thenclk_200<=’0’;

   else clk_200<='1';

    endif;

 endif;

endprocess;

b<=clk_200;

p3:

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

 begin

if(clk_200'eventandclk_200='1')then

  if l=19thenl〈=0;

 else l<=l+1;

  endif;

  ifl<=9thenclk_10〈='0’;

 else clk_10<=’1';

endif;

 endif;

end process;

c<=clk_10;

p4:

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

 begin

  if(clk_10'eventandclk_10='1')then

  if g=9theng<=0;

  else g<=g+1;

   endif;

  ifg〈=4 thenclk_1〈='0';

 elseclk_1<=’1’;

   endif;   endif;

  endprocess;

d<=clk_1;

endclk_div_arc;

显示模块:

——--—-display module-—------

library ieee;

useieee.std_logic_1164。

all;

useieee。

std_logic_signed.all;

useieee。

std_

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2