您好,欢迎访问三七文档
1目录目录..............................................................11引言................................................................22设计要求............................................................23设计思路............................................................34、算法设计...........................................................65、VHDL程序..........................................................86、功能仿真与时序仿真................................................167、总结..............................................................212基于VHDL的交通灯控制器的设计与仿真王曦SY06174081引言可编程器件的广泛应用,为数字系统的设计带来了极大的灵活性。可编程器件可以通过软件编程对硬件的结构和工作方式进行重构,使得硬件的设计可以如同软件设计那样快捷方便。高速发展的FPGA、CPLD兼有串、并行工作方式和高速、高可靠性的特点,在电子系统设计中得到了广泛应用。通常使用硬件描述语言(HardwareDescriptionLanguage,HDL)进行数字电子系统设计。目前应用广泛的硬件描述语言有:VHDL语言,VerilogHDL语言,AHDL语言。VHDL语言由于具有强大的行为描述能力和丰富的仿真语句从而成为系统设计领域最佳的硬件描述语言。鉴于如上所述,本系统使用VHDL语言进行设计,采用自上向下的设计方法。目标器件选用Xilinx公司的FPGA器件,并利用XilinxISE7.1进行VHDL程序的编译与综合,然后用ModelsimXilinxEdition6.1进行功能仿真和时序仿真。2设计要求图1十字路口交通灯示意图3设计如图1所示的十字路口交通灯的控制器;四个方向各有四组灯:人行道灯、自行车道灯、直行灯和转弯灯,每组灯有红、黄和绿三种状态;人行道灯和自行车道灯在从绿变黄要闪n下这里n=3,人行道灯绿灯持续时间1分钟,自行车道灯绿灯持续时间2分钟,直行灯绿灯持续时间要长一些这里设为4分钟;转弯灯只有在这个方向的直行灯变红灯后才变黄灯变绿灯,绿灯时间1分钟,转弯灯变成红灯后,另一个方向的人行道灯、自行车道灯、直行灯同时从红灯变黄灯变绿灯;只要有一个方向有一个绿灯,另一个方向的灯均为红灯;还要留一个手控接口,控制某个方向的绿灯的持续时间与正常状态比都延长3分钟;注意南北方向和东西方向的灯的状态要配合好。3设计思路可以知道,从东往西的交通灯的工作状态和从西往东的完全一致,南北方向也是如此,所以四个方向交通灯的工作情况可以简化为对东-西、南-北两个方向灯的分析。下面的讨论都只针对这两个方向。首先分析系统的工作状态。东-西方向四组灯(直行灯、左转弯灯、人行灯、自行车灯)的每个红、黄、绿灯都有亮和灭两种状态,也就是说东西方向的灯应该有212种工作状态,但实际上它只有12种工作状态(第8种状态和第12种状态重复,第9种状态和第11种状态重复);南-北方向的情况类似。把东-西方向和南-北方向的交通灯放在一起考虑,整个系统共有24种工作状态(包括4个重复状态)。根据设计要求,系统的工作状态如表1所示。4时序东-西方向南-北方向直行灯转弯灯人行灯自行车灯直行灯转弯灯人行灯自行车灯1黄红黄黄红红红红2绿红绿绿红红红红3绿红黄绿红红红红4绿红红绿红红红红5绿红红黄红红红红6绿红红红红红红红7黄红红红红红红红8红红红红红红红红9红黄红红红红红红10红绿红红红红红红11红黄红红红红红红12红红红红红红红红13红红红红黄红黄黄14红红红红绿红绿绿15红红红红绿红黄绿16红红红红绿红红绿17红红红红绿红红黄18红红红红绿红红红19红红红红黄红红红20红红红红红红红红21红红红红红黄红红22红红红红红绿红红23红红红红红黄红红24红红红红红红红红表1系统工作状态表5然后根据上面的分析定义状态变量。从表1可以看出当东-西方向通行时,南-北方向始终保持红灯亮,反之,当南-北方向通行时,东-西方向始终保持红灯亮,而且两者工作状况完全对称。所以只需定义一个状态变量flag用来标志通行的方向,两个方向公用一个表示状态更迭的状态变量lighter。最后确定输入、输出量。系统共有3个输入:时钟信号clk,复位信号rst,手动信号handset。其中时钟信号用来给信号灯定时,复位信号用来对整个系统进行初始化,手动信号用来控制某个方向的绿灯的持续时间比正常状态延长3分钟。整个系统有24个灯,每个灯的亮与灭分别通过一个输出变量来控制,详细定义如表2所示。每个输出变量可以取值为1或0,表示该灯的亮或灭;由于同一组中的红黄绿三个灯有且只有一个亮,所以任意时刻同一组输出变量中有且只有一个取值为1。输出变量含义输出变量含义a_g东-西直行绿灯e_g南-北直行绿灯a_y东-西直行黄灯e_y南-北直行黄灯a_r东-西直行红灯e_r南-北直行红灯b_g东-西左转绿灯f_g南-北左转绿灯b_y东-西左转黄灯f_y南-北左转黄灯b_r东-西左转红灯f_r南-北左转红灯c_g东-西人行绿灯g_g南-北人行绿灯c_y东-西人行黄灯g_y南-北人行黄灯c_r东-西人行红灯g_r南-北人行红灯d_g东-西自行车绿灯h_g南-北自行车绿灯d_y东-西自行车黄灯h_y南-北自行车黄灯d_r东-西自行车红灯h_r南-北自行车红灯表2系统输出变量定义64、算法设计首先对系统进行初始化操作,赋初始值给各个状态变量,让各个方向的交通灯处于初始工作状态。初始化操作具有最高优先级,信号rst高电平时有效。为了使系统按照表1所示循环工作,我们让状态变量lighter按图2所示顺序进行状态转移(G表示绿灯亮,Y表示黄灯亮,R表示红灯亮,例如GRYG代表直行绿灯亮,转弯红灯亮,人行黄灯亮,自行车绿灯亮):YRYYGRGGGRYGGRRGGRRYGRRRYRRRRRRRRYRRRGRRRYRRRRRR图2系统状态转移由于在一个循环过程中存在重复的状态变量值,如果当前时刻的状态不能惟一地确定下一时刻的状态,那么需要结合上一时刻的状态变量值来确定。PRE_STATE表示上一时刻的状态,CR_STATE表示当前时刻的状态。规定当flag=0时,东-西方向通行,南-北方向禁行,东-西方向的输出变量和状态变量取值一致(例如:若lighter=GRYG,则a_g=1,b_r=1,c_y=1,d_g=1),南-北方向的输出变量e_r=1,f_r=1,g_r=1,h_r=1;当flag=1时,南-北方向通行,东-西方向禁行,南-北方向的输出变量和状态变量取值一致,东-西方向的输出变量a_r=1,b_r=1,c_r=1,d_r=1。这样,系统的工作状态就可以按表1所示进行循环转移了。当手动信号handset=1时,所有状态变量和输出量保持原值,然后进入中断延时程序,延时3分钟后返回程序中断位置继续执行。算法流程如图3所示。7初始化,flag=0yeslight=YRYYrst=1light=GRGG2s时间到nonorst=1rst=1nohandset=1nolight=GRYG1min时间到yesyesrst=1nohandset=12s时间到noyeslight=GRRGrst=1nohandset=11min时间到nolight=GRRYyesnonononorst=1nohandset=12s时间到noyesnolight=GRRRrst=1nohandset=1no2min时间到yesnolight=YRRR2s时间到yesnoyesyesyesyesyesnorst=1yeslight=RRRR2s时间到yesnonorst=1yeslight=RYRR2s时间到yesnonorst=1yeslight=RGRRrst=1nohandset=12min时间到noyesnolight=RYRR2s时间到yesnonorst=1yeslight=RRRR2s时间到yesnonorst=1yesyesyes延时3min,返回yesyesyesyesyesyesflag=notflag图3算法流程图85、VHDL程序假设输入时钟信号的周期为1s,VHDL程序如下:----------------------------------------------------------------------------------Company:--Engineer:----CreateDate:21:22:0112/16/06--DesignName:--ModuleName:xixi-Behavioral--ProjectName:--TargetDevice:--Toolversions:--Description:----Dependencies:----Revision:--Revision0.01-FileCreated--AdditionalComments:----------------------------------------------------------------------------------libraryIEEE;---调用IEEE库useIEEE.STD_LOGIC_1164.ALL;---使用IEEE库中的IEEE.STD_LOGIC_1164包useIEEE.STD_LOGIC_ARITH.ALL;---和STD_LOGIC_ARITH包的所有项目useIEEE.STD_LOGIC_UNSIGNED.ALL;---实体说明规定设计单元的输入输出接口信号或引脚entityxixiis---定义输入和输出Port(clk:instd_logic;rst:instd_logic;handset:instd_logic;a_g:outstd_logic;a_y:outstd_logic;a_r:outstd_logic;b_g:outstd_logic;9b_y:outstd_logic;b_r:outstd_logic;c_g:outstd_logic;c_y:outstd_logic;c_r:outstd_logic;d_g:outstd_logic;d_y:outstd_logic;d_r:outstd_logic;e_g:outstd_logic;e_y:outstd_logic;e_r:outstd_logic;f_g:outstd_logic;f_y:outstd_logic;f_r:outstd_logic;g_g:outstd_logic;g_y:outstd_logic;g_r:outstd_logic;h_g:outstd_logic;h_y:outstd_logic;h_r:outstd_logic);endxixi;architectureBehavioralofxixiisTYPESTATE1IS(GR1,YR1,RY1,RR1,RG1);---定义状态变量取值范围TYPESTATE2IS(YY2,GG2,YG2,RG2,RY2,RR2);SIGNALCR1_STATE,PRE1_STATE:STATE1;SIGNALCR2_STATE,PRE2_STATE:STATE2;SIGNALCT_TIME:integerRANGE0TO200;SIGNALcount,
本文标题:VHDL
链接地址:https://www.777doc.com/doc-1715711 .html