交通灯的控制器Word文档格式.docx
《交通灯的控制器Word文档格式.docx》由会员分享,可在线阅读,更多相关《交通灯的控制器Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
1.基本功能:
(1)南北和东西方向各有一组绿,红,黄灯,各自的持续时间分别为20s,25s,5s;
(2)当有特殊情况时,两个方向均为红灯,计时暂停,当特殊情况结束后,控制器恢复原来状态,继续正常工作。
(3)用两组数码管,以倒计时方式显示两个方向允许通行或禁止通行的剩余时间。
2.扩充功能:
当绿大灯亮时,允许左拐
第2章交通灯控制器的设计思想
2.1硬件描述
2.1.1输入电路
(1)在开始计时之前的等待状态,复位键reset接低电位,接通电源后,首先要将它接高电位,表示计时开始。
(2)当按一下(on_off)键,表示紧急情况发生,两个方向均为红灯亮,计时停止,当再次按下(on_off)键时,控制器恢复原来状态,正常工作。
2.1.2输出电路
(1)由于东西和南北方向都要显示时间,因此需要4个数码管,这样在设计中就需要四条输出线choose4,用来选通指定一个LED七段显示数码管。
(2)显示器的每一位都采用LED七段显示数码管进行显示,每一个LED七段显示数码管都要有七条输出线控制,一共使用4个七段数码管,故输出电路使用四个七位输出信号:
showtime1,showtime2,showtime3,showtime4。
(3)东西和南北方向都有交通灯亮的情况,故输出电路中要有两个状态控制信号state1,state2分别控制东西和南北的灯,每个方向上有4个灯(增加了左、右转弯显示控制功能),所以state1,state2的类型应该是4位数组型的。
外部电路图如下:
2.2软件描述
(1)在VHDL设计描述中,采用自顶向下的设计思路,该思路,首先要描述顶层的接口,上面的描述已经规定了交通灯控制的输入输出信号:
输入信号:
复位开关信号reset;
紧急情况控制信号on_off;
外部时钟信号clk。
输出信号:
LED七段显示数码管的选通信号choose4(3downto0);
LED七段显示数码管的输出信号showtime1(6downto0),showntime2(6downto0),showtime3(6downto0),showtome4(6downto0);
交通灯状态控制信号state1(3downto0),state2(3downto0)。
(2)由于紧急情况控制信号是采用按键的输入方式,其产生时刻和持续时间的长短是随机不定的,且存在因开关簧片反弹引起的电平抖动现象,因此必须在每个开关后面安排一个消抖和同步化电路模块,以保证系统能捕捉到输入脉冲,故需要有防抖动的模块。
由于外部时钟信号clk的频率为1MHz,而实际需要的内部计时时钟频率为1Hz,提供给消抖同步电路的频率为50Hz(满足按键)和提供给产生选通信号电路的时钟频率为200Hz(满足视觉暂留效应)。
当正常计时开始后,需要进行定时计数操作,由于东西和南北两个方向上的时间显示器是由两个LED七段显示数码管组成的,因此需要产生两个2位的计时信息:
2个十位信号,2个个位信号,这个定时计数操作可以由一个定时计数器来完成,又因为交通灯的状态变化是在计时为0的情况下才能进行的,因此需要一个计时电路来产生使能信号,因此定时计数的功能就是用来产生2个2位计时信息和使能信号。
另外还需要将时间显示出来,为了节省资源,我采用了循环点亮LED七段显示数码管的方法来显示计时输出。
通过信号choose4(3downto0)来对4个LED七段显示数码管进行选择。
由于不能使用7448自动译码集成电路,故在LED七段显示数码管显示时间时,要把计时结果转换为七段码输出到相应的LED七段显示数码管上,因此还需要一个转换电路。
交通灯状态控制也需要一个电路,当有使能信号及无紧急情况下,交通灯状态不发生变化,有紧急情况时,两个方向上均为红灯亮,紧急情况消除后,回到原来状态,无使能信号时,交通灯状态不变。
第3章程序模块及仿真波形
3.1总体电路图
3.2各模块详细说明
(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):
去抖后的紧急情况提示信号on_off0;
定时计时时钟信号clk2;
使能信号timel,times;
东西方向交通灯状态控制信号state1(3downto0);
南北方向交通灯状态控制信号state2(3downto0);
交通灯状态提示信号state(1downto0)。
3.3仿真波形
选通模块图
去抖模块图
分频模块图
计时模块图
控制模块图
第4章心得体会及故障问题分析
体会:
这次综合实验要求很高,我在思考和设计上花了不少时间,其中收获也是不少。
(1)拿到一个project后,不要急于写程序,首先要搞清楚要干什么,完成什么功能,分几部分完成,每部分完成什么功能,各部分之间的联系。
如果采用的是自顶向下的设计思想,那么顶层的设计就很重要,顶层设计好后,下面各部分写起来就比较清楚容易了。
一旦出现问题,也好检查错误出在什么地方,哪一部分有问题,就进行相应的改动。
(2)在编程过程中,思路要清楚,明白要实现的功能,然后根据实现的功能一步一步的编写。
而且要采用各个击破的办法,先实现下层部分,再整体实现。
(3)编下层时,不用急于仿真,等整体编译成功后,先进行总体仿真,看出现的错误在什么地方,这个地方是由哪个部分控制的,然后再对该部分进行仿真,看有没有问题。
(4)编译成功后,不要急于下载,一定要先仿真,根据仿真波形判断是否达到要求。
一般仿真成功后,只要电路连接没问题,下载后就没什么问题了。
参考文献
[l]《基于QuartusⅡ的FPGA/CPLD设计》电子工业出版社
[2]《CPLD系统设计技术入门与应用》电子工业出版社
[3]《EDA技术基础》湖南大学出版社
[4]沈明山《EDA技术及可编程器件应用实训》科学出版社
[5]朱正伟《EDA技术及应用》清华大学出版
程序清单:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitytracficis
port(reset:
instd_logic;
clk:
showtime1,showtime2,showtime3,showtime4:
outstd_logic_vector(6downto0);
choose4:
outstd_logic_vector(3downto0);
on_off:
state1,state2:
outstd_logic_vector(3downto0));
endtracfic;
architecturesystemoftracficis
componentkeyin
port(a,b:
instd_logic;
c:
outstd_logic);
endcomponent;
componenttime
port(a,b,k:
c:
instd_logic_vector(1downto0);
d,e,f,g:
outstd_logic_vector(3downto0);
j,h:
componentchoose
port(a:
b:
outstd_logic_vector(3downto0));
componentdisplay
instd_logic_vector(3downto0);
outstd_logic_vector(6downto0));
componentclk_div
b,c,d:
componentkeep
port(a,b,c,g,j:
d,e:
f:
outstd_logic_vector(1downto0));
signalon_off0:
std_logic;
signalstate:
std_logic_vector(1downto0);
signalclk0,clk1,clk2:
signaleq0,sq0:
std_logic_vector(3downto0);
signaleq1,sq1:
signaltimel,times:
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;
entitykeyinis
port(A,B:
C:
endkeyin;
architecturekeyin_arcofkeyinis
componentkand2
endcomponent;
componentkdf
C,D:
componentknand2
signalTMP1,TMP2,TMP3,TMP4,TMP5,TMP6:
begin
u0:
knand2portmap(A,TMP1,TMP2);
knand2portmap(TMP2,TMP3,TMP1);
U2:
kdfportmap(TMP2,B,TMP4,TMP3);
U3:
kdfportmap(TMP4,B,TMP6,TMP5);
kand2portmap(TMP4,TMP5,C);
endkeyin_arc;
---twoinputsandgatedescription
entitykand2is
endkand2;
architecturekand2_arcofkand2is
C<
=AandB;
endkand2_arc;
---endoftwoinputsandgatedescription
---twoinputsand_notgatedescription
entityknand2is
endknand2;
architectureknand2_arcofknand2is
=not(AandB);
endknand2_arc;
---endoftwoinputsand_notgatedescription
---Dtriggerdescription
entitykdfis
endkdf;
architecturekdf_arcofkdfis
process(B)
if(B'
eventandB='
1'
)thenC<
=A;
D<
=notA;
endif;
endprocess;
endkdf_arc;
entitychooseis
endchoose;
architecturechoose_arcofchooseis
signalm:
integerrange0to3;
process(a)
begin
if(a'
eventanda='
)then
if(m=3)thenm<
=0;
elsem<
=m+1;
casemiswhen0=>
b<
="
0111"
;
when1=>
1011"
when2=>
1101"
when3=>
1110"
endcase;
endprocess;
endchoose_arc;
useieee.std_logic_1164.all;
entityclk_divis
outstd_logic;
d:
endclk_div;
architectureclk_div_arcofclk_divis
signalclk_10k:
signalclk_200:
signalclk_10:
signalclk_1:
signalm:
integerrange0to100;
signaln:
integerrange0to50;
signall:
integerrange0to20;
signalg:
integerrange0to10;
p1:
process(a)
ifm=99thenm<
if(m<
=49)thenclk_10k<
='
0'
elseclk_10k<
p2:
process(clk_10k)
if(clk_10k'
eventandclk_10k='
ifn=49thenn<
elsen<
=n+1;
ifn<
=24thenclk_200<
elseclk_200<
=clk_200;
p3:
process(clk_200)
if(clk_200'
eventandclk_200='
ifl=19thenl<
elsel<
=l+1;
ifl<
=9thenclk_10<
elseclk_10<
c<
=clk_10;
p4:
process(clk_10)
if(clk_10'
eventandclk_10='
ifg=9theng<
elseg<
=g+1;
ifg<
=4thenclk_1<
elseclk_1<
endif;
d<
=clk_1;
endclk_div_arc;
useieee.std_logic_signed.all;
entitydisplayis
enddisplay;
architecturedisplay_arcofdisplayis
signala0:
process(a0)
a0<
=a;
casea0iswhen"
0000"
=>
0111111"
when"
0001"
0000110"
0010"
1011011"
0011"
1001111"
0100"
1100110"
0101"
1101101"
0110"
1111101"
0000111"
1000"
1111111"
1001"
1101111"
whenothers=>
ZZZZZZZ"
enddisplay_arc;
entitykeepis
port(a,b,c,g,j:
d,e:
f:
outstd_logic_vector(1downto0));
endkeep;
architecturekeep_arcofkeepis
typestate_typeis(s0,s1,s2,s3,s4);
signalcurrent_state:
state_type;
signalnew_state:
b