推荐下载基于FPGA的智能交通灯设计附VHDL语言程序.docx
《推荐下载基于FPGA的智能交通灯设计附VHDL语言程序.docx》由会员分享,可在线阅读,更多相关《推荐下载基于FPGA的智能交通灯设计附VHDL语言程序.docx(37页珍藏版)》请在冰点文库上搜索。
推荐下载基于FPGA的智能交通灯设计附VHDL语言程序
(完整word版)基于FPGA的智能交通灯设计附VHDL语言程序
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整word版)基于FPGA的智能交通灯设计附VHDL语言程序)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整word版)基于FPGA的智能交通灯设计附VHDL语言程序的全部内容。
第一章设计原理
1。
1使用VHDL语言实现对FPGA器件的编程
FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
对于目前的FPGA器件,可以使用硬件描述语言(Verilog或VHDL)完成电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流.这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式.
1.2使用的设计工具
1.2。
1硬件部分
Cycloneii是一款FPGA器件,于2004年由Altera公司推出.CycloneIIFPGA的成本比第一代Cyclone器件低30%,逻辑容量大了三倍多,同时具有丰富的I/O引脚.实验板采用EP2C5T144C8芯片并配有SDRAM芯片,时钟频率为50MHz。
同时,实验板包含4个数码管以及5个按键,同时将丰富的I/O口用排针进行了引出。
从系统资源以及运行速度的方面考虑,均足以完成智能交通灯的设计。
1。
2。
2软件部分
QuartusII是Altera公司的综合性PLD/FPGA开发软件,原理图、VHDL、VerilogHDL以及AHDL(AlteraHardware支持DescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
VHDL语言是一种用于电路设计的高级语言。
它在80年代的后期出现。
具有设计灵活、支持广泛、易于修改、独立于器件的设计或工艺等优秀的特性.十分适合于对FPGA器件进行编程。
1.3软件框图
本系统包含一个顶层以及两个子器件(分频器以及数码管显示驱动)。
分频器将系统时钟分为1000Hz,1Hz等待信号供顶层程序使用。
顶层包含了整个系统关键性控制逻辑,在接收到分频器时钟信号以及按键信号后,由不同的进程进行处理,同时不同的进程间通过标志位信号进行通信.处理完成的信息将传递给LED直接输出红绿灯信号或数码管驱动
器件进行进一步的处理后输出给数码管进行显示。
图1。
1
1。
4红绿灯拓展模块
为了达到更好的人机交互效果,本系统将红绿灯在电路板上通过不同的颜色的LED进行实物化。
模块原理图如下:
图1.2
PCB设计如下:
图1.3
第二章程序设计及分析
2。
1分频器器件的设计
本系统将分频器单独设置为一个器件,目的是便于对时间倍率进行修改以及方便调用。
具体思路如下:
(以1ms为周期的输出信号为例)
图2。
1
2。
2数码管显示驱动器件的设计
实验板的数码管为共阳连接,含有4个位选信号以及8个段选信号,通过控制位选及段选可以实现数码管的显示。
该子器件的输入信号为0—15的整数,输出为显示16进制相应字符的段选信号。
程序主体采用case语句,对输入信号进行选择并相应的输出。
图2.2
2.3顶层器件设计
2.3.1按键消抖
本系统对于按键采取了消抖的处理办法,可以有效的增加稳定性.消抖的实现原理基于计数器,当检测到有按键按下则开始计数,当计数达到设定值时给出按键按下的信号并执行相应功能,其中key5实现模式选择,其余按键实现对时间设定的更改。
图2。
3
2。
3。
2数码管扫描显示
实验板采用了四个共阳的数码管,若需要让每个数码管都显示不一样的内容,则需要对数码管进行扫描显示。
本系统采用1000Hz的频率对数码管进行扫描显示,实际效果可以稳定的显示而不会出现闪烁的现象。
程序设计方面采用了两个process,分别对数码管位选进行扫描以及输入段选信号
图2.4
图2。
5
2.3.324小时时钟
为了实现白天与夜间的模式切换效果,需要加入24小时制的时钟.本系统对于时钟的实现依然基于计数器。
具体流程如下:
对分频器输出的分钟信号进行检测,当检测到上升沿时执行计数,当达到该位最大值时执行进位与清零。
图2.6
2。
3.4改变时间设定
本程序实现了对行人通行时间,汽车通行时间以及夜间时间段的设定。
设定方式为由按键实现加减。
主要代码已经内嵌于按键消抖程序中。
图2.6
图2.7
2。
3。
5交通灯主控程序
本程序实现了对白天夜间模式的判断以及不同模式下对红绿灯的控制.程序框图如下:
图2。
8
具体程序代码详见附录。
第三章使用说明及实验结果
3.1使用说明
本系统基本实现了题目要求的所有功能。
具备了白天、夜间模式的功能及其自动切换及其时间点设置,行人、汽车通行时间设置,24小时电子钟,通行时间倒数等功能。
同时为了实现更好的人机交互以及获得更明显的实验效果,接入了专用的红绿灯模块并将电子时钟加快了1000倍,红绿灯计时器加快了10倍。
具体使用方法如下:
(1)初始值:
系统上电后时钟初始值为0点。
夜间时间初始值为22:
00-8:
00,行人通行时间,车辆通行时间初始值分别为15s,30s。
(2)系统模式选择:
数码管共用4种显示模式,可以通过key5(s6)对模式进行切换(上电后将默认进入模式0)。
同时,在不同模式下按键也具有不同的功能。
模式0:
电子时钟显示模式(为上电后的默认显示模式),左边两个数码管显示小时,右边两个数码管显示分钟。
四个数码管共同构成当天系统时间(是白天、夜间的切换的基准时间).
模式1:
通行剩余时间显示。
右边两个数码管将显示红绿灯当前状态还将持续的剩余时间。
当进入夜间模式且无行人通过时,数码管将显示———-。
模式2:
行人,车辆通行时间设置模式。
此模式下左边两个数码管显示车辆通行时间,右边两个数码管为行人通行时间.按下S2将使车辆通行时间+1s,按下S3将使车辆通行时间+1s.同样,S4与S5将分别控制行人通行时间的改变。
模式3:
夜间时间点设置模式。
此模式下左边两个数码管显示进入白天的时间点,右边两个数码管显示进入夜间的时间点(单位均为小时)。
同样,此时S2、S3将控制进入白天时间点,S4、S6将控制进入夜间的时间点。
(3)白天模式:
当系统时钟为设定的白天区间内,交通灯将执行白天模式,此时人行道和车行道的红绿灯自动切换,人行道和车行道的通行时间分别为30秒和15秒。
同时车行道的绿灯到红灯的切换有3秒过渡时间(亮黄灯).
(4)夜间模式:
当系统时钟为设定的夜间区间内,交通灯将执行白天模式,无行人过马路时,车行道持续亮绿灯让车通行,直到有行人按过街按钮,才执行人、车通行的切换.行人按下按钮后延时30秒,切换到人行道通行15秒,然后切换到车通行。
此后,若无人按过街按钮,则保持车通行状态,若继续有人按下过街按钮,则执行人、车分别15秒和30秒的轮换通行。
车行道的绿灯到红灯的切换有3秒过渡时间(亮黄灯),人行道则只有红、绿灯,且无过渡时间。
3.2实验结果
具体实验结果可以扫描以下二维码观看。
图3.1
部分视频截图如下:
图3。
2
图3。
3
图3.4
图3。
5
图3.6
图3.7
图3.8
第四章结论与体会
通过借助网络工具以及对书本的学习,本次成功的完成了智能交通灯的设计,并实现了题目要求的所有功能。
但是过程中却不是很顺利,主要体现在按键的使用以及不同process间通过信号量进行通信等,特别是当使用较多信号进行参数传递时经常忽略信号量的值不能在两个process中同时进行修改,而导致不能成功通过编译。
另外对于编程的整体思路也与之前接触过的单片机大为不同,单片机的MCU只支持单个进程运行,需要加入各种中断处理后才可以做到宏观上的多进程并行运行,而FPGA则支持数个进程同时运行,大大的提高了代码运行速度的同时却导致了整体设计构思发生了较大的转变。
另外,对于程序模块化的设计也有了较为初步的理解,通过模块化的方法可以使代码的可读性、可移值性均大大的提高,同时还十分便于修改,甚至由于可以实现模块化调用而大大缩减了代码量。
总结:
FPGA很强大,我学会了很多。
附录程序源码
——@ByHypo20170520交通灯主程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYtestIS
PORT(
key1,key2,key3,key4,key5,key6:
INSTD_LOGIC;——按键输入
sysclk:
INSTD_LOGIC;--时钟输入
led_c_r,led_c_y,led_c_g,led_p_r,led_p_g:
OUTSTD_LOGIC;--led输出
seg7data:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);—-数码管位选
seg7com:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)—-数码管段选
);
ENDtest;
ARCHITECTUREmainOFtestIS
COMPONENTseg7ledIS—————---————-—---————-数码管
PORT(
int_in:
ININTEGERRANGE0TO16;
data_out:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDCOMPONENTseg7led;
COMPONENTclkdivIS—————-——-—————---———--—-———--—-—-分频器
PORT(clk_in:
INSTD_LOGIC;-—时钟信号输入
clk_out_ms:
OUTSTD_LOGIC;-—毫秒信号输出
clk_out_s:
OUTSTD_LOGIC;——秒信号输出
clk_out_min:
OUTSTD_LOGIC;--分钟信号输出
clk_out_h:
OUTSTD_LOGIC;—-时钟信号输出
clk_out_50ms:
OUTSTD_LOGIC
);
ENDCOMPONENTclkdiv;
—-———-—----—--—---———--——-——-——-——--————-—--————数码管扫描
SIGNALtmp_seg7data:
integerrange0to16;
SIGNALdata_count_seg:
integerrange0to10;
----—---—---——--——--——————————-——---分频器输出
SIGNALtmp_sig_s,tmp_sig_ms,tmp_sig_min,tmp_sig_h,tmp_sig_50ms:
STD_LOGIC;—-分频器输出时钟信号
-—-——--—---————--—--———————--———————-—---——-——-——-24小时时钟
SIGNALdata_min_low:
integerrange0to20;
SIGNALdata_min_high:
integerrange0to10;
SIGNALdata_min:
integerrange0to100;
SIGNALdata_h_low:
integerrange0to20;
SIGNALdata_h_high:
integerrange0to10;
SIGNALdata_h:
integerrange0to100;
-—--—-——-————-——-—-——---————-—-—--——-——-—-——-——-数码管显示模式切换
SIGNALdata_mode:
integerrange0to10:
=0;
SIGNALdata_count_key:
integerrange0to100;
—--—-----———-——---—-—--——--—-—----————---—--—-交通灯主控程序
SIGNALled_p:
integerrange0to3;——车道灯
SIGNALled_c:
integerrange0to3:
=1;——人行道灯
SIGNALkey_flag:
integerrange0to1:
=0;
SIGNALdata_time_count:
integerrange0to1000;——时间计数
SIGNALdata_mode_led:
integerrange0to10:
=0;—-红绿灯剩余时间显示
—————-—-————-—----—-—--—----—-——-——-———-——--——---—-—---—--—夜间模式初始化设置
SIGNALdata_time_nightin:
integerrange0to100:
=22;
SIGNALdata_time_nightout:
integerrange0to100:
=8;
SIGNALnight:
STD_LOGIC:
=’0’;
--————------—---——-—-----——-——--————-——--———-—--—-———-—-———红绿灯时间设置
SIGNALdata_time_cp:
integerrange0to100:
=30;—-车通行30秒
SIGNALdata_time_pp:
integerrange0to100:
=15;——人通行15秒
BEGIN
div:
clkdivPORTMAP(-——---———-——分频器
clk_in=〉sysclk,
clk_out_s=>tmp_sig_s,
clk_out_ms=〉tmp_sig_ms,
clk_out_min=>tmp_sig_min,
clk_out_h=>tmp_sig_h,
clk_out_50ms=〉tmp_sig_50ms);
dis:
seg7ledPORTMAP(-——--——--———---数码管
int_in=〉tmp_seg7data,
data_out=>seg7data
);
——-——-—--———-———-————--—-—-----—--—-—--—---———--——-—-—--—-—-————-——--—-——
process(sysclk,key5)----——按键5消抖+数码管模式选择(s6)
variableCOUNT1:
integerrange0to1000000;
begin
ifkey5=’0’then
ifRISING_EDGE(sysclk)then
ifCOUNT1〈1000000then
COUNT1:
=COUNT1+1;
elseCOUNT1:
=COUNT1;
endif;
ifCOUNT1=999999then
data_mode〈=data_mode+1;
elsedata_mode〈=data_mode;
endif;
endif;
elseCOUNT1:
=0;
ENDif;
if(data_mode=4)then
data_mode〈=0;
endif;
endprocess;
—--———-————-——-—-—-———-——---——--—-——————-——----———-———-—-—-———-———---
process(sysclk)—---—---按键1234消抖+改变设定时间(s2s3s4s5)
variableCOUNT1:
integerrange0to1000000;
begin
ifkey1=’0’orkey2='0’orkey3='0'orkey4=’0’then
ifrising_edge(sysclk)then
ifCOUNT1<1000000then
COUNT1:
=COUNT1+1;
elseCOUNT1:
=COUNT1;
endif;
ifCOUNT1=999999then
if(key1=’0')then
if(data_mode=2)then
data_time_cp<=data_time_cp+1;
elsif(data_mode=3)then
data_time_nightout〈=data_time_nightout+1;
endif;
endif;
if(key2='0')then
if(data_mode=2)then
data_time_cp<=data_time_cp-1;
elsif(data_mode=3)then
data_time_nightout〈=data_time_nightout—1;
endif;
endif;
if(key3='0')then
if(data_mode=2)then
data_time_pp〈=data_time_pp+1;
elsif(data_mode=3)then
data_time_nightin〈=data_time_nightin+1;
endif;
endif;
if(key4=’0')then
if(data_mode=2)then
data_time_pp〈=data_time_pp—1;
elsif(data_mode=3)then
data_time_nightin<=data_time_nightin-1;
endif;
endif;
endif;
endif;
elseCOUNT1:
=0;
endif;
endprocess;
------—-—---—---——-——-———-----——--——----—--—--——-——--—-—--—-————-—---—-
process(sysclk)-—-红绿灯点亮定义
begin
if(led_c=0)then
led_c_r<='1’;
led_c_g<=’0';
led_c_y〈='0’;
elsif(led_c=1)then
led_c_r〈='0';
led_c_g<='1';
led_c_y<=’0';
else
led_c_r<='0';
led_c_g<='0';
led_c_y〈=’1’;
endif;
if(led_p=0)then
led_p_r〈='1’;
led_p_g〈=’0';
else
led_p_r〈=’0';
led_p_g<='1';
endif;
endprocess;
-——-——--—-—-—-—----------——----—-—--———-——--—-—------————-—--—---——-————-—
process(sysclk)——-红绿灯主控程序
begin
ifrising_edge(tmp_sig_s)then
data_time_count<=data_time_count+1;
if(night=’1')then—-—-——--——-黑夜模式
if(key_flag=1)then
if(data_time_count=data_time_cp)then
led_p<=0;--进入黄灯
led_c〈=2;
data_mode_led<=3;
endif;
if(data_time_count=(data_time_cp+3))then
led_p〈=1;-—行人通行
led_c〈=0;
data_mode_led〈=2;
endif;
if(data_time_count=(data_time_cp+3+data_time_pp))then
led_p〈=0;—-车通行
led_c<=1;
key_flag〈=0;
data_time_count<=0;
data_mode_led<=0;
endif;
else
led_p〈=0;
led_c<=1;
data_mode_led〈=0;
endif;
endif;
if(night=’0’)then——-—----—--—-白天模式
if(data_time_count=data_time_cp)then
led_p〈=0;--进入黄灯
led_c〈=2;
data_mode_led〈=3;
endif;
if(data_time_count=(data_time_cp+3))then
led_p〈=1;--行人通行
led_c〈=0;
data_mode_led〈=2;
endif;
if(data_time_count〉=(data_time_cp+3+data_time_pp))then
led_p<=0;——车通行
led_c<=1;
data_time_count〈=0;
dat