《PLD与现代传感技术应用》课程论文基于VHDL的交通信号灯的设计学院:电信学院专业:控制工程姓名:王晋学号:102430111356基于VHDL的交通信号灯的设计王晋(辽宁科技大学电信学院,电信2010)摘要:交通灯控制系统在城市交通监管中起着极其重要的作用。应用VHDL语言,在Altera公司的QuartusII软件环境下,通过模块化编程完成了灯亮时间可调的交通灯控制系统设计,并进行了逻辑综合、仿真,系统的软件仿真测试结果满足了设计要求,达到了预期的效果。由于设计采EDA技术,不但大大缩短了开发研制周期,提高了设计效率,而且使系统具有设计灵活,实现简单,性能稳定的特点。关键词:交通灯控制;FPGA;VHDL;仿真0引言交通灯是城市交通监管系统的重要组成部分,对于保证机动车辆的安全运行,维持城市道路的顺畅起到了重要作用。目前很多城市交叉路口的交通灯实行的是定时控制,灯亮的时间是预先设定好的,在时间和空间方面的应变性能较差,一定程度上造成了交通资源的浪费,加重了道路交通压力。本文在EDA技术的基础上,利用FPGA的相关知识设计了交通灯控制系统,可以根据实际情况对灯亮时间进行自由调整,整个设计系统通过QuartusII软件进行了模拟仿真,并可以下载到FPGA器件中进行硬件的调试,验证其设计的交通信号灯控制电路预定的功能。1VHDL的特点随着电子技术的发展,数字系统的设计正朝高速度、大容量、小体积的方向发展,传统的自底而上的设计方法已难以适应形势。EDA(ElectronicDesignAutomation)技术的应运而生,使传统的电子系统设计发生了根本的变革。EDA技术就是依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言VHDL(VeryHiehSpeedIntegratedCircuitHardwareDescriptionLanguage)为系统逻辑描述手段自顶而下地逐层完成相应的描述、综合、优化、仿真与验证,直至生成器件。VHDL语言是目前应用于数字系统仿真最为实用的语言之一。VHDL语言最早由美国国防部提出。用VHDL语言进行数字逻辑电路和数字系统的设计,是电子电路设计方法上的一次革命性变革。与传统设计方法相比,VHDL描述电路行为的算法有很多优点:(1)设计层次较高、用于较复杂的计算时,能尽早发现存在的问题,缩短设计周期;(2)独立实现,修改方便,系统硬件描述能力强;(3)可读性好,有利于交流,适合于文档保存;(4)VHDL语言标准、规范、移植性强;(5)VHDL类型众多而且支持用户自定义类型,支持自顶而下的设计方法和多种电路的设计。2交通灯设计说明启动交通灯首先将开关rest由低电平状态置为高电平状态(复位信号,低电平时有效),则系统就会进入稳定的工作状态。分load0和load1两路交通灯。初始状态为load0绿灯亮,load1红灯亮。30秒后,load0和load1均变黄,持续5秒后,load0为红灯亮,load1为绿亮。30秒后,load0和load1均变黄,持续5秒,如此交替循环。3交通灯设计思路框图图1交通灯设计框图4软件流程图及程序根据交通灯信号控制的要求,可把它分解为定时器和控制器两部分。CLK:时钟脉冲;rest:复位信号,低电平有效。r0:road0红灯;y0:road0黄灯;g0:road0绿灯。r1:road1红灯;y1:road1黄灯;g1:road1绿灯。(如图1所示)。主控制电路设计程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;useieee.std_logic_arith.all;ENTITYfzISPORT(clk:INSTD_LOGIC;rest:instd_logic;r0,y0,g0,r1,y1,g1:outstd_logic);ENDENTITYfz;ARCHITECTUREbehavioralOFfzISconstantyellow_time:integer:=5;constantgreen_time:integer:=30;constantred_time:integer:=30;signalp,f:integerrange0to3;signalclk_500:std_logic;BEGINtemp1:process(clk)variablecnt1:integerrange0to2;variablecnt2:integerrange0to3;BEGINifclk'eventandclk='1'thenifcnt1=2thencnt1:=0;ifcnt2=3thencnt2:=0;clk_500<=notclk_500;elsecnt2:=cnt2+1;endif;elsecnt1:=cnt1+1;endif;endif;endprocesstemp1;--当clk周期为10ns时,分频后200*250*2,周期为1stemp2:process(clk_500)variableload0,load1:integer;beginifrest='0'thenf<=0;load0:=green_time;load1:=red_time;r0<='0';y0<='0';g0<='1';r1<='1';y1<='0';g1<='0';elsifclk_500'eventandclk_500='1'the...