基于VHDL的交通灯控制系统设计 -毕业论文_第1页
基于VHDL的交通灯控制系统设计 -毕业论文_第2页
基于VHDL的交通灯控制系统设计 -毕业论文_第3页
基于VHDL的交通灯控制系统设计 -毕业论文_第4页
基于VHDL的交通灯控制系统设计 -毕业论文_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【标题】基于VHDL的交通灯控制系统设计【作者】周彦伶【关键词】VHDL硬件描述语言

交通灯

控制系统

设计

仿真

硬件测试【指导老师】李金田【专业】电子信息科学与技术【正文】

1

绪言

随着现代社会经济的发展,城市机动车量的不断增加,许多大城市出现了交通负荷运行的情况。城市道路交叉口是城市道路网络的基本节点,也是网络交通流的瓶颈。目前,大部分无控制交叉口都存在高峰小时车流混乱、车速缓慢、延误情况严重、事故多发、通行能力和服务水平低下等问题。特别是随着城市车流量的的快速增长,城市无控制道路交叉口的交通压力越来越大。

分析现代城市交通控制与管理问题的现状,结合现代城乡交通的实际情况,交通信号灯是管理交通网络的最重要元素。因此,做好基于EDA技术平台的交叉口信号控制设计是缓解交通阻塞、提高城市道路交叉口车辆通行效率的有效办法。交通信号控制的目的是为城市道路交叉口(或交通网络)提供安全可靠和有效的交通流,通常最为常用的原则是车辆在交叉路口的通过量最大或车辆在交叉口的延误最小。提高十字路口的通行效率对缓解交通阻塞具有十分重要的现实意义。

因此,本文用VHDL语言设计一种简单实用的城市交通灯控制系统以解决现代城市的交通控制与管理问题,减少十字路口的交通阻塞状况。

1.1

交通灯控制系统研究现状

在现代社会交通中,交通灯控制系统起着非常重要的作用,在各个城市交叉路口交通灯都必不可少,而随着车流量的不断增加,城市交通阻塞问题也越来越严重。如何提高城市交叉路口的通行效率成为城市交管部门的首要任务,因此,设计一种多功能的交通灯控制系统势在必行。

交通灯控制系统是数字电路的经典问题,传统的设计方法基于中、小规模集成电路进行,电路元件多、接线复杂、故障率高、可靠性低。电子设计自动化EDA(ElectronicDesignAutomation)技术的发展,在线可编程逻辑器件(InsystemProgram-ProgrammableLogicDevice简称ISP-PLD)的出现,使实验室中制作专用集成电路成为可能。使用现场可编程门阵列/复杂可编程逻辑器件FPGA/CPLD(FieldProgrammableGateArray/ComplexProgrammableLogicDevice),用VHDL(超高速集成电路硬件描述语言)

进行交通灯控制系统的设计,用对应的工具软件(本设计用QuartusII)对FPGA/CPLD芯片“下载”形成专用集成电路,由于不存在人工接线问题,所以故障率低、可靠性好。

交通灯控制系统的实现大致有以下几种方法:

1、采用通用集成逻辑器件设计

采用通用的集成逻辑器件组成的交通灯控制系统主要由控制器、定时器、译码器和秒脉冲信号发生器等部分组成。秒脉冲发生器是该系统中定时器和控制器的标准时钟信号源,译码器输出两组信号灯的控制信号,经驱动电路后驱动信号灯工作,控制器是系统的主要部分,由它控制定时器和译码器的工作.定时器由与系统脉冲同步的计数器构成要求计数器在状态信号作用下,首先清零,然后在时钟脉冲上升沿作用下,计数器从零开始进行增1计数,向控制器提供定时信号。

译码器的主要任务是将控制器的输出Q1、Q0的4种工作状态,翻译成甲、乙车道上6个信号灯的工作状态。

这是传统的方法,实际应用比较广泛,目前仍被设计者使用,但这种方法基于中、小规模集成电路进行,电路元件多、接线复杂几乎没有灵活性可言、故障率高、可靠性低。

2、采用单片微处理器作为核心设计

采用MSC-51系列单片机Intel8031和可编程并行I/O接口芯片8255A为中心器件来设计交通灯控制器,实现了能根据实际车流量通过8031芯片的P1口设置红、绿灯燃亮时间的功能;为了系统稳定可靠采用了MAX629“看门狗”芯片,避免了系统因为死机而停止工作的情况发生;显示时间直接通过8255的PA、PB口输出;交通灯信号通过PC口输出;交通灯的点亮采用VT双向晶闸管来控制,直接采用220V交流电源驱动。

这种方法由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,实用性强、操作简单、扩展性强,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。这种方法所用器件少,使用灵活,也得到广泛应用,但是在设计和调试的过程中,也出现了一些问题,如工作速度较低,功能修改及调试都需要硬件电路的支持等,在一定程度上增加了功能修改及系统调试的困难。

3、采用可编程逻辑器件设计

这种方法通过设计芯片来实现系统功能是基于芯片的设计方法。这种新设计方法能够由设计者定义器件内部逻辑和管脚,将原来由电路板设计完成的大部分工作放在芯的设计中进行。这样不仅可以通过芯片设计实现多种数字逻辑功能,而且由于管脚定义的灵活性,提高了工作效率。同时,基于芯片的设计可以减少芯片的数量,缩小体积、降低功耗、提高系统的性能和可靠性、易于修改等,成为当今实现数字系统设计的首选方案。

本设计是用VHDL硬件描述语言和可编程逻辑器件实现,这种方法可以灵活的用VHDL语言进行功能修改,使系统更为容易实现。系统分为三个模块:状态控制电路模块,倒计时电路模块和显示电路模块。

可编程器件的广泛应用,为数字系统的设计带来了极大的灵活性。由于可编程器件可以通过软件编程对硬件的结构和工作方式进行重构,使得硬件的设计可以如同软件设计那样快捷方便。由于高速发展的FPGA/CPLD兼有串、并行工作方式和高速、高可靠性的特点,在电子系统设计中得到了广泛应用。通常使用语言(HardwareDescriPtionLan-guage,HDL)进行数字电子系统设计。目前应用广泛的硬件描述语言有:VHDL语言,VerilogHDL语言,AHDL语言。VHDL语言由于具有强大的行为描述能力和丰富的仿真语句从而成为系统设计领域最佳的硬件描述语言。

综合比较这几种方法,采用可编程逻辑器件与VHDL相结合的方法设计较灵活、简单、可靠性高易于实现[1][2]。

1.2

交通灯控制系统设计内容

1.用VHDL硬件描述语言设计一个交通灯控制系统,系统包括人行道、左转、右转、以及基本的交通灯的功能。除基本交通灯功能外,还具有倒计时、时间设置以及紧急情况处理等功能;

2.用VHDL语言设计交通灯控制系统的方案选择、论证及设计框图;

3.用QuartusII软件设计及仿真分析;

4.用CPLD/FPGA进行硬件设计与测试。

2

交通灯控制系统设计

2.1

设计实现的功能

作为一个十字路口的交通灯控制系统,其东西、南北两个方向除了设置红、绿、黄、右转、左转五盏信号指示灯是否允许通行外,还设有时钟,以倒计时的方式显示每条路允许通行或禁止通行的时间以及特殊状况的处理。

东西、南北两个方向各种信号灯的亮、灭时间能非常方便地进行设置和修改,使系统既可以用于两方向相同的普通交叉路口,也可通过参数设置或修改用于通行时间不同的主辅路口。正常运行时,交通灯的状态转换表如表2-1所示。当东西、南北两个方向任一方向出现特殊情况,例如消防车、警车执行任务或其他车辆需要优先放行时,即可中断正常运行入特殊运行状态。此时两条道路上所有车辆都停止通行,红灯全亮,时钟停止计时,显示数字闪烁。当特殊运行状态结束后,系统恢复中断时的状态,继续运行。

2.2

交通阻塞原因分析

2.2.1

交叉口通行能力弱

若把路段看成边,交叉路口看成结点,以车行方向为流向的话,则城市交通就是名符其实的规范化的大型有向网络流问题。交通阻塞就是实际的流量超出了网络的边或结点的最大可通行的允许量的实际表现。交通网络流的最大可允许的通行量有两个:一是路段的最大允许通行量;二是结点上的最大允许通行量。

路段通行能力分析:通过观测路段的断面车流量数即可得到路段的通行量。国内外许多研究表明,路段上一般不会发生阻塞和拥挤现象;除非个别情况,比如:出了交通事故,又要保留现场,整条车道上的车子就得停在原地不动;有些车子违章乱放,占用部分车道,造成车辆通行困难;在无港湾式停靠站的地方,公交靠边停站占据非机动车道上、下乘客,造成非机动车辆弯向机动车道等。以上这些都是临时的带偶然性的阻塞现象,只要加强管理就会得到纠正。所以说,在由色灯控制的运行系统里,一般来说,路段是不会因为通行能力不够而产生阻塞。于是交通拥挤现象的症结在道路交叉口。

交叉口通行能力分析:比如“十”字型交叉的平面路口。典型的“十”字型交叉路口图2-1。当前普遍是采用“红黄绿”色灯,根据交叉路流量的具体情况,由色灯分配通行权。在“交叉口”,同样一条车道,不仅要通行东西向的车辆,还要通行南北方的车辆,从通过时间上来说,东西向和南北向各摊一半,通车量也就下降了一半。若考虑到其它的时间损失,诸如左转车辆干扰损失、自行车干扰损失等,交叉口的通行能力实际上只有路段通行能力的30~45%。正因为交叉路口可允许的通行能力过低,客观上就形成了瓶颈,一旦路段上车流数量稍多,阻塞便会出现

2.2.2

其它原因

(1)没有专用公交车道,也没有停车港湾,公交车停靠、启动等对车流影响较大;

(2)车道过窄,人流太多,没有自行车道,横行人流对行车影响尤大;

(3)前面交叉路口红灯排队长度过长;

(4)有些车辆违反交通规定;

(5)右行车辆对直行车量的干扰等。

2.3

十字路口情况分析

当车辆行驶到如图2-1所示十字路口时,需要直行、左转和右转,行人也要通过,如果没有统一的秩序,东南西北四个方向的车都同时向各个方向行驶,行人也同时过马路的话就会造成交通阻塞和混乱甚至发生交通事故都难以避免。因此,在十字路口每个入口处设置红、绿、黄、左拐、右拐允许五盏信号灯,和在人行道处设置红、绿两盏信号灯。红灯亮禁止通行,绿灯亮表示该方向允许通行,黄灯则给行驶中的车辆有时间停在禁行线外,已超过禁行线的车辆有时间通过,左拐灯亮允许车辆向左拐弯,右拐灯亮允许车辆向右拐弯。

2.4

设计方案比较

方案一:在十字路口只设置红、绿、黄三色灯。这种方案设计比较简单,系统的功能也比较少,只适用于车流量少的小型的交叉口。对现代车流量大的城市路口不适用。

方案二:十字路口设有红、绿、黄、左转四色灯,路口设有右转铺道。在现在的许多大城市十字路口都采用这种方案,因为它没有右转灯,设有专门的右转车道,一定程度上缓解交通阻塞问题,对缓解交通阻塞问题是一种很好的方案。但是这种方案占地面积大,交通灯的功能也比较少。

方案三:十字路口设有红、绿、黄、左转、右转五色灯,右转灯跟绿灯同时亮。这种方案,由于右转灯同绿灯同时亮,而与绿灯方向平行的人行道的绿灯也同时亮,这就造成了右转与行人相冲突,安全性不高。许多城市十字路口仍采用这种方案。虽然这种方案交通灯的功能比较多,但设计也比较麻烦。

方案四:十字路口设有红、绿、黄、左转、右转五色灯,绿灯灭后右转灯才亮。这种方案解决了第三种方案安全性不高的缺点,但是由于此种方案的右转灯在绿灯灭后才亮,增加了系统等待时间,如果信号灯之间的时间设得不恰当也同样会造成交通阻塞。这种方案交通灯的功能比较多,设计也比较简单。

综合考虑采本设计采用方案四,只要信号灯点亮的时间设得合理,就会是一种非常完整、理想的交通灯控制系统

2.5

交通灯工作原理

2.5.1

交通灯转换过程

交通灯的功能是控制各个方向的车辆向不同的方向行驶和行人过马路,而不造成交通阻塞。根据交通信号灯的变换顺序;(对向是同时变换的,即东西方向同时变换、南北方向同时变换)根据图2-1有:

S1:东西方向直行绿灯亮时,位于南北方向的两个人行道绿灯同时亮,南北方向红灯,位于东西方向的两个人行道红灯;

S2:东西方向黄灯亮,位于南北方向的两个人行道绿灯亮,南北方向红灯,位于东西方向的两个人行道红灯;

S3:东西方向右转灯亮,南北方向红灯,所有人行道红灯;

S4:东西方向黄灯亮,南北方向红灯,所有人行道红灯;

S5:东西方向左转灯亮,南北方向红灯,所有人行道红灯;

S6:东西方向黄灯亮,南北方向红灯,所有人行道红灯;

S7:南北方向绿灯亮,位于东西方向的两个人行道绿灯同时亮,东西方向红灯,位于南北方向的两个人行道红灯;

S8:南北方向黄灯亮,位于东西方向的两个人行道绿灯亮,东西方向红灯,位于南北方向的两个人行道红灯;

S9:南北方向右转灯亮,东西方向红灯,所有人行道红灯;

S10:南北方向黄灯亮,东西方向红灯,所有人行道红灯;

S11:南北方向左转灯亮,东西方向红灯,所有人行道红灯;

S12:南北方向黄灯亮,东西方向红灯,所有人行道红灯

2.5.2

交通灯控制状态表

交通灯状态转移表2-1所列,表中“1”表示灯亮,“0”表示灯灭。

从状态表可以看出,每个方向五种灯亮、灭是有顺序的,每个方向红灯亮的时间正好等于另一方向绿灯、3次黄灯、左转灯、右转灯亮的时间总和。人行道绿灯亮的时间跟平行方向绿灯亮时间和黄灯时间之和相等,人行道红灯亮时间等于两个方向车道红灯时间总和减去人行道绿灯亮时间。交通灯状态之间的转换时间太长也会造成交通阻塞,因此每种信号灯点亮的时间也要设置合理,设绿灯亮30s,黄灯亮4s,右转灯亮15s,左转灯亮20s,则红灯亮77s,人行道绿灯亮34s,人行道红灯亮120s

表2-1交通灯状态转换表

东西方向南北方向

状态绿黄右拐黄左拐黄红人行绿人行红绿黄右拐黄左拐黄红人行绿人行红

S1100000001000000110

S2010000001000000110

S3001000001000000101

S4000100001000000101

S5000010001000000101

S6000001001000000101

S7000000110100000001

S8000000110010000001

S9000000101001000001

S10000000101000100001

S11000000101000010001

S12000000101000001001

2.6

设计原理框图

根据上述对交通信号灯的功能要求,可把控制系统划分为三个模块:倒计时电路模块,功能控制电路模块和显示控制电路模块,控制系统的输入信号除时钟信号外,还有初始化信号INI,特殊状态信号SPE;输出信号为各交通信号灯的显示驱动信号以及各信号灯亮灯时间的显示驱动信号。如图2-2所示。

2.6.1

各模块功能分析

倒计时电路按各种交通信号灯的亮灯时间,亮灯顺序,设定东西、南北两个方向计数器的初值,随之进行减法计数,计数脉冲为秒信号CLK;输出交通信号灯亮灯的信号dxr0,dxg0,dxy0,dxri0,dxl0,dxpr0,dxpg0,nbr0,nbg0,nby0,nbri0,nbl0,nbpr0,nbog0,以及相应于各状态的剩余时间信号dxtime0,dxptime0,nbtime0,nbptime0。这一部分电路是系统的核心,具体实现可以通过设置一个状态机,记忆正常运行时交通灯亮灯的状态与顺序依据状态机的状态逐次设定对应的计数初值;计数器进行减法计数,计数至1再减为0时则进行状态转换由状态机的状态确定输出的交通信号灯的点亮状态以及相应于各状态的剩余时间。INI为电路的初始化信号,EN为计数器的“计数/保持”控制信号。

状态控制电路的作用是对电路工作状态的切换进行控制。通过它将按鍵信号“紧急/正常”(SPE)转变为计时电路和显示控制电路的控制信号EN,在“触发(按下-松开)-再触发(按下-松开)-再触发(按下-松开)”过程中,依次起的作用是“特殊-正常-特殊”。用有限状态机可以清晰地描述这类电路。

显示电路的作用是对计时电路的输出信号进行选通控制。在EN信号控制下,当出现特殊情况时,即中断正常运行,进入特殊状态,使红灯全亮,倒计时时钟停止计时,并且利用CLK信号,使显示数字闪烁。特殊运行状态结束后,则恢复中断时的状态,继续正常运行

2.6.2

状态控制电路的有限状态机

SP为特殊/正常鍵的输入信号,SP=1时表示松开,SP=0时表示按下,状态输出只有两个值,即正常和紧急。每次开关按下后都需要等待开关抬起,故状态机共有四个状态:正常(S3)、保持(S0)、紧急(S1)、保持(S2)。状态转换如图2-3所示。

2.7

信号灯的有限状态机

正常情况下信号灯的点亮时间由计数器(C)计数至1再减为0时进行状态转换,其它时间信号灯点亮状态不变。由交通灯状态转换表可得正常情况下信号灯之间的转换图如图2-4所示

2.8

本章小结

本章主要介绍交通灯控制系统的工作及设计原理,根据我国城市的十字路口交通状况设计一个合理的交通信号灯控制系统。经过综合比较,该系统采用红、黄、绿、左转、右转五种信号灯,用于控制十字路口车辆和行人的通行。系统由倒计时电路模块,功能控制电路模块和显示控制电路模块组成。

3VHDL程序设计

3.1

功能控制电路的VHDL源程序

LIBRARYieee;

--功能控制模块

USEieee.std_logic_1164.ALL;

useieee.std_logic_unsigned.ALL;

ENTITYCTRLIS

PORT(CLK,SPE:INSTD_LOGIC;

EN:OUTSTD_LOGIC);

END;

ARCHITECTUREBEHAVEOFCTRLIS

TYPEstatesIS

(s3,s2,s1,s0);

SIGNALcurrent_state,next_state:states;

BEGIN

COM:PROCESS(spe,current_state)

BEGIN

CASEcurrent_stateis

WHENs0=>EN<='0';

--EN=0,系统处于正常情况。

IFSPE='1'THENnext_state<=s0;

--SPE=1,保持。

elsenext_state<=s1;

--否则启动紧急情况。

ENDIF;

WHENs1=>EN<='1';

--EN=1,出现紧急情况。

IFSPE='1'THENnext_state<=s2;

--SPE=1,保持。

ELSEnext_state<=s1;

--否则启动紧急情况

ENDIF;

WHENs2=>EN<='1';

--EN=1,出现紧急情况。

IFSPE='1'THENnext_state<=s2;

--SPE=1,保持。

ELSEnext_state<=s3;

--否则启动正常情况。

ENDIF;

WHENs3=>EN<='0';

--EN=0,系统处于正常情况。

IFSPE='1'THENnext_state<=s0;

--SPE=1,保持。

ELSEnext_state<=s3;

--否则启动正常情况。

ENDIF;

ENDCASE;

ENDPROCESS;

SYNCH:PROCESS(CLK)

BEGIN

IFCLK'EVENTANDCLK='1'THEN

current_state<=next_state;

--状态在时钟上升沿发生变化。

ENDIF;

ENDPROCESS;

ENDbehave;

3.1.1

设计说明

功能控制电路(文件名为ctrl.vhd),在按钮信号SPE和时钟信号CLK作用下输出EN信号。EN为1时表示进入特殊状态;为0时,表示处于正常状态。

3.2

倒计时电路源程序

LIBRARYieee;--倒计时模块

USEieee.std_logic_1164.ALL;

USEieee.std_logic_unsigned.ALL;

ENTITYcountIS

PORT(ini,EN,CLK:INSTD_LOGIC;

--INI为初始化信号,CLK为秒时钟脉冲,EN=1紧急情况。

dxr0,dxg0,dxy0,dxri0,dxl0,dxpr0,dxpg0,nbr0,nbg0,nby0,nbri0,nbl0,nbpr0,nbpg0:OUTSTD_LOGIC;

tdxh:BUFFERSTD_LOGIC_VECTOR(6DOWNTO4);

tdxl:BUFFERSTD_LOGIC_VECTOR(3downto0);--倒计时显示东西方向所亮灯剩余时间。

tdxph:bufferstd_logic_vector(8downto4);

tdxPl:bufferstd_logic_vector(3downto0);--倒计时显示东西方向人行道所亮灯剩余时间。

tnbh:BUFFERSTD_LOGIC_VECTOR(6DOWNTO4);

tnbl:BUFFERSTD_LOGIC_VECTOR(3downto0);--倒计时显示南北方向所亮灯剩余时间。

tnbph:bufferstd_logic_vector(8downto4);

tnbpl:bufferstd_logic_vector(3downto0));--倒计时显示南北方向人行道所亮灯剩余时间。

ENDcount;

architecturebehofcountis

signallight:std_logic_vector(13downto0);

signal

tdx:std_logic_vector(6downto0);

signal

tdxp:std_logic_vector(8downto0);

signal

tnb:std_logic_vector(6downto0);

signal

tnbp:std_logic_vector(8downto0);

signals:std_logic_vector(3downto0);--亮灯状态。

constantdxnbgth:std_logic_vector(6downto4):="011";

constantdxnbgtl:std_logic_vector(3downto0):="0000";--设置绿灯亮时间30s。

constantdxnbyth:std_logic_vector(6downto4):="000";

constantdxnbytl:std_logic_vector(3downto0):="0100";--设置黄灯亮时间4s。

constantdxnbrith:std_logic_vector(6downto4):="001";

constantdxnbritl:std_logic_vector(3downto0):="0101";--设置右转灯亮时间15s。

constantdxnblth:std_logic_vector(6downto4):="010";

constantdxnbltl:std_logic_vector(3downto0):="0000";--设置左转灯亮时间20s。

constantdxnbprth:std_logic_vector(8downto4):="10010";

constantdxnbprtl:std_logic_vector(3downto0):="0000";--设置人行道红灯亮时间120s。

constantdxnbpgth:std_logic_vector(8downto4):="00011";

constantdxnbpgtl:std_logic_vector(3downto0):="0100";--设置人行道绿灯亮时间34s。

constantdxnbrth:std_logic_vector(6downto4):="111";

constantdxnbrtl:std_logic_vector(3downto0):="0111";--设置红灯亮时间77s。

begin

process(ini,EN,CLK,tdxh,tdxl,tdxph,tdxpl,tnbh,tnbl,tnbph,tnbpl)

begin

tdx<=tdxh

&tdxl;

tdxp<=tdxph

&tdxpl;

tnb<=tnbh

&tnbl;

tnbp<=tnbph

&tnbpl;

ifINI='1'THEN

tdxh<="000";

tdxl(3)<='0';

tdxl(2)<='0';

tdxl(1)<='0';

tdxl(0)<='1';

tdxph<="00000";

tdxpl(3)<='0';

tdxpl(2)<='0';

tdxpl(1)<='0';

tdxpl(0)<='1';

tnbh<="000";

tnbl(3)<='0';

tnbl(2)<='0';

tnbl(1)<='0';

tnbl(0)<='1';

tnbph<="00000";

tnbpl(3)<='0';

tnbpl(2)<='0';

tnbpl(1)<='0';

tnbpl(0)<='1';--初始化,所有的倒计时显示1s。

else

ifCLK'eventandCLK='1'then

ifEN='1'then

tdxh<=tdxh;

tdxl<=tdxl;

tdxph<=tdxph;

tdxpl<=tdxpl;

tnbh<=tnbh;

tnbl<=tnbl;

tnbph<=tnbph;

tnbpl<=tnbpl;--紧急情况,所有的倒计时保持原来的数不变。

light<="10000101000010"

else

if

((tdx=1)or

(tnb=1))then

s<=s+1;

--东西或南北方向有倒计时显示1s,则跳到下个状态。

casesis

when

"0000"=>tdxh<=dxnbgth;tdxl<=dxnbgtl;--东西方向倒计时时间等于绿灯亮的时间,东西方向绿灯亮。

tdxph<=dxnbprth;tdxpl<=dxnbprtl;--东西方向人行道倒计时时间等于红灯亮的时间,人行道东西方向红灯亮。

tnbh<=dxnbrth;

tnbl<=dxnbrtl;--南北方向倒计时时间等于红灯亮的时间,南北方向红灯亮。

tnbph<=dxnbpgth;tnbpl<=dxnbpgtl;--南北方向人行道倒计时时间等于绿灯亮的时间,人行道南北方向绿灯亮。

light<="01000101000001";

--东西方向绿灯亮,人行道红灯亮;南北方向红灯亮,人行道绿灯亮。

when

"0001"=>tdxh<=dxnbyth;tdxl<=dxnbytl;--东西方向倒计时时间等于黄灯亮的时间,东西方向黄灯亮。

tdxph<=dxnbprth;tdppl<=dxnbprtl;

tnbh<=dxn?rth;

tnbl<=dxnbrtl;

tnbph<=dxnbPgth;tnbpl<=dxnbpgtl;

light<="00100101000001";

--东西斩向軄灯亮,人行道红灯亮;南北方向红灯亮,人行道绿灯亮。

when

"0010"=>tdxh<=dxnbrith;tdxl<=dxnbritl;--东西方向倒计时时间等于右转灯亮的时间,东西方向右转灯亮。

tdxph<=dxnbprth;tdxpl<=dxnbprtl;

tnbh<=dxnbrth;

tnbl<=dxnbrtl;

tnbph<=dxnbprth;tnbpl<=dxnbprtl;--南北方向人行道倒计时时间等于红灯亮的时间,人行道南北方向红灯亮。

light<="00010101000010"

;

--东西方向右转灯亮,人行道红灯亮;南北方向红灯亮,人行道红灯亮。

when

"0011"=>tdxh<=dxnbyth;tdxl<=dxnbytl;--东西方向倒计时时间等于黄灯亮的时间,东西方向黄灯亮。

tdxph<=dxnbprth;tdxpl<=dxnbprtl;

tnbh<=dxnbrth;

tnbl<=dxnbrtl;

tnbph<=dxnbprth;tnbpl<=dxnbprtl;

light<="00100101000010";

--东西方向黄灯亮,人行道红灯亮;南北方向红灯亮,人行道红灯亮。

when

"0100"=>tdxh<=dxnblth;tdxl<=dxnbltl;--东西方向倒计时时间等于左转灯亮的时间,东西方向左转灯亮。

tdxph<=dxnbprth;tdxpl<=dxnbprtl;

tnbh<=dxnbrth;

tnbl<=dxnbrtl;

tnbph<=dxnbprth;tnbpl<=dxnbprtl;

light<="00001101000010"

;

--东西方向左转灯亮,人行道红灯亮;南北方向红灯亮,人行道红灯亮。

when

"0101"=>tdxh<=dxnbyth;tdxl<=dxnbytl;--东西方向倒计时时间等于黄灯亮的时间,东西方向黄灯亮。

tdxph<=dxnbprth;tdxpl<=dxnbprtl;

tnbh<=dxnbrth;

tnbl<=dxnbrtl;

tnbph<=dxnbprth;tnbpl<=dxnbprtl;

light<="00100101000010"

;

--东西方向黄灯亮,人行道红灯亮;南北方向红灯亮,人行道红灯亮。

when

"0110"=>tnbh<=dxnbgth;tnbl<=dxnbgtl;--南北方向倒计时时间等于绿灯亮的时间,南北方向绿灯亮。

tnbph<=dxnbprth;tnbpl<=dxnbprtl;--南北方向人行道倒计时时间等于红灯亮的时间,人行道南北方向红灯亮。

tdxh<=dxnbrth;tdxl<=dxnbrtl;--东西方向倒计时时间等于红灯亮的时间,东西方向红灯亮。

tdxph<=dxnbpgth;tdxpl<=dxnbpgtl;--东西方向人行道倒计时时间等于绿灯亮的时间,人行道东西方向绿灯亮。

light<=

"10000010100010"

;

--东西方向红灯亮,人行道绿灯亮;南北方向绿灯亮,人行道红灯亮。

when

"0111"=>tnbh<=dxnbyth;tnbl<=dxnbytl;--南北方向倒计时时间等于黄灯亮的时间,南北方向黄灯亮。

tnbph<=dxnbprth;tnbpl<=dxnbprtl;

tdxh<=dxnbrth;tdxl<=dxnbrtl;

tdxph<=dxnbpgth;tdxpl<=dxnbpgtl;

light<=

"10000010010010"

;

--东西方向红灯亮,人行道绿灯亮;南北方向黄灯亮,人行道红灯亮。

when

"1000"=>tnbh<=dxnbrith;tnbl<=dxnbritl;--南北方向倒计时时间等于右转灯亮的时间,南北方向右转灯亮。

tnbph<=dxnbprth;tnbpl<=dxnbprtl;

tdxh<=dxnbrth;tdxl<=dxnbrtl;

tdxph<=dxnbprth;tdxpl<=dxnbprtl;

--东西方向人行道倒计时时间等于红灯亮的时间,人行道东西方向红灯亮。

light<="10000100001010"

;

--东西方向红灯亮,人行道红灯亮;南北方向右转灯亮,人行道红灯亮。

when

"1001"=>tnbh<=dxnbyth;tnbl<=dxnbytl;--南北方向倒计时时间等于黄灯亮的时间,南北方向黄灯亮。

tnbph<=dxnbprth;tnbpl<=dxnbprtl;

tdxh<=dxnbrth;tdxl<=dxnbrtl;

tdxph<=dxnbprth;tdxpl<=dxnbprtl;

light<="10000100010010"

;

--东西方向红灯亮,人行道红灯亮;南北方向黄灯亮,人行道红灯亮。

when

"1010"=>tnbh<=dxnblth;tnbl<=dxnbltl;--南北方向倒计时时间等于左转灯亮的时间,南北方向左转灯亮。

tnbph<=dxnbprth;tnbpl<=dxnbprtl;

tdxh<=dxnbrth;tdxl<=dxnbrtl;

tdxph<=dxnbprth;tdxpl<=dxnbprtl;

light<="10000100000110";

--东西方向红灯亮,人行道红灯亮;南北方向左转灯亮,人行道红灯亮。

when

"1011"=>tnbh<=dxnbyth;tnbl<=dxnbytl;--南北方向倒计时时间等于黄灯亮的时间,南北方向黄灯亮。

tnbph<=dxnbprth;tnbpl<=dxnbprtl;

tdxh<=dxnbrth;tdxl<=dxnbrtl;

tdxph<=dxnbprth;tdxpl<=dxnbprtl;

light<=

"10000100010010";

--东西方向红灯亮,人行道红灯亮;南北方向黄灯亮,人行道红灯亮。

s<="0000"

whenothers

=>tdxh<=dxnbgth;tdxl<=dxnbgtl;

--其它情况,空操作。

tdxph<=dxnbprth;tdxpl<=dxnbprtl;

tnbh<=dxnbrth;

tnbl<=dxnbrtl;

tnbph<=dxnbpgth;tnbpl<=dxnbpgtl;

light<="01000101000001";

endcase;

elses<=s;--否则亮灯状态不变。

endif;

iftdx/=1then

--东西方向计时器的值不等于1时,计时器作减法计数。

iftdxl=0then

tdxl<="1001";

tdxh<=tdxh-1;

elsetdxl<=tdxl-1;tdxh<=tdxh;

endif;

endif;

iftdxp/=1then

--东西方向人行道计时器的值不等于1时,计时器作减法计数。

iftdxpl=0then

tdxpl<="1001";

tdxph<=tdxph-1;

elsetdxpl<=tdxl-1;tdxph<=tdxph;

endif;

endif;

iftnb/=1then

--南北方向计时器的值不等于1时,计时器作减法计数。

iftnbl=0then

tnbl<="1001";

tnbh<=tnbh-1;

elsetnbl<=tnbl-1;tnbh<=tnbh;

endif;

endif;

iftnbp/=1then

--南北方向人行道计时器的值不等于1时,计时器作减法计数。

iftnbpl=0then

tnbpl<="1001";

tnbph<=tnbph-1;

elsetnbpl<=tnbpl-1;tnbph<=tnbph;

endif;

endif;

endif;

endif;

ENDIF;

endprocess;

dxr0<=light(13);dxg0<=light(12);dxy0<=light(11);

dxri0<=light(10);dxl0<=light(9);dxpr0<=light(8);dxpg0<=light(7);

nbr0<=light(6);nbg0<=light(5);nby0<=light(4);

nbri0<=light(3);nbl0<=light(2);nbpr0<=light(1);nbpg0<=light(0);

endbeh;

3.2.1

设计说明

倒计时电路(文件名为count.vhd)由状态机,东西与南北方向计时器,亮灯信号输出等部分组成。各信号灯的亮灯时间在定义段由赋值语句进行预置,便于修改。亮灯时间采用8421BCD码。EN信号则实现正常情况和特殊情况下状态机以及计时器的工作模式控制。其中dx表示东西方向,nb表示南北方向,g绿灯,y黄灯,r红灯,l左转灯,ri右转灯,p表示人行道,t表示倒计时显示剩余时间;如dxnbgth、dxnbgtl分别表示东西南北方向绿灯亮时间的高位和底位,tdxh倒计时显示东西方向所亮灯剩余时间的高位。

3.3

显示电路源程序

libraryieee;

useieee.std_logic_1164.all;

entityltoutis

port(en,clk:instd_logic;

dxr0,dxg0,dxy0,dxri0,dxl0,dxpr0,dxpg0:instd_logic;

nbr0,nbg0,nby0,nbri0,nbl0,nbpr0,nbpg0:instd_logic;

tdx:instd_logic_vector(6downto0);

tdxp:instd_logic_vector(8downto0);

tnb:instd_logic_vector(6downto0);

tnbp:instd_logic_vector(8downto0);

dxr,dxg,dxy,dxri,dxl,dxpr,dxpg:outstd_logic;

nbr,nbg,nby,nbri,nbl,nbpr,nbpg:outstd_logic;

dxt:outstd_logic_vector(6downto0);

dxpt:outstd_logic_vector(8downto0);

nbt:outstd_logic_vector(6downto0);

nbpt:outstd_logic_vector(8downto0));

endltout;

architecturebeofltoutis

begin

dxr<=enordxr0;

dxg<=notenanddxg0;

dxy<=notenanddxy0;

dxri<=notenanddxri0;

dxl<=notenanddxl0;

dxpr<=enordxpr0;

dxpg<=notenanddxpg0;

nbr<=enornbr0;

nbg<=notenandnbg0;

nby<=notenandnby0;

nbri<=notenandnbri0;

nbl<=notenandnbl0;

nbpr<=enornbpr0;

nbpg<=notenandnbpg0;

dxt<=tdxwhenen='0'else

(clk&clk&clk&clk&clk&clk&clk)andtdx;

dxpt<=tdxpwhenen='0'else

(clk&clk&clk&clk&clk&clk&clk&clk&clk)andtdxp;

nbt<=tnbwhenen='0'else

(clk&clk&clk&clk&clk&clk&clk)andtnb;

nbpt<=tnbpwhenen='0'else

(clk&clk&clk&clk&clk&clk&clk&clk&clk)andtnbp;

endbe;

3.3.1

设计说明

显示控制电路(文件名为ltout.vhd)通过EN和CLK信号对电路的输出信号进行选通控制,以实现正常情况和特殊情况下的不同显示模式。

3.4

顶层模块源程序

libraryieee;--顶层

useieee.std_logic_1164.all;

entityjtdis

port(ini,clk,spe:instd_logic;

--端口说明。

dxr,dxg,dxy,dxri,dxl,dxpr,dxpg:outstd_logic;

nbr,nbg,nby,nbri,nbl,nbpr,nbpg:outstd_logic;

dxt:outstd_logic_vector(6downto0);

dxpt:outstd_logic_vector(8downto0);

nbt:outstd_logic_vector(6downto0);

nbpt:outstd_logic_vector(8downto0));

endjtd;

architecturertlofjtdis

componentctrl

--对元件CTRL进行说明。

port(clk,spe:instd_logic;

en:outstd_logic);

endcomponent;

componentcount

--对元件COUNT进行说明。

PORT(ini,EN,CLK:INSTD_LOGIC;

dxr0,dxg0,dxy0,dxri0,dxl0,dxpr0,dxpg0,nbr0,

nbg0,nby0,nbri0,nbl0,nbpr0,nbpg0:OUTSTD_LOGIC;

tdxh:BUFFERSTD_LOGIC_VECTOR(6DOWNTO4);

tdxl:BUFFERSTD_LOGIC_VECTOR(3downto0);

tdxph:bufferstd_logic_vector(8downto4);

tdxPl:bufferstd_logic_vector(3downto0);

tnbh:BUFFERSTD_LOGIC_VECTOR(6DOWNTO4);

tnbl:BUFFERSTD_LOGIC_VECTOR(3downto0);

tnbph:bufferstd_logic_vector(8downto4);

tnbpl:bufferstd_logic_vector(3downto0));

endcomponent;

componentltout

--对元件LTOUT进行说明。

port(en,clk:instd_logic;

dxr0,dxg0,dxy0,dxri0,dxl0,dxpr0,dxpg0:instd_logic;

nbr0,nbg0,nby0,nbri0,nbl0,nbpr0,nbpg0:instd_logic;

tdx:instd_logic_vector(6downto0);

tdxp:instd_logic_vector(8downto0);

tnb:instd_logic_vector(6downto0);

tnbp:instd_logic_vector(8downto0);

dxr,dxg,dxy,dxri,dxl,dxpr,dxpg:outstd_logic;

nbr,nbg,nby,nbri,nbl,nbpr,nbpg:outstd_logic;

dxt:outstd_logic_vector(6downto0);

dxpt:outstd_logic_vector(8downto0);

nbt:outstd_logic_vector(6downto0);

nbpt:outstd_logic_vector(8downto0));

endcomponent;

signalen_s:std_logic;

--各子模块间接口信号说明。

signaldxr0_s,dxg0_s,dxy0_s,dxri0_s,dxl0_s,dxpr0_s,dxpg0_s:std_logic;

signalnbr0_s,nbg0_s,nby0_s,nbri0_s,nbl0_s,nbpr0_s,nbpg0_s:std_logic;

signaldxgyryl0_s,nbgyryl0_s:std_logic_vector(4downto0);

signaltdxh_s,tnbh_s:std_logic_vector(6downto4);

signaltdxl_s,tnbl_s:std_logic_vector(3downto0);

signaltdxph_s,tnbph_s:std_logic_?vector(8downto4);

signaltdxpl_s,tnbpl_s:std_logic_vector(3downto0);

signaltdx_s,tnb_s:std_logic_vector(6downto0);

signaltdxp_s,tnbp_s:std_logic_vector(8downto0);

signaldxgyryl_s,nbgyryl_s:std_logic_vector(4downto0);

begin

tdx_s<=tdxh_s

&tdxl_s;

tnb_s<=tnbh_s

&tnbl_s;

tdxp_s<=tdxph_s

&tdxpl_s;

tnbp_s<=tnbph_s

&tnbpl_s;

u0:ctrlportmap(clk,spe,en_s);

--在结构体描述中使用元件例化语句。

u2:countportmap(ini,en_s,clk,dxr0_s,dxg0_s,dxy0_s,dxri0_s,dxl0_s,

dxpr0_s,dxpg0_s,nbr0_s,nbg0_s,nby0_s,nbri0_s,nbl0_s,

nbpr0_s,nbpg0_s,tdxh_s,tdxl_s,tdxph_s,tdxpl_s,tnbh_s,tnbl_s,

tnbph_s,tnbpl_s);

u3:ltoutport

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论