数字电路课程设计用VHDL语言设计交通灯.docx
《数字电路课程设计用VHDL语言设计交通灯.docx》由会员分享,可在线阅读,更多相关《数字电路课程设计用VHDL语言设计交通灯.docx(22页珍藏版)》请在冰点文库上搜索。
数字电路课程设计用VHDL语言设计交通灯
数字电路课程设计报告
院系:
电气信息工程学院
班级:
08测控2班
学号:
********
姓名:
董亮
合作:
虞波
指导教师:
翟丽芳
2010年12月10日
引言······················································2
一设计任务和设计要求·········································2
二电路工作原理及方案设计································3
三软件设计与调试········································4
1.分频模块的设计及仿真图·································4
2.控制器设计及仿真图····································6
3.计数器的设计及仿真图···································7
4.分位模块的设计·······································9
5.数码管驱动设计·······································10
6.顶层文件设置·········································14
四硬件焊接与组装调试···································15
五心得体会·············································16
六参考文献·············································16
交通灯控制电路设计
引言:
随着社会的发展以及人类生活水平的提高,基于CPLD的EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制用计算机等领域的重要性日益突出。
如今,交通的问题日益突出,单单依靠人力来指挥交通已经不可行了,所以,设计交通灯来完成这个需求就显的越加迫切了。
为了确保十字路口的行人和车辆顺利、畅通地通过,往往采用电子控制的交通信号来进行指挥。
以下就是运用数字电子设计出的交通灯。
本程序设计的是交通灯的设计。
采用EDA作为开发工具,VHDL语言为硬件描述语言,quartusII作为程序运行平台,所开发的程序通过调试运行、波形仿真验证,实现设计目标。
一.设计任务与设计要求
1.设计任务
设计一个基于FPGA的十字路口交通控制器,假设南北方向和东西方向,两个方向分别设置红灯、绿灯、黄灯三盏灯,设置一组倒计时显示器,用以指挥车辆和行人有序的通行。
红灯亮表示直行车辆禁行;绿灯亮表示直行车辆可以通行;黄灯亮表示直行车辆即将禁行;倒计时显示器用来显示允许通行或禁止通行的时间。
尽量采用层次化设计。
2.设计要求
在十字路口南北和东西两个方向各设一组红灯、黄灯、绿灯。
设一组倒计时显示器。
自动控制:
设置一组数码管,以倒计时的方式显示允许通行或禁止通行的时间,南北方向为主干道,红灯、黄灯和绿灯显示时间分别是55、5s、50s。
东西方向为次干道,红灯、黄灯绿灯显示时间分别为35s、5s、30s。
特殊功能:
(1)紧急状态时,手动拨动紧急开关,主干道以及次干道都显示红灯,禁止通行,并由蜂鸣其报警。
(2)黄灯显示信号为脉冲信号,使得黄灯为“一闪一闪”的显示状态。
二.电路工作原理及方案设计
图1总体设计框图
在VHDL设计描述中,采用自顶向下的设计思路,首先要描述顶层的接口,上面的描述已经规定了交通灯控制的输入输出信号:
输入信号:
外部时钟信号clk。
LED在自顶向下的VHDL设计描述中,通常把整个设计的系统划分为几个模块,然后采用结构描述方式对整个系统进行描述。
通过上面的分析,不难得知可以把交通灯控制系统划分为4个模块:
时钟分频模块,计数模块,控制模块,分位译码模块。
分频电路:
输入较高频率脉冲用分频电路的到较第频率的时钟信号,本电路通过二次分平分别得到1Hz的时钟信号。
控制器电路:
根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段译码管的分位译码电路。
当检测到手动控制信号(hold=’1’)时,执行特殊控制;
计数器电路:
下一个时钟沿回复到0,开始下一轮计数。
当检测到特殊情况(HOLD=‘1’)发生是,计数器暂停计数。
分位译码电路:
因为控制器输出的倒计时数值可能是1位或者2位十进制数,所以在七段数码管的译码电路前要加上分位电路(即将其分为2个1位的十进制数)。
七段数码管的译码电路根据控制电路的控制信号,驱动交通灯的显示,通过输入二进制数值,输出信号点亮二极管,我们用的是共阴极数码管,因此译码电路输出逻辑数值‘1’点亮二极管,译码电路输出逻辑数值‘0’熄灭二极管。
三.软件设计与调试
图2模块化设计原理图
1.分频模块的设计及仿真图
分频器1实现的是将高频时钟信号转换成底频的时钟信号,用于触发控制器、计数器和扫描显示电路。
该分频器实现的是1000分频,将50M赫兹的时钟信号分频成50000赫兹的时钟信号。
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
IFrising_edge(Clkin)THEN
IFCounter=Nthen
counter<=0;
Clk<=notclk;
else
counter<=counter+1;
endif;
endif;
endprocess;
clkout<=clk;
end;
分频器2实现的是50000分频,将50000赫兹的时钟信号分频成1赫兹的时钟信号。
LIBRARYIEEE;
USEIEEE.Std_Logic_1164.ALL;
ENTITYFreDevider1IS
PORT
(Clkin:
INStd_Logic;
Clkout:
OUTStd_Logic);
END;
ARCHITECTUREDevider1OFFreDevider1IS
CONSTANTN:
Integer:
=24999;
signalcounter:
Integerrange0toN;
signalClk:
Std_Logic;
BEGIN
PROCESS(Clkin)
begin
IFrising_edge(Clkin)THEN
IFCounter=Nthen
counter<=0;
Clk<=notclk;
else
counter<=counter+1;
endif;
endif;
endprocess;
clkout<=clk;
end;
2.控制器设计及仿真图
控制器的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段译管的分译码电路。
此外,当检测到特殊情况(Hold=‘1’)发生时,无条件点亮红色的发光二极管。
功能:
控制发光二极管的亮、灭,以及输出倒计时数值给七段译码管的分位译码电路。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcountrollerIS
PORT(Clock:
INSTD_LOGIC;
Hold:
instd_logic;
CountNum:
inINTEGERRANGE0TO89;
NumA:
outINTEGERRANGE0TO90;
RedA,GreenA,YellowA:
outstd_logic;
RedB,GreenB,YellowB:
outstd_logic);
END;
ARCHITECTUREbehaviorOFCountrollerIS
BEGIN
process(Clock)
BEGIN
IFfalling_edge(Clock)THEN
IFHold='1'THEN
RedA<='1';
RedB<='1';
GreenA<='0';
GreenA<='0';
YellowA<='0';
YellowB<='0';
ELSIFCountNum<=54THEN
NumA<=55-CountNum;
RedA<='0';
GreenA<='1';
YellowA<='0';
ELSIFCountNum<=59THEN
NumA<=60;
RedA<='0';
GreenA<='0';
YellowA<='1';
ELSE
NumA<=90-CountNum;
RedA<='1';
GreenA<='0';
YellowA<='0';
ENDIF;
IFCountNum<=54THEN
RedB<='1';
GreenB<='0';
YellowB<='0';
ELSIFCountNum<=84THEN
RedB<='0';
GreenB<='1';
YellowB<='0';
ELSe
RedB<='0';
GreenB<='0';
YellowB<='1';
ENDIF;
endif;
ENDPROCESS;
END;
3.计数器的设计及仿真图
这里计数器的计数范围为0—90S,下一个时钟沿回复到0,开始下一轮计数.此外,当检测到特殊情况(Hold=‘1‘)发生时,计数器暂停计数。
程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcounterIS
PORT(clock:
INSTD_LOGIC;
Hold:
instd_logic;
countNum:
BuFFeRINTEGERRANGE0TO90);
END;
ARCHITECTUREbehaviorOFcounterIS
BEGIN
Process(Clock)
BEGIN
IFrising_edge(Clock)THEN
IFHold='1'then
countNum<=countNum;
ELSE
IFcountNum=90THEN
countNum<=0;
ELSE
countNum<=countNum+1;
ENDIF;
ENDIF;
ENDPROCESS;
END;
4.分位模块的设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYFenweiIS
PORT
(Numin:
INintegerRANGE0TO90;
NumA,NumB:
OUTIntegerRANGE0to9
);
END;
ARCHITECTUREbehaviorOFFenweiIS
BEGIN
process(Numin)
BEGIN
IFNumin>=60THEN
NumA<=10;
NumB<=10;
elsIFNumin>=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;
5.数码管驱动设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYbcd_dataIS
PORT
(bcd_data:
inSTD_LOGIC_VECTOR(3downto0);
segout:
outSTD_LOGIC_VECTOR(6downto0)
);
END;
ARCHITECTUREbehaviorOFbcd_dataIS
BEGIN
process(bcd_data)
BEGIN
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<="0011111";
when"0111"=>segout<="1110000";
when"1000"=>segout<="1111111";
when"1001"=>segout<="1110011";
when"1010"=>segout<="0000000";
whenothers=>null;
ENDCASE;
ENDPROCESS;
END;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_unsigned.ALL;
ENTITYdtsmIS
PORT(clk:
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(bcd_data:
inSTD_LOGIC_VECTOR(3downto0);
segout:
outSTD_LOGIC_VECTOR(6downto0));
endcomponent;
signalx:
STD_LOGIC_VECTOR(3downto0);
signalq:
STD_LOGIC_VECTOR(1downto0);
begin
p1:
process(clk)
begin
ifclk'eventandclk='1'then
Q<=Q+'1';
endif;
endprocess;
p2:
process(Q)
begin
caseQis
when"00"=>led_sel<="1110";x<=NumD;
when"01"=>led_sel<="1101";x<=NumC;
when"10"=>led_sel<="1011";x<=NumB;
when"11"=>led_sel<="0111";x<=NumA;
whenothers=>null;
endcase;
endprocess;
u1:
bcd_dataPORTmap(bcd_data=>x,segout=>segout1);
end;
6.顶层文件设置
libraryieee;
useieee.std_logic_1164.all;
entityjiaotongdengis
port(clk1:
instd_logic;
reset1:
instd_logic;
hold1:
instd_logic;
segout2:
outstd_logic_vector(6downto0);
led_sel1:
outstd_logic_vector(3downto0);
reda1,yellowa1,greena1:
outstd_logic;
redb1,yellowb1,greenb1:
outstd_logic);
endjiaotongdeng;
architectureaa11ofjiaotongdengis
componentFreDevider
PORT
(Clkin:
INStd_Logic;
Clkout:
OUTStd_Logic);
ENDcomponent;
componentFreDevider1
PORT
(Clkin:
INStd_Logic;
Clkout:
OUTStd_Logic);
ENDcomponent;
componentcountroller
PORT(Clock:
INSTD_LOGIC;
Hold:
instd_logic;
CountNum:
inINTEGERRANGE0TO89;
NumA:
outINTEGERRANGE0TO90;
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;
componentFenwei
PORT
(Numin:
INintegerRANGE0TO90;
NumA,NumB:
OUTIntegerRANGE0to9
);
ENDcomponent;
componentdtsm
PORT(clk:
inSTD_LOGIC;
NumA,NumB:
inIntegerRANGE0to9;
segout1:
outSTD_LOGIC_VECTOR(6downto0);
led_sel:
outSTD_LOGIC_VECTOR(3downto0));
ENDcomponent;
signala,b:
std_logic;
signalc:
INTEGERRANGE0TO89;
signald:
INTEGERRANGE0TO90;
signale,f:
IntegerRANGE0to9;
begin
u1:
FreDeviderportmap(clkin=>clk1,clkout=>a);
u2:
FreDevider1portmap(clkin=>a,clkout=>b);
u3:
counterportmap(clock=>b,reset=>reset1,hold=>hold1,countnum=>c);
u4:
countrollerportmap(clock=>b,hold=>hold1,countnum=>c,numa=>d,reda=>reda1,greena=>greena1,yellowa=>yellowa1,redb=>redb1,greenb=>greenb1,yellowb=>yellowb1);
u5:
fenweiportmap(numin=>d,numa=>e,numb=>f);
u6:
dtsmportmap(clk=>clk1,numa=>e,numb=>f,segout1=>segout2,led_sel=>led_sel1);
endaa11;
四.硬件焊接与组装调试
按照如下图所示的电路图,在通用电路焊接板上合理布置各个元器件,进行焊接布线。
图3硬件焊接电路图
安装焊接完成后,仔细检查电路,是否有误。
若与电路图不符,应及时排除错误。
一切就绪后,将与FPGA对应的引脚使用杜邦线连接,连接完毕后,检查电源极性,避免反接。
确认无误后,接通电源,观察实验结果。
首先我们完成的基本的功能,只是简单的倒计时显示,然后我们可以进一步修改我们的VHDL语言程序,重新烧入FPGA,以完善我们的设计。
五.心得体会
通过几天的课程设计,我对EDA技术、VHDL等系列知识都有了一定的了解。
使用EDA技术开发页面的能力也有了很大提高。
EDA设计我们感觉程序调试最重要,试验软件、硬件熟悉其次。
直到没有错误。
若与理想的不同,再查看程序,有无原理上的编辑错误或没有查出的输入错误。
都通过可以进行管脚配对,把程序烧入芯片,在实物上看结果,从显示中得出还需改正的地方,再去改程序。
必须注意每改一次都要编译,重新烧入。
我们采用模块化编程,模块化接线,再编译总原理图,思路比较清楚。
有的模块可以供其它任务通用。
课程设计对学生而言是其对所学课程内容掌握情况的一次自我验证,从而有着极其重要的意义。
通过课程设计能提高学生对所学知识的综合应用能力,能全面检查并掌握所学内容,在这学期的课程设计中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,我们学会了很多学习的方法。
而这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
另外,我还学到了一个人的力量毕竟有限,但是团队的力量势不可挡,我们不能局限,要学会合作。
这次课程设计虽然结束了,相信以后我们会以更加积极的态度对待我们的学习、对待我们的生活。
我们的激情永远不会结束,相反,我们会更加努力,努力的去弥补自己的缺点,发展自己的优点,去充实自己,只有在了解了自己的长短之后,我们会更加珍惜拥有的,更加努力的去完善它。
六.参考文献
(1)潘松,黄继业.《EDA技术使用教程》.科学出版社.2006.
(2)潘松,黄继业.《EDA技术与VHDL(第三版)》.清华大学出版社.2009
(3)徐志军,徐光辉.《CPLD/FPGA的开发与应用》.电子工业出版社.2002.
(4)阎石.《数字电子技术基础(第五版)》.高等教育出版社.2005.