数字逻辑设计交通灯控制器.docx
《数字逻辑设计交通灯控制器.docx》由会员分享,可在线阅读,更多相关《数字逻辑设计交通灯控制器.docx(16页珍藏版)》请在冰豆网上搜索。
数字逻辑设计交通灯控制器
数字逻辑课程设计报告
交
通
灯
控
制
器
班级:
姓名:
学号:
完成时间:
目录
一、实验目的-------------------------------------3
二、预习要求-------------------------------------3
三、实验要求-------------------------------------3
四、仪器与器材-----------------------------------4
五、层次化设计结构-------------------------------4
1)分频器-------------------------------------4
2)计数器-------------------------------------5
3)控制器-------------------------------------6
4)分位译码器---------------------------------9
5)数码管驱动--------------------------------11
6)七段数字显示------------------------------13
7)顶层模块----------------------------------14
六、系统实现电路---------------------------------17
七、设计过程中出现的问题-------------------------17
八、设计体会总结---------------------------------17
一、实验目的
1、学会应用数字系统方法进行电路设计;
2、进一步提高MaxplusⅡ软件开发应用能力;
3、培养综合实验的能力;
二、预习要求
1、层次化方法设计该交通灯控制器电路;
2、编写VHDL源程序,生成元器件;
3、将各个器件进行组合连线,验证设计交通灯的控制器;
三、实验要求
设计一个交通灯控制器
1、能显示十字路口东西、南北两个方向的红、黄、绿的指示状态
(1)用L16、L15、L14作为东西方向的绿、黄、红灯;
(2)用L1、L2、L3作为南北方向的绿、黄、红灯。
2、能实现正常的倒计时功能
(1)用M6、M5作为东西方向的倒计时显示器,显示时间为红灯35秒、绿灯50秒、黄灯5秒;
(2)用M2、M1作为南北方向的倒计时显示器,实现时间为红灯55秒、绿灯30秒、黄灯5秒。
3、能实现特殊状态的功能
(1)按S1后,能实现特殊状态功能;
(2)显示器M6M5、M2M1闪烁;
(3)计数器停止计数并保持在原来的状态;
(4)东西、南北路口均显示红灯状态;
(5)特殊状态解除后能继续计数;
4、能实现总体清零功能
按下SB后,系统实现总清零,计数器由初始状态计数,对应状态的指示灯亮。
5、使用MaxPlusII10.0软件设计符合以上功能要求的交通灯控制器,并用层次化设计方法设计该电路。
6、控制器、置数器的功能用功能仿真的方法验证,可通过观察有关波形确认电路设计是否正确。
7、完成全部电路设计后在SE-3实验系统上下载,验证设计课题的正确性。
四、仪器与器材
1、开发软件:
MaxPlusII
2、微机
3、ISP实验板
五、层次化设计结构
1、分频器
在实际的电路板上,计数的数码管电路采用了1464赫兹的频率,而这个频率对于计数器和控制器来讲太高了。
为了让显示计数与灯的亮灭保持同步,我使用了一个1464频率的时钟脉冲,同时使用该分频器将高频时钟信号分成低频脉冲,赋予控制器。
程序如下:
LIBRARYIEEE;
USEIEEE.Std_Logic_1164.ALL;
ENTITYFreDeviderIS
PORT
(Clkin:
INStd_Logic;
Clkout:
OUTStd_Logic);
END;
ARCHITECTUREDeviderOFFreDeviderIS
CONSTANTN:
Integer:
=499;
signalcounter:
Integerrange0toN;
signalClk:
Std_Logic;
BEGIN
PROCESS(Clkin)
begin
IFclkin'eventandclkin='1'THEN
IFCounter=Nthen
counter<=0;
Clk<=notclk;
else
counter<=counter+1;
endif;
endif;
endprocess;
clkout<=clk;
end;
2、计数器
计数范围为0-90。
计满90后回到0,开始下一轮计数。
如遇hold=1时,停止计数,红灯闪烁;如遇reset=1时,计数清零,回到初始状态。
程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcounterIS
PORT(clock:
INSTD_LOGIC;
reset:
instd_logic;
Hold:
instd_logic;
countNum:
BuFFeRINTEGERRANGE0TO90);
END;
ARCHITECTUREbehaviorOFcounterIS
BEGIN
process(reset,Clock)
BEGIN
IFReset='1'THEN
countNum<=0;
ELSIFClock'eventandclock='1'THEN
IFHold='1'then
countNum<=countNum;
ELSE
IFcountNum=90THEN
countNum<=0;
ELSE
countNum<=countNum+1;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
END;
3、控制器
控制器的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段译管的分译码电路。
此外,当检测到特殊情况(Hold=‘1’)发生时,无条件点亮红色的发光二极管,并且闪烁。
程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcountrollerIS
PORT(Clock:
INSTD_LOGIC;
Hold:
instd_logic;
CountNum:
inINTEGERRANGE0TO89;
NumA,NumB:
outINTEGERRANGE0TO55;
RedA,GreenA,YellowA:
outstd_logic;
RedB,GreenB,YellowB:
outstd_logic);
END;
ARCHITECTUREbehaviorOFCountrollerIS
BEGIN
process(Clock)
BEGIN
IFClock'eventandClock='1'THEN
IFHold='1'THEN
RedA<='1';
RedB<='1';
GreenA<='0';
GreenA<='0';
YellowA<='0';
YellowB<='0';
ELSIFCountNum<=29THEN
NumA<=30-CountNum;
RedA<='0';
GreenA<='1';
YellowA<='0';
ELSIFCountNum<=34THEN
NumA<=35-CountNum;
RedA<='0';
GreenA<='0';
YellowA<='1';
ELSE
NumA<=90-CountNum;
RedA<='1';
GreenA<='0';
YellowA<='0';
ENDIF;
IFHold='1'THEN
RedA<='1';
RedB<='1';
GreenA<='0';
GreenA<='0';
YellowA<='0';
YellowB<='0';
elsIFCountNum<=34THEN
NumB<=35-CountNum;
RedB<='1';
GreenB<='0';
YellowB<='0';
ELSIFCountNum<=84THEN
NumB<=85-CountNum;
RedB<='0';
GreenB<='1';
YellowB<='0';
ELSe
NumB<=90-CountNum;
RedB<='0';
GreenB<='0';
YellowB<='1';
ENDIF;
ENDIF;
ENDPROCESS;
END;
4、分位译码器
因为控制器输出的倒计时数值要显示2位十进制数,所以在七段数码管的译码电路前要加上分位电路(即将其分为2个1位的十进制数,如56分为5和6,9分为0和9)。
程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYFenweiIS
PORT
(Numin:
INintegerRANGE0TO55;
NumA,NumB:
OUTIntegerRANGE0to9
);
END;
ARCHITECTUREbehaviorOFFenweiIS
BEGIN
process(Numin)
BEGIN
IFNumin>=50THEN
NumA<=5;
NumB<=Numin-50;
ELSIFNumin>=40THEN
NumA<=4;
NumB<=Numin-40;
ELSIFNumin>=30THEN
NumA<=3;
NumB<=Numin-30;
ELSIFNumin>=20THEN
NumA<=2;
NumB<=Numin-20;
ELSIFNumin>=10THEN
NumA<=1;
NumB<=Numin-10;
ELSE
NumA<=0;
NumB<=Numin;
ENDIF;
ENDPROCESS;
END;
程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYFenwei2IS
PORT
(Numin:
INintegerRANGE0TO55;
NumC,NumD:
OUTIntegerRANGE0to9
);
END;
ARCHITECTUREbehaviorOFFenwei2IS
BEGIN
process(Numin)
BEGIN
IFNumin>=50THEN
NumC<=5;
NumD<=Numin-50;
ELSIFNumin>=40THEN
NumC<=4;
NumD<=Numin-40;
ELSIFNumin>=30THEN
NumC<=3;
NumD<=Numin-30;
ELSIFNumin>=20THEN
NumC<=2;
NumD<=Numin-20;
ELSIFNumin>=10THEN
NumC<=1;
NumD<=Numin-10;
ELSE
NumC<=0;
NumD<=Numin;
ENDIF;
ENDPROCESS;
END;
5、数码管驱动
控制公共端为高电平控制相应数码管的亮、灭(共阴极数码管的公共端为高电平时,LED不亮;共阳极的公共端为低电平时,LED不亮)。
程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_unsigned.ALL;
ENTITYdtsmIS
PORT(clk:
inSTD_LOGIC;
hold:
instd_logic;
NumA,NumB,NumC,NumD:
inSTD_LOGIC_VECTOR(3downto0);
segout1:
outSTD_LOGIC_VECTOR(6downto0);
led_sel:
outSTD_LOGIC_VECTOR(3downto0));
ENDdtsm;
architecturebhvofdtsmis
componentbcd_datais
port(
clk:
instd_logic;
fin:
instd_logic;
bcd_data:
inSTD_LOGIC_VECTOR(3downto0);
segout:
outSTD_LOGIC_VECTOR(6downto0));
endcomponent;
signalx:
STD_LOGIC_VECTOR(3downto0);
signalq:
STD_LOGIC_VECTOR(1downto0);
begin
p2:
process(clk)
begin
ifclk'eventandclk='1'then
Q<=Q+'1';
endif;
endprocess;
p3:
process(Q)
begin
caseQis
when"00"=>led_sel<="0001";x<=NumD;
when"01"=>led_sel<="0010";x<=NumC;
when"10"=>led_sel<="0100";x<=NumB;
when"11"=>led_sel<="1000";x<=NumA;
whenothers=>null;
endcase;
endprocess;
u1:
bcd_dataPORTmap(clk,hold,bcd_data=>x,segout=>segout1);
end;
6、七段数字显示
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYbcd_dataIS
PORT
(clk:
instd_logic;
fin:
instd_logic;
bcd_data:
inSTD_LOGIC_VECTOR(3downto0);
segout:
outSTD_LOGIC_VECTOR(6downto0)
);
END;
ARCHITECTUREbehaviorOFbcd_dataIS
signaltime:
integerrange0to255;
begin
process(clk)
BEGIN
ifclk'eventandclk='1'then
if(fin='0')then
time<=0;
else
if(time=255)then
time<=0;
else
time<=time+1;
endif;
endif;
if(time<127)then
casebcd_datais
when"0000"=>segout<="1111110";
when"0001"=>segout<="0110000";
when"0010"=>segout<="1101101";
when"0011"=>segout<="1111001";
when"0100"=>segout<="0110011";
when"0101"=>segout<="1011011";
when"0110"=>segout<="1011111";
when"0111"=>segout<="1110000";
when"1000"=>segout<="1111111";
when"1001"=>segout<="1111011";
whenothers=>null;
ENDCASE;
else
segout<="0000000";
endif;
endif;
ENDPROCESS;
END;
7、顶层模快
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
entitydingcenis
port(
cp:
instd_logic;
reset,hold:
instd_logic;
ra,ga,ya,rb,yb,gb:
outstd_logic;
s:
outstd_logic_vector(6downto0);
l:
outstd_logic_vector(3downto0)
);
end;
Architectureaofdingcenis
componentcountroller
PORT(Clock:
INSTD_LOGIC;
Hold:
instd_logic;
CountNum:
inINTEGERRANGE0TO89;
NumA,NumB:
outINTEGERRANGE0TO55;
RedA,GreenA,YellowA:
outstd_logic;
RedB,GreenB,YellowB:
outstd_logic);
ENDcomponent;
componentcounter
PORT(clock:
INSTD_LOGIC;
reset:
instd_logic;
Hold:
instd_logic;
countNum:
BuFFeRINTEGERRANGE0TO90);
ENDcomponent;
componentdtsm
PORT(clk:
inSTD_LOGIC;hold:
instd_logic;
NumA,NumB,NumC,NumD:
inSTD_LOGIC_VECTOR(3downto0);
segout1:
outSTD_LOGIC_VECTOR(6downto0);
led_sel:
outSTD_LOGIC_VECTOR(3downto0));
ENDcomponent;
componentFenwei
PORT
(Numin:
INintegerRANGE0TO55;
NumA,NumB:
OUTIntegerRANGE0to9
);
ENDcomponent;
componentFenwei2
PORT
(Numin:
INintegerRANGE0TO55;
NumC,NumD:
OUTIntegerRANGE0to9
);
ENDcomponent;
componentFreDevider
PORT
(Clkin:
INStd_Logic;
Clkout:
OUTStd_Logic);
ENDcomponent;
signalcp1:
std_logic;
signalnuma1,numb1:
integer;
signalcNum:
integer;
signalND1:
STD_LOGIC_VECTOR(3downto0);
signalNa1:
STD_LOGIC_VECTOR(3downto0);
signalNb1:
STD_LOGIC_VECTOR(3downto0);
signalNC1:
STD_LOGIC_VECTOR(3downto0);
begin
u1:
countrollerportmap(cp1,hold,cNum,numa1,numb1,ra,ga,ya,rb,gb,yb);
u2:
counterportmap(cp1,reset,cNum);
u3:
dtsmportMap(cp,hold,Na1,Nb1,NC1,ND1,s,l);
u4:
FenweiportMap(numa1,Na1,Nb1);
u5:
Fenwei2portmap(numb1,NC1,ND1);
u6:
FreDeviderportmap(cp,cp1);
end;
六、系统实现电路
七、设计过程中出现的问题
八、设计体会总结