FPGA交通灯课程设计.docx
《FPGA交通灯课程设计.docx》由会员分享,可在线阅读,更多相关《FPGA交通灯课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
FPGA交通灯课程设计
FPGA课程设计论文
题目:
学院:
专业:
学生姓名:
指导教师:
1FPGA/CPLD概述
随着世界范围内城市化和机动化进程的加快,城市交通越来越成为一个全球化的问题。
城市交通基础设施供给滞后于高速机动化增长需求,道路堵塞日趋加重,交通事故频繁,环境污染加剧等问题普遍存在。
目前,全国大中城市普遍存在着道路拥挤、车辆堵塞、交通秩序混乱的现象,交通事故频发,这给人民的生命财产安全带来了极大的损失。
如何解决城市交通问题已成为全社会关注的焦点和大众的迫切呼声。
探究城市交通发展中存在问题的原因,无论是从宏观上还是从微观上分析,其根本原因在于城市交通系统的管理机制不适应。
城市交通控制系(UTC,UrbanTrafficControlSystem)是现代城市智能交通系统(IDJ,Intelligenttransportsystem)的组成之一,主要用于城市道路交通的控制与管理。
城市平交路口实现交通信号控制是城市交通管理现代化的基本标志之一,是提高交通管理效能的重要技术手段。
路口信号控制器是控制交叉路口交通信号的设备,它是交通信号控制的重要组成部分。
各种交通控制方案,最终都要由路口信号控制器来实现。
为了确保十字路口的行人和车辆顺利、畅通地通过,往往采用电子控制的交通信号来进行指挥。
伴随着社会的发展以及人类生活水平的提高,汽车的数量在不断增加,EDA技术的发展和应用领域也在不断的扩大与深入,机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域的重要性日益突出。
利用EDA技术设计交通灯来完成这个需求就显的更加迫切,同样也是非常的实用和合理。
FPGA(现场可编程门阵列)和CPLD(复杂可编程逻辑器件)都是可编程逻辑器件,他们是在PAL,GAL等逻辑器件的基础上发展起来的。
同以往的PAL,GAL相比较FPGA/CPLD的规模比较大,它可以替代几十甚至几千块通用IC芯片。
这样的FPGA/CPLD上就是一个子系统部件。
这种芯片收到世界范围内电子工程设计人员的广泛关注和普遍欢迎。
比较典型的就是Altera公司和Xilinx公司的CPLD器件系列和FPGA器件系列,他们开发较早,占用了较大的PLD市场。
FPGA/CPLD芯片都是特殊的ASIC芯片,除了具有ASIC的特点外,还具有以下几个优点:
随着VLSI(超大集成电路)工艺的不断提高单一芯片内部可以容纳上百万个晶体管,FPGA/CPLD芯片的规模也越来越大,其单片逻辑门数已达上百万门,它所实现的功能也越来越强,同时也可以实现系统集成,即片上系统SOC。
FPGA/CPLD芯片在出厂之前都做过百分之百的测试,不需要设计人员承担芯片风险和费用,设计人员只需在自己的实验室就可以通过相关的软硬件环境来完成芯片的最终功能设计。
所以,FPGA/CPLD的资金投入就少,减少了潜在的花费。
用户可以反复的编程,擦除,使用或者在外围电路不动的情况下用不同软件就可实现不同的功能。
FPGA/CPLD软件包中有各种输入工具和仿真工具,及版图设计工具和编程器等全线产品,电路设计人员在很短的时间内就可完成电路的输入,编译,优化,仿真,直至最后芯片的制作。
当电路有少量的改动,更能显示FPGA/CPLD的优势。
在线可编程技术(ISP)使得使用FPGA/CPLD的产品可以做到远程升级。
2系统分析与总体方案
2.1系统分析
在VHDL设计描述中,采用自顶向下的设计思路,首先要描述顶层的接口,上面的描述已经规定了交通灯控制的输入输出信号:
输入信号:
外部时钟信号clk。
LED在自顶向下的VHDL设计描述中,通常把整个设计的系统划分为几个模块,然后采用结构描述方式对整个系统进行描述。
通过上面的分析,不难得知可以把交通灯控制系统划分为4个模块:
时钟分频模块,计数模块,控制模块,分位译码模块。
分频电路:
输入较高频率脉冲用分频电路的到较第频率的时钟信号,本电路通过二次分平分别得到1Hz的时钟信号。
控制器电路:
根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段译码管的分位译码电路。
当检测到手动控制信号(hold=’1’)时,执行特殊控制;
计数器电路:
下一个时钟沿回复到0,开始下一轮计数。
当检测到特殊情况(HOLD=‘1’)发生是,计数器暂停计数。
分位译码电路:
因为控制器输出的倒计时数值可能是1位或者2位十进制数,所以在七段数码管的译码电路前要加上分位电路(即将其分为2个1位的十进数)。
译码电路:
七段数码管的译码电路根据控制电路的控制信号,驱动交通灯的显示,通过输入二进制数值,输出信号点亮二极管,我们用的是共阴极数码管,因此译码电路输出逻辑数值‘1’点亮二极管,译码电路输出逻辑数值‘0’熄灭二极管。
2.2设计的总体方案
根据设计要求和系统所具有功能,并参考相关的文献资料经行方案设计画出如下所示的十字路口交通灯控制器系统框图,及为设计的总体方案,框图如下图3.1所示:
图2.2系统的框图
3软件设计与调试
一个完整的VHDL语言程序通常包括实体(Entity)、构造体、配置、包集合(Package)和库(Library)5个部分组成。
下面结合实际的程序来加以说明。
1.顶层文件设计及程序代码
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityjiaotongdengis
port(clk1:
instd_logic;
rst:
instd_logic;
hold1:
instd_logic;
segout2:
outstd_logic_vector(7downto0);
led_sel1:
outstd_logic_vector(1downto0);
reda1,yellowa1,greena1:
outstd_logic;
redb1,yellowb1,greenb1:
outstd_logic);
endjiaotongdeng;
architectureBehavioralofjiaotongdengis
componentFreDecider
PORT
(clk:
INStd_Logic;
rst:
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;
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(7downto0);
led_sel:
outSTD_LOGIC_VECTOR(1downto0));
ENDcomponent;
signalb,rst1:
std_logic;
signalc:
INTEGERRANGE0TO89;
signald:
INTEGERRANGE0TO90;
signale,f:
IntegerRANGE0to9;
begin
u1:
FreDeciderportmap(clk=>clk1,rst=>rst,clkout=>b);
u2:
counterportmap(clock=>b,hold=>hold1,countnum=>c);
u3:
countrollerport
map(clock=>b,hold=>hold1,countnum=>c,numa=>d,reda=>reda1,greena=>greena1,yellowa=>yellowa1,redb=>redb1,greenb=>greenb1,yellowb=>yellowb1);
u4:
fenweiportmap(numin=>d,numa=>e,numb=>f);
u5:
dtsm
portmap(clk=>clk1,numa=>e,numb=>f,segout1=>segout2,led_sel=>led_sel1);
endBehavioral;
2.控制器设计与仿真图
控制器的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒
计时数值给七段译管的分译码电路。
此外,当检测到特殊情况(Hold=‘1’)发生时,无条件点亮红色的发光二极管。
功能:
控制发光二极管的亮、灭,以及输出倒
计时数值给七段译码管的分位译码电路。
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycountrolleris
PORT(Clock:
INSTD_LOGIC;
Hold:
instd_logic;
CountNum:
inINTEGERRANGE0TO89;
NumA:
outINTEGERRANGE0TO90;
RedA,GreenA,YellowA:
outstd_logic;
RedB,GreenB,YellowB:
outstd_logic);
ENDcountroller;
ARCHITECTUREBehavioralOFcountrollerIS
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;
endBehavioral;
3.分频电路的设计及仿真图
利用计数器,对50Mhz的时钟进行计数到50M,得
到1Hz的时钟
4.计数器的设计及仿真图
计数器的计数范围为0—120S,下一个时钟沿回复到0,开始下一轮计数.此外,当检测到特殊情况(Hold=‘1‘)发生时,计数器暂停计数。
5.分位模块的设计及仿真图
功能:
将数字分为个位和十位,然后输出到数码管驱动模块
6.数码管驱动模块的设计及仿真图
包含了数码管译码模块和使能控制模块
4个人心得
FAPGA课程设计就要结束了,这次课程设计历时近一个星期,通过这个星期的学习,发现了自己的很多不足,发现了很多知识上的漏洞。
同时也看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。
这次课程设计让我学到了很多,不仅是巩固了先前学的EDA技术的理论知识,而且也培养了我的动手能力,更令我的创造性思维得到拓展。
在课程设计中一个人的力量是远远不够的,真正的完成任务需要共同的智慧与劳动,团结协作是我们成功的一项非常重要的保证。
在这个过程中,我也曾经因为实践经验的缺乏失落过,也曾经仿真成功而热情高涨。
还有一点是我们做任何事情都无法缺少的,那就是细心认真。
此次设计我们就深深地体会到了,由于编程的时候没有做到足够的细心,导致一串代码弄混了。
但是密密麻麻的英文字母混在一起,我始终没有发现。
最终在调试的时候,就出现了问题。
只知道出现了问题,就是不知道到问题的根源在哪里,好长时间都没有找出问题的所在。
这也让我真正的明白了,科学的严谨性,它不允许出半点差错,否则后果会是比较麻烦的。
做其他事情也一样,都需要我们付出足够的认真去对待,才能顺利的完成。
生活就是这样,汗水预示着结果也见证着收获。
劳动是人类生存生活永恒不变的话题。
虽然我这次做的课程设计不是非常的复杂,但在设计和仿真的过程中,我们也遇到了不少的困难,回首整个过程,却受益匪浅。
对我而言,知识上的收获重要,精神上的丰收更加可喜。
让我知道了学无止境的道理。
我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。
挫折是一份财富,经历是一份拥有。
这次课程设计必将成为我人生旅途上一个非常美好的回忆!
5附录
1.部分模块源程序代码
1.1分频器模块:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityFreDecideris
Port(clk:
inSTD_LOGIC;
rst:
inSTD_LOGIC;
clkout:
outSTD_LOGIC);
endFreDecider;
architectureBehavioralofFreDecideris
signalsec1:
std_logic_vector(9downto0);--------------------
signalsec2:
std_logic_vector(9downto0);------jishiyimiao---
signalsec3:
std_logic_vector(4downto0);--------------------
signaldout:
std_logic:
='1';
begin
clkout<=dout;
------------------计时1秒------------------------------
process(clk,rst)
begin
ifrst='0'then
sec1<=(others=>'0');
sec2<=(others=>'0');
sec3<=(others=>'0');
elsifclk'eventandclk='1'then
ifsec1>="1111100111"then
sec1<=(others=>'0');
sec2<=sec2+'1';
ifsec2>="1111100111"then
sec2<=(others=>'0');
sec3<=sec3+'1';
ifsec3>="10011"then
sec3<=(others=>'0');
dout<=notdout;
elsesec3<=sec3+'1';
endif;
endif;
else
sec1<=sec1+'1';
endif;
endif;
endprocess;
endBehavioral;
1.2计数器模块:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycounteris
PORT(Clock:
INSTD_LOGIC;
Hold:
instd_logic;
countNum:
BuFFeRINTEGERRANGE0TO90);
ENDcounter;
ARCHITECTUREBehavioralOFcounterIS
BEGIN
Process(Clock)
BEGIN
IFrising_edge(Clock)THEN
IFHold='1'then
countNum<=countNum;
ELSE
IFcountNum=90THEN
countNum<=0;
ELSE
countNum<=countNum+1;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
endBehavioral;
1.3分位模块:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityFenweiis
PORT
(Numin:
INintegerRANGE0TO90;
NumA,NumB:
OUTIntegerRANGE0to9;
NumC,NumD:
OUTIntegerRANGE0to9);
endFenwei;
architectureBehavioralofFenweiis
BEGIN
process(Numin)
BEGIN
IFNumin>=60THEN
NumA<=0;
NumB<=0;
NumC<=0;
NumD<=0;
elsIFNumin>=50THEN
NumA<=5;
NumB<=Numin-50;
NumC<=5;
NumD<=Numin-50;
elsIFNumin>=40THEN
NumA<=4;
NumB<=Numin-40;
NumC<=4;
NumD<=Numin-40;
ELSIFNumin>=30THEN
NumA<=3;
NumB<=Numin-30;
NumC<=3;
NumD<=Numin-30;
ELSIFNumin>=20THEN
NumA<=2;
NumB<=Numin-20;
NumC<=2;
NumD<=Numin-20;
ELSIFNumin>=10THEN
NumA<=1;
NumB<=Numin-10;
NumC<=1;
NumD<=Numin-10;
ELSE
NumA<=0;
NumB<=Numin;
NumC<=0;
NumD<=Numin;
ENDIF;
ENDPROCESS;
endBehavioral;
1.4数码管驱动模块:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitybcd_datais
PORT
(bcd_data:
inIntegerRANGE0to9;
segout:
outSTD_LOGIC_VECTOR(7downto0));
endbcd_data;
architectureBehavioralofbcd_datais
begin
process(bcd_data)
begin
casebcd_datais
When0=>segout<="11000000";--0
When1=>segout<="11111001";--1
When2=>segout<="10100100";--2
When3=>segout<="10110000";--3
When4=>segout<="10011001";--4
When5=>segout<="10010010";--5
When6=>segout<="10000010";--6
When7=>segout<="11111000";--7
When8=>segout<="10000000";--8
When9=>segout<="10010000";--9
whenothers=>null;
ENDCASE;
ENDPROCESS;
endBehavioral;
------------------使能端控制扫描显示-----------------------
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitydtsmis
PORT(clk:
inSTD_LOGIC;
NumA,NumB:
inIntegerRANGE0to9;
segout1:
outSTD_LOGIC_VECTOR(7downto0);
led_sel:
outSTD_LOGIC_VECTOR(1downto0));
enddtsm;
architectureBehavioralofdtsmis
componentbcd_datais
port(bcd_data:
inIntegerRANGE0