实验报告设计题目:交通信号控制器班级:学号:姓名:指导老师:设计时间:2011年4月交通信号控制器的VHDL设计一、设计任务:模拟十字路口交通信号灯的工作过程,利用实验板上的两组红、黄、绿LED作为交通信号灯,设计一个交通信号灯控制器。要求:(1)交通灯从绿变红时,有4秒黄灯亮的间隔时间;(2)交通灯红变绿是直接进行的,没有间隔时间;(3)主干道上的绿灯时间为40秒,支干道的绿灯时间为20秒;(4)在任意时间,显示每个状态到该状态结束所需的时间。支干道主干道图1路口交通管理示意图ABCD主干道交通灯绿(40秒)黄(4秒)红(20秒)红(4秒)支干道交通灯红红绿黄表1交通信号灯的4种状态二、设计目的:设计交通灯控制系统主要是为了实现城市十字交叉路口红绿灯的控制。通过对QuartusII软件使用方法与技巧的学习,掌握VHDL程序设计的实现,熟悉可编程逻辑器件的使用。同时加深对交通灯控制系统的了解与应用。三、设计方案:时间显示数据输出红黄绿灯信号输出图2交通信号灯控制器的原理框图CLK时间显示数据输出信号灯输出图3交通信号灯控制器程序原理框图四、程序清单和说明:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYTRAFFICISPORT(CLK:INSTD_LOGIC;LED7S1:OUTSTD_LOGIC_VECTOR(6DOWNTO0);--数码管高位显示数字LED7S2:OUTSTD_LOGIC_VECTOR(6DOWNTO0);--数码管低位显示数字LIGHT:OUTSTD_LOGIC_VECTOR(5DOWNTO0));--各交通灯显示ENDENTITY;ARCHITECTUREONEOFTRAFFICISTYPESTATESIS(STA,STB,STC,STE);--定义状态变量SIGNALST0:STATES;SIGNALST1:STATES;SIGNALFULL:STD_LOGIC;SIGNALFOUT:STD_LOGIC;时钟输出信号(秒频)SIGNALTIME:STD_LOGIC_VECTOR(6DOWNTO0);时间计数值SIGNALTIME_LEFT:STD_LOGIC_VECTOR(6DOWNTO0);显示时间剩余值状态发生器(两位二进制计数器)定时时间到检测电路预置数产生电路计时器1秒时钟脉冲信号发生器红黄绿灯输出控制电路(RYG)秒脉冲信号发生器(进程P1和P2)计数器(进程P3、P4和P5)状态寄存器(进程P6)次态发生器信号灯输出信号(进程P7)SIGNALT_HIGH:STD_LOGIC_VECTOR(1DOWNTO0);高位显示SIGNALT_LOW:STD_LOGIC_VECTOR(6DOWNTO0);低位显示BEGINPROCESS(CLK)--秒脉冲产生进程(分频作用)VARIABLECNT8:STD_LOGIC_VECTOR(7DOWNTO0);BEGINIFCLK'EVENTANDCLK='1'THENIFCNT8=11111111THENCNT8:=00000000;--当CNT8计数计满时,给计数器CNT8预置数FULL='1';--同时使溢出标志信号FULL输出为高电平ELSECNT8:=CNT8+1;--否则继续作加1计数FULL='0';--且输出溢出标志信号FULL为低电平ENDIF;ENDIF;ENDPROCESS;PROCESS(FULL)VARIABLECNT2:STD_LOGIC;BEGINIFFULL'EVENTANDFULL='1'THENCNT2:=NOTCNT2;IFCNT2='1'THENFOUT='1';ELSEFOUT='0';ENDIF;ENDIF;ENDPROCESS;--FOUT输出是时钟信号PROCESS(FOUT)--计数模块。此模块定义一个变量time,当其值不超过63时实现循环加1功能,超过63则time值归零。IFFOUT'EVENTANDFOUT='1'THENIFTIME67THENTIME=TIME+1;ELSETIME=0000000;ENDIF;ENDIF;ENDPROCESS;PROCESS(FOUT,ST0,TIME)--状态转换模块。此模块利用状态机得设计方法,实现主干道和支干道交通信号灯不同状态之间的转变,信号灯状态用实验箱上的发光二极管显示,主干道和支干道在一个状态内的剩余时间由实验箱上两个个七段显示数码管显示CASEST0ISWHENSTA=IFTIME=39THENST1=STB;ELSEST1=STA;ENDIF;LIGHT=001100;TIME_LEFT=39-TIME;WHENSTB=IFTIME=43THENST1=STC;ELSEST1=STB;ENDIF;LIGHT=010100;TIME_LEFT=43-TIME;WHENSTC=IFTIME=63THENST1=STE;ELSEST1=STC;ENDIF;LIGHT=100010;TIME_LEFT=63-TIME;WHENSTE=IFTIME=67THENST1=STA;ELSEST1=STE;ENDIF;LIGHT=100001;TIME_LEFT=67-TIME;ENDCASE;IFFOUT'EVENTANDFOUT='1'THENST0=ST1;ENDIF;ENDPROCESS;PROCESS(TIME_LEFT)--时间显示进程BEGINIFTIME_LEFT=30THENT_HIGH=11;T_LOW=TIME_LEFT-30;ELSIFTIME_LEFT=20THENT_HIGH=10;T_LOW=TIME_LEFT-20;ELSIFTIME_LEFT=10THENT_HIGH=01;T_LOW=TIME_LEFT-10;ELSET_HIGH=00;T_LOW=TIME_LEFT;ENDIF;ENDPROCESS;PROCESS(T_HIGH,T_LOW)--译码模块。该模块为七段显示数码管的译码程序BEGINCASET_HIGHISWHEN00=LED7S1=0111111;WHEN01=LED7S1=0000110;WHEN10=LED7S1=1011011;WHEN11=LED7S1=1001111;WHENOTHERS=NULL;ENDCASE;CASET_LOWISWHEN0000000=LED7S2=0111111;WHEN0000001=LED7S2=0000110;WHEN0000010=LED7S2=1011011;WHEN0000011=LED7S2=1001111;WHEN0000100=LED7S2=1100110;WHEN0000101=LED7S2=1101101;WHEN0000110=LED7S2=1111101;WHEN0000111=LED7S2=0000111;WHEN0001000=LED7S2=1111111;WHEN0001001=LED7S2=1101111;WHENOTHERS=NULL;ENDCASE;ENDPROCESS;ENDARCHITECTURE;为实现硬件测试,实验箱应选模式6状态,但此时可用的四个数码管中有两个数码管端口与用到的LED灯端口相同,理论上互不影响,但实际测试时却不能同时定义。由于时间紧张没有过多调试,故在实际测试时对程序进行了修改,将原本需要四个数码管分别显示主干道和支干道信号灯状态改为两个数码管显示A、B、C、D四个不同状态的剩余时间五、仿真结果:六、引脚设置:根据电路模式6进行引脚选择七、硬件测试及结果:1.将引脚锁定后,选择电路模式六。2.对线路的连接进行检查,确保联通正确。3.将程序下载到实验箱中,自动运行,观察实验结果与程序所设计的过程是否相符,达到实验预期要求。八、实验心得体会:经过本次的课程设计,不仅让我进一步巩固了所学电子设计自动化的理论知识,而且也对QuartusII软件的基本操作有了更熟练的掌握。确认选题之后,首先查阅相关的资料,理解原理并确定设计的基本思路方向。然后仔细分析进行VHDL程序设计,采用分模块实现功能。在编写程序的刚开始,问题百出,才发现自己对语法结构的掌握不够牢固,重新查找书本资料以及与同学互相交流探讨才逐一解决。其中印象最深刻的便是电路模式的选择,不同的模式,需要的位长不一样,而且有的需要译码,有的并不需要。本次设计由于选择了模式了需要在程序中包含译码模块,而且由于引脚的重合,只能使主干道和支干道共用数码管,而且使输出红灯倒计时结束后接着来一个短时间(4S)的红灯(这是由于另一干道的黄灯显示导致的),这在实际中是不可取的这一整个过程也加深了自己对交通信号灯控制器原理的了解,同时也更熟悉课程设计的一般流程,为以后其他课题的设计积累了一定的经验。程序编程完成后,在软件中进行仿真,观察结果。由于实验箱的时钟不是很对换了一个实验箱,但是仍然在256HZ以下的频率不走。只有选择高频率,同时调节分频使程序内部时钟仍然保持为约等于1HZ在此次课程设计中我明白了:每一个环节都需要细致,各个过程相互关联并影响。在程序下载后发现出现乱码,找了半天最后才发现是自己把七段数码管的位置顺序记错了,幸好程序内部的译码是摘录的书上,更改时只需要把显示管的引脚的顺序反过来。完整编写程序与思考排错、动手调试,都是一种实际的锻炼,切实的提高,以后要多培养自己的钻研精神,多实际动手,全面提升学习技术和解决问题的能力。