基于FPGA的交通灯控制器设计.docx

上传人:b****7 文档编号:10259508 上传时间:2023-02-09 格式:DOCX 页数:31 大小:391.96KB
下载 相关 举报
基于FPGA的交通灯控制器设计.docx_第1页
第1页 / 共31页
基于FPGA的交通灯控制器设计.docx_第2页
第2页 / 共31页
基于FPGA的交通灯控制器设计.docx_第3页
第3页 / 共31页
基于FPGA的交通灯控制器设计.docx_第4页
第4页 / 共31页
基于FPGA的交通灯控制器设计.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

基于FPGA的交通灯控制器设计.docx

《基于FPGA的交通灯控制器设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的交通灯控制器设计.docx(31页珍藏版)》请在冰豆网上搜索。

基于FPGA的交通灯控制器设计.docx

基于FPGA的交通灯控制器设计

综合课程设计报告

《基于FPGA的交通灯控制器设计》

 

学院:

通信与电子学院

专业班级:

电子科学与技术班

姓名:

学号:

指导老师:

 

 

摘要

 

近年来,随着科技的飞速发展,FPGA的应用正在不断深入,同时带动传统控制检测技术日益更新。

在实时检测和自动控制的单片机应用系统中,FPGA往往作为一个核心部件来使用,正在不断的应用到实际生活中,并且根据具体硬件结构软硬件结合,加以完善。

交通灯控制器在城市交通监管中起着极其重要的作用。

传统的交通灯控制器基本是通过单片机或者PLC实现。

本文介绍基于FPGA技术和QuartusII开发平台实现十字路口交通灯控制器的的一种方案,实现了通过信号灯对路面状况的智能控制。

从一定程度上解决了交通路口堵塞、车辆停车等待时间不合理、急车强通等问题。

利用VHDL硬件描述语言描述各模块程序,并在QuartusII环下进行编译、仿真,生成顶层文件后下载在FPGA器件FLEXEPF10K10LC84上进行验证。

验证结果表明,设计基本实现了交通灯控制器所要求的控制过程,包括倒计时时间显示功能、特殊状态控制功能和主、支干道的红、黄、绿灯交替显示功能,表明本文所述的的设计方案正确。

本文结合交通灯控制器的设计过程,简单介绍了硬件描述语言VHDL的结构模型和设计流程、VHDL设计的优点及该语言在数字系统设计

中的美好前景和重要地位。

 

关键词:

FPGA,交通灯控制器,QuartusⅡ,Verilog HDL 

 

目录

摘要

1FPGA/CPLD概述1

2系统分析与总体方案3

2.1系统分析3

2.2设计的总体方案3

3硬件电路设计4

3.1分频器设计4

3.2状态控制电路设计4

3.3计数器设计5

3.4译码显示电路设计5

4robei软件程序设计6

4.1扫描显示模块6

4.2状态转换模块7

4.3总体设计11

4.4测试文件12

5程序仿真与分析12

5.1仿真结果12

5.2仿真结果分析14

6心得体会16

参考文献17

附录18

 

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系统分析

通过分析可以知道,所要设计的十字路口交通灯控制电路要能够使南北、东西各四个灯(红、黄、绿),三个灯能够按顺序依次亮灭。

而且要求绿灯亮转红灯亮之前要先转黄灯亮5秒,还要求三种灯的点亮时间能够以倒计时的形式显示出来。

可以用verilogHDL语言合理设计系统功能,使红黄绿灯的转换有一个准确的时间间隔和转换顺序。

使用基于FPGA的方法具有周期短、使用灵活、易于修改等明显的优点。

而且,随着FPGA器件,设计语言和电子设计自动化工具的发展和改进,越来越多的电子系统采用FPGA来设计。

未来使用FPGA器件设计的产品将出现在各个领域。

因此此次的交通灯控制器将基于FPGA的设计方案来实现所需要的功能。

2.2设计的总体方案

根据设计要求和系统所具有功能,并参考相关的文献资料经行方案设计画出如下所示的十字路口交通灯控制器系统框图,及为设计的总体方案,框图如下图3.1所示:

图2.2系统的框图

3硬件电路设计

3.1分频器设计

分频器实现的是将高频时钟信号转换成低频时钟信号,用于触发控制器、计数器和扫描显示电路。

具体实物模块如图:

图3.1分频器模块

3.2状态控制电路设计

状态控制器的作用是根据计数器的计数值控制各方向上发光二极管的亮、灭,当计时时间到达,状态控制器就响应,自动跳转到下一个状态。

此外,当检测到特殊情况(EMI=‘1’)发生时,无条件点亮红灯的二极管(急救灯按下EMI='1',则东西南北都亮红灯,在这种状态下原来的状态必须保持,即东西南北方向定时时间保持不变。

急救灯未按下或者按下后恢复,则继续计时(计时通过计数器ct),同时恢复东西南北原来灯的状态)。

具体实物模块如图:

图3.2控制电路模块

3.3计数器设计

这里需要的计数器的计数范围为0-80。

计到80后,下一个时钟沿回复到0,开始下一轮计数。

此外,当检测到特殊情况(EMI=‘1’)发生是,计数器暂停计数,而系统复位信号RESET则使计数器异步清零。

图3.3计数器模块

3.4译码显示电路设计

根据状态控制器所控制的状态和计数器的计时时间,选择当前状态下的显示器,使显示器输出当前状态下的数码管亮、灭指令,其中数码管的显示采用动态扫描显示。

具体实物模块如图:

图3.4译码显示电路模块

4robei软件程序设计

4.1扫描显示模块:

/********扫描显示***********/

parameter_0=7'b1000000,

_1=7'b1111001,

_2=7'b0100100,

_3=7'b0110000,

_4=7'b0011001,

_5=7'b0010010,

_6=7'b0000010,

_7=7'b1111000,

_8=7'b0000000,

_9=7'b0011000;

reg[6:

0]rTen_SMG_Data;

initialbegin

rTen_SMG_Data=7'b0000000;

end

always@(posedgeclkornegedgenrst)

if(!

nrst)

begin

rTen_SMG_Data<=7'b1111111;

end

else

case(ten_data)

4'd0:

rTen_SMG_Data<=_0;

4'd1:

rTen_SMG_Data<=_1;

4'd2:

rTen_SMG_Data<=_2;

4'd3:

rTen_SMG_Data<=_3;

4'd4:

rTen_SMG_Data<=_4;

4'd5:

rTen_SMG_Data<=_5;

4'd6:

rTen_SMG_Data<=_6;

4'd7:

rTen_SMG_Data<=_7;

4'd8:

rTen_SMG_Data<=_8;

4'd9:

rTen_SMG_Data<=_9;

endcase

/*********************************************/

reg[6:

0]rOne_SMG_Data;

initialbegin

rOne_SMG_Data=7'b0000000;

end

always@(posedgeclkornegedgenrst)

if(!

nrst)

begin

rOne_SMG_Data<=7'b1111111;

end

else

case(one_data)

4'd0:

rOne_SMG_Data<=_0;

4'd1:

rOne_SMG_Data<=_1;

4'd2:

rOne_SMG_Data<=_2;

4'd3:

rOne_SMG_Data<=_3;

4'd4:

rOne_SMG_Data<=_4;

4'd5:

rOne_SMG_Data<=_5;

4'd6:

rOne_SMG_Data<=_6;

4'd7:

rOne_SMG_Data<=_7;

4'd8:

rOne_SMG_Data<=_8;

4'd9:

rOne_SMG_Data<=_9;

endcase

/**********************************************************/

assignten_smg_data=rTen_SMG_Data;

assignone_smg_data=rOne_SMG_Data;

/**********************************************************/

4.2状态转换模块:

/************状态转换*************/

parameterstate_0=2'b00,

state_1=2'b01,

state_2=2'b10,

state_3=2'b11;

reg[1:

0]CS;

reg[1:

0]flag;

reg[3:

0]count_H,count_L;

reg[3:

0]count_H1,count_L1;

regECS;

reg[2:

0]light_zhu;//light_zhu[0]?

?

light_zhu[1]?

?

?

light_zhu[2]?

?

reg[2:

0]light_zhi;//light_zhi[0]?

?

light_zhi[1]?

?

?

light_zhi[2]?

?

initialbegin

CS=2'b00;

flag=2'b00;

ECS=1;

count_H=4'b0000;

count_L=4'b0000;

count_H1=4'b0000;

count_L1=4'b0000;

light_zhu=3'b000;

light_zhi=3'b000;

end

always@(posedgeclk_1Hzornegedgenrst)

if(!

ECS)

begin

ECS<=1;

end

else

begin

if(!

nrst)

begin

CS<=state_0;

flag<=2'b00;

state_0_init;

end

else

case(CS)

state_0:

if(flag==2'b00)//状态0,35s

begin

if(!

count_H&&(count_L==4'b0110))//5s

begin

flag<=2'b01;

CS<=state_1;

state_1_init;//state_1

end

elseif(!

count_L)

begin

count_L<=4'b1001;

count_H<=count_H-1;

end

else

begin

count_L<=count_L-1;

end

if(!

count_L1)

begin

count_L1<=4'b1001;

count_H1<=count_H1-1;

end

else

begin

count_L1<=count_L1-1;

end

end

state_1:

if(flag==2'b01)//状态1,5s

begin

if(!

count_L)

begin

flag<=2'b10;

CS<=state_2;

state_2_init;//状态2

end

else

begin

count_L<=count_L-1;

count_L1<=count_L;

ECS=0;

end

end

state_2:

if(flag==2'b10)//状态2,25s

begin

if(!

count_H&&(count_L==4'b0110))//5s

begin

flag<=2'b11;

CS<=state_3;

state_3_init;//state_3

end

elseif(!

count_L)

begin

count_L<=4'b1001;

count_H<=count_H-1;

end

else

begin

count_L<=count_L-1;

end

if(!

count_L1)

begin

count_L1<=4'b1001;

count_H1<=count_H1-1;

end

else

begin

count_L1<=count_L1-1;

end

end

state_3:

if(flag==2'b11)//状态3,5s

begin

if(!

count_L)

begin

flag<=2'b00;

CS<=state_0;

state_0_init;//状态0

end

else

begin

count_L<=count_L-1;

count_L1<=count_L;

ECS=0;

end

end

default:

begin

flag<=2'b00;

CS<=state_0;

end

endcase

end

/*************************************/

taskstate_0_init;

begin//主干道绿灯45秒只干道

count_H<=4'b0100;//高位为4

count_L<=4'b0101;//低位为5

count_H1<=4'b0101;//高位5

count_L1<=4'b0000;//低位0

light_zhu<=3'b100;//light_zhu[0]:

0,light_zhu[1]:

0,light_zhu[2]:

1

light_zhi<=3'b001;//light_zhi[0]:

0,light_zhi[1]:

0,light_zhi[2]:

1

end

endtask

/*************************************/

/*************************************/

taskstate_1_init;

begin//黄灯5秒

count_H<=4'b0000;//高位为0

count_L<=4'b0101;//低位为5

count_H1<=4'b0000;

count_L1<=4'b0101;

light_zhu<=3'b010;

light_zhi<=3'b001;

end

endtask

/*************************************/

taskstate_2_init;

begin//主干道红灯25秒

count_H<=4'b0010;//高位为2

count_L<=4'b0101;//低位为5

count_H1<=4'b0010;//高位为3

count_L1<=4'b0000;//低位为0

light_zhu<=3'b001;

light_zhi<=3'b100;

end

endtask

/*************************************/

taskstate_3_init;

begin//5秒黄灯

count_H<=4'b0000;//高位为0

count_L<=4'b0101;//地位为5

count_H1<=4'b0000;

count_L1<=4'b0101;

light_zhu<=3'b001;

light_zhi<=3'b010;

end

endtask

/**************************/

assignone_data=count_L;

assignten_data=count_H;

assignone_data1=count_L1;

assignten_data1=count_H1;

assignled_zhu=light_zhu;

assignled_zhi=light_zhi;

/**************************/

4.3总体设计:

4.4测试文件:

regclk_signal;

initialbegin

clk_signal=0;

clk=0;

nrst=0;

#1

nrst=1;

#500$finish;

end

alwaysbegin

#1clk_signal=~clk_signal;

clk=clk_signal;

end

5程序仿真与分析

5.1仿真结果

利用robei软件对本程序进行编译,生成了可以进行仿真定时分析以及下载到可编程器件的相关文件。

仿真结果如下图所示:

总体:

主干道:

支干道:

5.2仿真结果分析

通过写测试文件设置仿真时间,就可以得到如上所示的仿真波形图。

由仿真波形图可以看出波形是由clk信号触发而显示出各个状态的。

nrst低电平信号输入时,所有交通灯都变为红灯状态。

由仿真波形图还可以清楚的看出各时间段每个交通灯的状态。

要得到正确的仿真波形图就不许设定合适的时间信号clk值。

如果clk值设置的太小则交通灯状态变化得太快无法分辨,如果clk值设置得太大则交通灯状态转换缓慢,效果不明显。

其次,要设定clk高低电平的时间,如果没有设定clk脉宽就不可能触发而得到仿真图。

最后,就是要设置nrst高电平信号。

心得体会

首先在这里,要感谢詹华群老师的授课和小强同学的指导,感谢学院开设《基于FPGA的交通灯控制器设计》这门课程设计,给了我们一次充分锻炼,将理论知识付诸实践的机会。

刚开始对FPGA都不怎么熟悉对robei软件也不怎么熟悉,还以为这次交通灯控制器的设计是跟我们做的EDA用QuartusII做的交通灯实验差不多,但经过一番了解还是发现有许多不同,只能说是相互关联。

大学三年,我们学习了很多工程技术的知识,做过一些专业实训和实验,但却经常性的忽视在这些课程中的课程设计这个关键环节,认为它们只不过是走过场,抄抄代码,写写报告就够了。

其实不然,课程设计本身就是一次做项目的经历,它要求你严格按照项目规程操作,在时间和进度上,都要有项目意

通过这段时间老师对本次课程设计的讲解和自己对robei的熟悉和学习,发现了自己EDA上的很多不足,发现了很多知识上的漏洞。

同时也看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。

这次课程设计让我学到了很多,不仅是巩固了先前学的quartus的使用,而且也学会了新的robei软件的使用,通过两个软件的对比更进一步加强了对FPGA工作原理的理解、提升的自己对verilog的编程能力。

还有一点是我们做任何事情都无法缺少的,那就是细心认真、耐心调试。

很多知名的程序在正式发布之前都会有α、β等测试版本,为的就是在反复的试验中发现那些程序员无法发现的小BUG。

此次设计我们就深深地体会到了,由于编程的时候没有做到足够的细心,导致一串代码弄混了。

但是密密麻麻的英文字母混在一起,我始终没有发现。

最终在调试的时候,就出现了问题。

只知道出现了问题,就是不知道到问题的根源在哪里,好长时间都没有找出问题的所在。

这也让我真正的明白了,科学的严谨性,它不允许出半点去对待差错,否则后果会是比较麻烦的。

 通过分析将交通灯控制系统分为四个模块:

分频模块、计时模块、控制模块和显示译码模块。

信号灯在计数器的计数信号的控制下各个工作状态之间的转换非常明确,所以可利用状态机来对控制模块进行设计。

计数器采用倒计时的方式,由于使用7段数码显示器来模拟时间显示,所以需要将计时模块的输出信号转化为数码显示器的驱动信号,中间涉及到十进制和二进制之间的转换。

 

在设计中采用Verilog HDL语言设计交通灯控制系统, 借助其功能强大的语言结构, 简明的代码描述复杂控制逻辑设计, 与工艺无关特性, 在提高工作效率的同时达到求解目的, 并可以通过Verilog HDL 语言的综合工具进行相应硬件电路生成, 具有传统逻辑设计方法所无法比拟的优越性。

  

在设计过程中,觉得最难的部分是波形仿真部分,虽然程序编译通过但仿真却比较难实现正确的波形,不是计数器无法正常计数,就是控制输出无法进入到下一个状态,每次出现问题就必须返回重新修改程序。

实践证明,在编写一个较复杂的程序时,一开始一定要先把各个模块分析透彻,弄清楚各个功能及实现它们的逻辑算法,做到心中有数后在开始下笔写编写程序。

 

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

当前位置:首页 > 经管营销 > 金融投资

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1