欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    基于FPGA的智能交通灯设计附VHDL语言程序.doc

    • 资源ID:11185440       资源大小:4.89MB        全文页数:26页
    • 资源格式: DOC        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于FPGA的智能交通灯设计附VHDL语言程序.doc

    目录第一章 设计原理11.1 使用VHDL语言实现对FPGA器件的编程11.2 使用的设计工具11.2.1 硬件部分11.2.2 软件部分11.3 软件框图11.4 红绿灯拓展模块2第二章 程序设计及分析32.1 分频器器件的设计32.2 数码管显示驱动器件的设计32.3 顶层器件设计42.3.1 按键消抖42.3.2 数码管扫描显示52.3.3 24小时时钟52.3.4 改变时间设定62.3.5 交通灯主控程序7第三章 使用说明及实验结果83.1 使用说明83.2 实验结果9第四章 结论与体会12附录 程序源码13第一章 设计原理1.1 使用VHDL语言实现对FPGA器件的编程FPGA(FieldProgrammable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。对于目前的FPGA器件,可以使用硬件描述语言(Verilog或VHDL)完成电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。1.2 使用的设计工具1.2.1 硬件部分 Cyclone ii是一款FPGA器件,于2004年由Altera公司推出。Cyclone II FPGA的成本比第一代Cyclone器件低30%,逻辑容量大了三倍多,同时具有丰富的I/O引脚。实验板采用EP2C5T144C8芯片并配有SDRAM芯片,时钟频率为50MHz。同时,实验板包含4个数码管以及5个按键,同时将丰富的I/O口用排针进行了引出。从系统资源以及运行速度的方面考虑,均足以完成智能交通灯的设计。1.2.2 软件部分Quartus II 是Altera公司的综合性PLD/FPGA开发软件,原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware 支持Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。VHDL语言是一种用于电路设计的高级语言。它在80年代的后期出现。具有设计灵活、支持广泛、易于修改、独立于器件的设计或工艺等优秀的特性。十分适合于对FPGA器件进行编程。1.3 软件框图本系统包含一个顶层以及两个子器件(分频器以及数码管显示驱动)。分频器将系统时钟分为1000Hz,1Hz等待信号供顶层程序使用。顶层包含了整个系统关键性控制逻辑,在接收到分频器时钟信号以及按键信号后,由不同的进程进行处理,同时不同的进程间通过标志位信号进行通信。处理完成的信息将传递给LED直接输出红绿灯信号或数码管驱动器件进行进一步的处理后输出给数码管进行显示。图1.11.4 红绿灯拓展模块为了达到更好的人机交互效果,本系统将红绿灯在电路板上通过不同的颜色的LED进行实物化。模块原理图如下:图1.2PCB设计如下:图1.3第二章 程序设计及分析2.1 分频器器件的设计本系统将分频器单独设置为一个器件,目的是便于对时间倍率进行修改以及方便调用。具体思路如下:(以1ms为周期的输出信号为例)图2.12.2 数码管显示驱动器件的设计实验板的数码管为共阳连接,含有4个位选信号以及8个段选信号,通过控制位选及段选可以实现数码管的显示。该子器件的输入信号为0-15的整数,输出为显示16进制相应字符的段选信号。程序主体采用case语句,对输入信号进行选择并相应的输出。图2.22.3 顶层器件设计2.3.1 按键消抖本系统对于按键采取了消抖的处理办法,可以有效的增加稳定性。消抖的实现原理基于计数器,当检测到有按键按下则开始计数,当计数达到设定值时给出按键按下的信号并执行相应功能,其中key5实现模式选择,其余按键实现对时间设定的更改。图2.32.3.2 数码管扫描显示实验板采用了四个共阳的数码管,若需要让每个数码管都显示不一样的内容,则需要对数码管进行扫描显示。本系统采用1000Hz的频率对数码管进行扫描显示,实际效果可以稳定的显示而不会出现闪烁的现象。程序设计方面采用了两个process,分别对数码管位选进行扫描以及输入段选信号图2.4图2.52.3.3 24小时时钟为了实现白天与夜间的模式切换效果,需要加入24小时制的时钟。本系统对于时钟的实现依然基于计数器。具体流程如下:对分频器输出的分钟信号进行检测,当检测到上升沿时执行计数,当达到该位最大值时执行进位与清零。图2.62.3.4 改变时间设定本程序实现了对行人通行时间,汽车通行时间以及夜间时间段的设定。设定方式为由按键实现加减。主要代码已经内嵌于按键消抖程序中。图2.6图2.72.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很强大,我学会了很多。附录 程序源码-By Hypo 20170520 交通灯主程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY test ISPORT( key1,key2,key3,key4,key5,key6: IN STD_LOGIC;-按键输入 sysclk: IN STD_LOGIC;-时钟输入led_c_r,led_c_y,led_c_g,led_p_r,led_p_g: OUT STD_LOGIC;-led输出seg7data:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);-数码管位选seg7com: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)-数码管段选);END test;ARCHITECTURE main OF test ISCOMPONENT seg7led IS -数码管PORT (int_in: IN INTEGER RANGE 0 TO 16;data_out:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END COMPONENT seg7led;COMPONENT clkdiv IS-分频器 PORT( clk_in:IN STD_LOGIC; -时钟信号输入 clk_out_ms:OUT STD_LOGIC; -毫秒信号输出 clk_out_s:OUT STD_LOGIC; -秒信号输出 clk_out_min:OUT STD_LOGIC; -分钟信号输出 clk_out_h:OUT STD_LOGIC; -时钟信号输出 clk_out_50ms : OUT STD_LOGIC ); END COMPONENT clkdiv;-数码管扫描SIGNAL tmp_seg7data :integer range 0 to 16;SIGNAL data_count_seg:integer range 0 to 10;-分频器输出SIGNAL tmp_sig_s,tmp_sig_ms,tmp_sig_min,tmp_sig_h,tmp_sig_50ms :STD_LOGIC;-分频器输出时钟信号-24小时时钟SIGNAL data_min_low:integer range 0 to 20;SIGNAL data_min_high:integer range 0 to 10;SIGNAL data_min:integer range 0 to 100;SIGNAL data_h_low:integer range 0 to 20;SIGNAL data_h_high:integer range 0 to 10;SIGNAL data_h:integer range 0 to 100;-数码管显示模式切换SIGNAL data_mode: integer range 0 to 10:=0;SIGNAL data_count_key:integer range 0 to 100;-交通灯主控程序SIGNAL led_p :integer range 0 to 3;-车道灯SIGNAL led_c :integer range 0 to 3:=1;-人行道灯SIGNAL key_flag :integer range 0 to 1:=0;SIGNAL data_time_count:integer range 0 to 1000;-时间计数SIGNAL data_mode_led: integer range 0 to 10:=0;-红绿灯剩余时间显示-夜间模式初始化设置SIGNAL data_time_nightin: integer range 0 to 100:=22;SIGNAL data_time_nightout: integer range 0 to 100:=8;SIGNAL night :STD_LOGIC:=0;-红绿灯时间设置SIGNAL data_time_cp : integer range 0 to 100:=30;-车通行30秒SIGNAL data_time_pp : integer range 0 to 100:=15;-人通行15秒BEGINdiv: clkdiv PORT MAP ( -分频器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: seg7led PORT MAP ( -数码管int_in => tmp_seg7data,data_out => seg7data);-process(sysclk,key5) -按键5消抖+数码管模式选择(s6)variable COUNT1 :integer range 0 to 1000000; begin if key5=0 then if RISING_EDGE(sysclk) thenif COUNT1<1000000 then COUNT1:=COUNT1+1; else COUNT1:=COUNT1;end if; if COUNT1=999999 then data_mode <= data_mode+1;else data_mode <= data_mode; end if; end if; else COUNT1:=0;END if; if(data_mode = 4)thendata_mode <= 0;end if;end process ;-process(sysclk) -按键1 2 3 4消抖+改变设定时间(s2 s3 s4 s5)variable COUNT1 :integer range 0 to 1000000; beginif key1=0 or key2=0 or key3=0 or key4=0 then if rising_edge(sysclk) thenif COUNT1<1000000 then COUNT1:=COUNT1+1; else COUNT1:=COUNT1;end if; if COUNT1=999999 then if(key1=0)thenif(data_mode = 2)thendata_time_cp <= data_time_cp+1;elsif(data_mode =3)thendata_time_nightout <= data_time_nightout+1;end if;end if; if(key2=0)thenif(data_mode = 2)thendata_time_cp <= data_time_cp-1;elsif(data_mode =3)thendata_time_nightout <= data_time_nightout-1;end if;end if;if(key3=0)thenif(data_mode = 2)thendata_time_pp <= data_time_pp+1;elsif(data_mode =3)thendata_time_nightin <= data_time_nightin+1;end if;end if; if(key4=0)thenif(data_mode = 2)thendata_time_pp <= data_time_pp-1;elsif(data_mode =3)thendata_time_nightin <= data_time_nightin-1;end if;end if;end if; end if; else COUNT1:=0;end if; end process;-process(sysclk) -红绿灯点亮定义beginif(led_c = 0)thenled_c_r <= 1;led_c_g <=0;led_c_y <=0;elsif(led_c = 1)thenled_c_r <=0;led_c_g <=1;led_c_y <=0;elseled_c_r <=0;led_c_g <=0;led_c_y <=1;end if;if(led_p = 0)thenled_p_r <= 1;led_p_g <= 0;elseled_p_r <= 0;led_p_g <= 1;end if;end process;-process(sysclk) -红绿灯主控程序beginif rising_edge(tmp_sig_s)thendata_time_count<=data_time_count+1;if(night=1)then-黑夜模式if(key_flag=1)thenif(data_time_count=data_time_cp)thenled_p <=0; -进入黄灯led_c <=2;data_mode_led <=3;end if;if(data_time_count=(data_time_cp+3)thenled_p <=1; -行人通行led_c <=0;data_mode_led <=2;end if;if(data_time_count=(data_time_cp+3+data_time_pp)thenled_p <=0; -车通行led_c <=1;key_flag <=0;data_time_count <=0;data_mode_led <= 0;end if;else led_p <=0;led_c <=1;data_mode_led <= 0;end if;end if;if(night=0)then-白天模式if(data_time_count =data_time_cp)thenled_p <=0; -进入黄灯led_c <=2;data_mode_led <=3;end if;if(data_time_count = (data_time_cp+3)thenled_p <=1; -行人通行led_c <=0;data_mode_led <=2;end if;if(data_time_count >=(data_time_cp+3+data_time_pp) )thenled_p <=0; -车通行led_c <=1;data_time_count <=0;data_mode_led <=1;end if;end if;end if;if(key6=0 and key_flag = 0)thendata_time_count <= 0;data_mode_led <=1;end if;if(key6=0)thenkey_flag <=1;end if;end process;- process(tmp_sig_ms,data_count_seg) -生成数码管位选扫描beginif rising_edge(tmp_sig_ms) thendata_count_seg <= data_count_seg+1;if(data_count_seg = 4) thendata_count_seg <= 0;end if;end if;end process;-process(sysclk)-数码管扫描各模式显示样式beginif(data_mode = 0)then- -模式0,时钟显示if(data_count_seg = 0)then-位选扫描输入seg7com <="0111"-位选tmp_seg7data <= data_min_low;-段选elsif (data_count_seg = 1)thenseg7com <="1011"tmp_seg7data <= data_min_high;elsif (data_count_seg = 2)thenseg7com <="1101"tmp_seg7data <= data_h_low;elseseg7com <="1110"tmp_seg7data <= data_h_high;end if;elsif(data_mode = 1)then-模式1,红绿灯剩余时间显示if(data_mode_led = 0)then-夜间模式一直车走,显示-if(data_count_seg = 0)thenseg7com <="0111"tmp_seg7data <= 16; elsif (data_count_seg = 1)thenseg7com <="1011"tmp_seg7data <= 16;elsif (data_count_seg = 2)thenseg7com <="1101"tmp_seg7data <= 16; elseseg7com <="1110"tmp_seg7data <= 16; end if;elsif(data_mode_led = 1)then-车通行剩余时间if(data_count_seg = 0)thenseg7com <="0111"tmp_seg7data <= (data_time_cp - data_time_count)rem 10; elsif (data_count_seg = 1)thenseg7com <="1011"tmp_seg7data <= (data_time_cp - data_time_count)/ 10;elsif (data_count_seg = 2)thenseg7com <="1101"tmp_seg7data <= 16; elseseg7com <="1110"tmp_seg7data <= 16; end if;elsif(data_mode_led = 2)then-人通行剩余时间if(data_count_seg = 0)thenseg7com <="0111"tmp_seg7data <= (data_time_cp+3+data_time_pp) - data_time_count)rem 10; elsif (data_count_seg = 1)thenseg7com <="1011"tmp_seg7data <= (data_time_cp+3+data_time_pp) - data_time_count)/ 10;elsif (data_count_seg = 2)thenseg7com <="1101"tmp_seg7data <= 16; elseseg7com <="1110"tmp_seg7data <= 16;end if;else -黄灯则显示00if(data_count_seg = 0)thenseg7com <="0111"tmp_seg7data <= 0; elsif (data_count_seg = 1)thenseg7com <="1011"tmp_seg7data <= 0;elsif (data_count_seg = 2)thenseg7com <="1101"tmp_seg7data <= 16; elseseg7com <="1110"tmp_seg7data <= 16;end if;end if;elsif(data_mode = 2)then-模式2,红绿灯时间显示if(data_count_seg = 0)thenseg7com <="0111"tmp_seg7data <= data_time_pp rem 10; elsif (data_count_seg = 1)thenseg7com <="1011"tmp_seg7data <= data_time_pp / 10; elsif (data_count_seg = 2)thenseg7com <="1101"tmp_seg7data <= data_time_cp rem 10; elseseg7com <="1110"tmp_seg7data <= data_time_cp /10; end if;else-模式3,白天黑夜设定时间显示if(data_count_seg = 0)thenseg7com <="0111"tmp_seg7data <= data_time_nightin rem 10; elsif (data_count_seg = 1)thenseg7com <="1011"tmp_seg7data <= data_time_nightin / 10; elsif (data_count_seg = 2)thenseg7com <="1101"tmp_seg7data <= data_time_nightout rem 10; elseseg7com <="1110"tmp_seg7data <= data_time_nightout / 10; end if;end if;end process;-process(sysclk) -24小时时钟计数 begin if rising_edge(tmp_sig_min) then -输入信号为分钟,当分钟输入信号为上升沿时触发data_min_low<=data_min_low+1; -开始计数if(data_min_low = 9)then -分钟低位达到最大值,执行进位data_min_low <=0; -清零data_min_high<=data_min_high+1;if(data_min_high = 5)then -满一小时进位给小时data_min_low <=0; -清零data_min_high <=0;data_h_low <= data_h_low+1;data_h <= data_h+1;if(data_h_low = 9 )then -小时低位满进位给小时高位data_min_low <=0; -清零data_min_high <=0;data_h_low <=0;data_h_high <=data_h_high+1;end if;end if; end if; end if;if(data_h = 24)then

    注意事项

    本文(基于FPGA的智能交通灯设计附VHDL语言程序.doc)为本站会员(scccc)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开