当前位置:文档之家› 十字路口交通灯课程设计实验报告

十字路口交通灯课程设计实验报告

十字路口交通灯课程设计实验报告
十字路口交通灯课程设计实验报告

E D A课程设计报告

课程EDA课程设计

题目十字路口交通灯控制

系别物理与电子工程学院

年级专业

班级

学号

学生姓名

指导教师张惠国

设计时间2014.12.21~2014.12.26

目录

前言 (3)

第一章VHDL系统概述 (4)

第二章十字路口交通灯系统设计 (6)

2.1 题目 (6)

2.2要求 (6)

第三章方案设计与论证 (6)

3.1 方案设计 (6)

3.2 方案论证 (7)

第四章详细设计 (10)

4.1 结构框图 (10)

4.2实验程序 (10)

第五章实验结果 (17)

第六章总结与体会 (19)

第七章参考文献 (19)

前言

自从1858年英国人发明了原始的机械扳手交通灯之后,随后的一百多年里,交通灯改变了交通路况,也在人们日常生活中占据了重要地位,随着人们社会活动日益增加,经济发展,汽车数量急剧增加,城市道路日渐拥挤,交通灯更加显示出了它的功能,使得交通得到有效管制,对于交通疏导,提高道路导通能力,减少交通事故起到了显著的效果。

近年来,随着汽车数量的猛增,我国大中型城市的城市交通,正面临着严峻的考验,从而导致交通问题日益严重,其主要表现如下:交通事故频发,对人类生命安全造成极大威胁;交通拥堵严重,导致出行时间增加,能源消耗加大;空气污染和噪声污染程度日益加深等。日常的交通堵塞成为人们司空见惯而又不得不忍受的问题。在这种背景下,结合我国城市道路交通的实际情况,开发出真正适合我们自身特点的智能信号灯控制系统已经成为当前的主要任务。

和谐的城市交通具有很重要的现实意义。城市交通是城市经济生活的命脉,是衡量一个城市文明进步的标志,对于城市经济的发展和人民生活水平的提高起着十分重要的作用。作为城市交通网的重要组成部分, 交叉口是道路通行能力的瓶颈和交通阻塞及事故的多发地。城市的交通拥堵,大部分是由于交叉口的通行能力不足或没有充分利用造成的,这导致车流中断、事故增多、延误严重。对交叉口实行科学的管理与控制是交通控制工程的重要研究课题,是保障交叉口的交通安全和充分发挥交叉口的通行能力的重要措施,是解决城市交通问题的有效途径。所以,改变和完善我国现有的交通系统已成为当务之急。

目前国内己有一些自主开发的城市交通控制系统,如公安部交通科学研究所研制开发的HT-UTCS系统,但它在整体性能上比国外同类系统仍有较大差距,只在一些中小城市得到一些应用。国内城市尤其是大城市引进的交通控制系统大部分为进口的SCOOT和SCATS以及京三系统等,这些系统皆是建立在机动车为主的道路交通条件基础之上的被动型控制系统上的.由于我国交通流是混合交通流,和国外的交通流大不相同,因此,国外的这些交通控制系统在国内的使用效果不尽人意。所以国内的科研人员也在孜孜不倦的研究着更好的交通灯控制系统,大致研究可以分为两类,其一是按固定配时方案运行,其二是由车辆检测器提供的实时交通信息控制信号机运行的。如,基于时间分布的交通控制系统设计,它将一天分为N个不同的时间区间,应用计算机算出各个交通路口各时间段信号灯的最佳周期,在不同的时间区间赋予交通信号控制器不同的周期,以对应交通流量随时间的分布。但在现实应用中,这种固定周期的交通信号灯的周期只在一天交通流量变化不大的路口可以得到较理想的效果,而交通流

量呈周期变化的路口则无法两者兼顾,其只能使某个时段达到较好的效果,在另外一个时刻则需要人工干预,不然可能产生交通堵塞。再如基于模糊逻辑的智能交通灯控制系统,是从禁行车辆等待时间的角度出发,综合了各个方向车辆密度的因素,模仿交通带察的行为而设计的。其控制器采用三变量输入,输出不再是时间变量,而是车辆通行的权限[3]。

第一章VHDL系统概述

VHDL语言是一种用于电路设计的高级语言。它在80年代的后期出现。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。

硬件描述语言的主要优点:

VHDL 是一种全方位的硬件描述语言,包括系统行为级、寄存器传输级和逻辑门级多个设计层次,支持结构、数据流、行为 3 种描述形式的混合描述,因此VHDL几乎覆盖了以往各种硬件描述语言的功能,整个自顶向下或自底向上的电路设计过程都可以用 VHDL 来完成。VHDL在电子设计中具有以下优点:

(1)全方位硬件描述—从系统到电路。VHDL具有功能强大的语言结构,可以用简洁明确的代码描述来进行复杂控制逻辑的设计,而且覆盖面广,方法灵活。

(2)多种描述方式适应层次化设计。VHDL具有多层次描述系统硬件功能的能力。能进行系统级的硬件描述这是它最突出的优点。

(3)VHDL语言的数据类型丰富语法严格清晰,串行和并行通用,物理过程清楚。

(4)VHDL的设计不依赖于特定的器件,方便了工艺的转换。

(5)VHDL是一个标准语言,它的设计描述可以被不同的EDA工具所支持,可移植性强,易于共享和复用。

同时,与其他的硬件描述语言相比,VHDL还具有以下特点:

(1) VHDL具有更强的行为描述能力。强大的行为描述能力避开了具体的器件结构,是在逻辑行为上描述和设计大规模电子系统的重要保证。VHDL 的宽范围描述能力使它成为高层次设计的核心,从而决定了它成为系统设计领域最佳的硬件描述语言,并可进行系统的早期仿真以保证设计的正确性。

(2) VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统功能的可行性,随时可对设计进行仿真模拟。

(3) VHDL语句的行为描述能力和程序结构,决定了它具有支持大规模设计的分解和已有设计的再利用功能。

(4)对于用 VHDL 完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动地把 VHDL 描述设计转变成门级网表。

(5) VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。

(6)用 VHDL 语言编写的源程序便于文档管理,用源代码描述来进行复杂控制逻辑的设计,既灵活方便,又便于设计结果的交流、保存和重用。

电子系统利用VHDL 设计时,设计方法有系统行为级描述算法,寄存器传输级算法和结构级描述;VHDL源代码是作为EDA综合工具的输入代码,因此有效的VHDL建模风格是控制综合结果的最为有效的手段。要建立VHDL源代码,设计者必须了解 VHDL与综合结果的关系。综合算法不同,对于同样的硬件描述,可能会得到不同的综合结果。即使最后综合出的电路都能实现相同的逻辑功能,其电路的复杂程度和时延特性都会有很大的差别,甚至某些额外的电路还使得系统运行效率达不到要求。为此,下面列举出了利用VHDL 进行程序设计时的一些重要的、典型的优化方法。

描述方法的合理选用

用 VHDL进行设计,其最终综合出的电路的复杂程度除取决于设计要求实现的功能的难度外,还受设计工程师对电路的描述方法的影响。最常见的使电路复杂化的原因之一是设计中存在许多本不必要的类似 LATCH的结构。而且由于这些结构通常都由大量的触发器组成,不仅使电路更复杂,工作速度降低,而且由于时序配合的原因可能导致不好的结果。

第二章十字路口交通灯系统设计

2.1 题目

十字路口交通灯控制

2.2要求

1、显示十字路口东西、南北两个方向的红、黄、绿灯的指示状态。

2、用两组红、黄、绿三色灯作为两个方向的红、黄、绿灯。

3、用两组数码管作为东西和南北方向的倒计时显示。

第三章方案设计与论证

3.1 方案设计

在交通信号灯的设计中,系统功能设计要求主干道和支干道各设有一个绿、黄、红指示灯。如图所示:

图4-1路口交通管理示意图

主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通行。主干道每次放行34s,支干道每次放行24s。每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为4s。能实现正常的倒计时显示功能。能实现总体清理功能,计数器由初始状态开始计

数,对应状态的指示灯亮。交通灯的四种状态如下:

四种状态灯色

状态1 状态2 状态3 状态4 东西南北东西南北东西南北东西南北

绿灯(时间/s)0 30 0 0 35 0 0 0

红灯(时间/s)30 0 5 0 0 35 0 5

黄灯(时间/s)0 0 5 0 0 0 0 5

图4-2交通信号灯的4种状态

绿灯与黄灯倒计时显示在同一个数码管显示中,二者相加正好与红灯显示的数码管时间相同有四种状态,状态1主干道绿灯亮30秒,支干道红灯亮30;状态2主干道黄灯亮5秒,支干道红灯亮5秒;状态3主干道红灯亮35秒,支干道绿灯亮35秒;状态4主干道红灯亮5秒,支干道黄灯亮5秒。

外部硬件电路方面主要包括:两组红绿灯、两组LED显示器。软件方面包括:(1)电路合成模块的概念:将交通灯信号系统划分成若干个小电路,编写每一个模块的VHDL程序代码,并将各个小电路相连接。这样可以增加程序的调试速度,同时也能够将工作细分,以提高编程速度。

3.2 方案论证

由交通信号灯系统结构图如下,该系统由4个子电路组成。其中包括:

(1)时钟发生电路;

(2)计数秒数选择电路;

(3)倒计时控制电路;

(4)红绿灯信号控制电路。

图4-3交通信号灯系统结构图

(1)第一模块:clk时钟秒脉冲发生电路

在红绿灯交通信号系统中,大多数的情况是通过自动控制的方式指挥交通的。因此,为了避免意外事件的发生,电路必须给出一个稳定的时钟(clock)才能让系统正常的工作。因此,hld1时钟发生电路最主要的功能就是产生一些稳定的输出信号,并将其用做后面几个电路的使能控制与同步信号。

模块说明:

系统输入信号:

clk:由外部信号发生器提供1kHZ的时钟信号;

rst:系统内部自复位信号。

系统输出信号:

clock_1buffer:输出为1HZ的频率

clock_2buffer:扫描输出信号频率

(2)第二模块:计数秒数选择电路

计数电路最主要的功能就是记数负责显示倒数的计数值,对下一个模块提供状态转换信号。

模块说明:

系统输入信号:

clk: 接收由clk电路的提供的1hz的时钟脉冲信号;

系统输出信号:

light:产生显示电路状态转换信号

data0:倒计数值秒数个位变化控制信号

data1:倒计数值秒数十位变化控制信号

data2:次倒计数值秒数个位变化控制信号;

data3:次倒计数值秒数十位变化控制信号;

(3)第三模块:红绿灯状态转换电路本电路负责红绿灯的转换。

模块说明:

系统输入信号:

clk: 接收由clk电路的提供的1hz的时钟脉冲信号;

states: 接收计数秒数选择电路状态转换信号;

系统输出信号:

light:负责红绿灯的状态显示。

(4)第四模块:时间显示电路

本电路负责红绿灯的计数时间的显示。

模块说明:

系统输入信号:

data0:倒计数值秒数十位变化控制信号;

data1:倒计数值秒数个位变化控制信号;

data2:次倒计数值秒数十位变化控制信号;

data3:次倒计数值秒数个位变化控制信号;

系统输出信号:

led7S0:负责主红绿灯的显示秒数十位。

led7S1:负责主红绿灯的显示秒数个位。

led7S2:负责支干红绿灯的显示秒数十位。

led7S3:负责支干红绿灯的显示秒数个位。

我们本次的程序共由3个进程组成,第一个进程为frequent:process(clk_in)----分频程序,将clk信号分频后产生1秒信号;第二个进程为time:process(rst,clk)-----

记时状态,构成两个带有预置数功能的十进制计数器;第三个进程为process(clk2)--------动态扫描显示数码管,产生次态信号和信号灯输出信号,以及每一个状态的时间值。最终验证了十字路口交通灯的系统设计。

第四章详细设计

4.1 结构框图

图5-1交通信号灯控制器程序原理框图

4.2实验程序

library ieee;-----库说明

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity jiaotongdeng is-----实体名称

port( clk_in:in std_logic;-----端口定义:时钟信号

rst:in std_logic;--复位信号

weima:out std_logic_vector(7 downto 0);----weima显示

light:out std_logic_vector(5 downto 0);----指示灯显示

LED7S:out STD_LOGIC_vector(6 downto 0));-----段码显示

end jiaotongdeng;

architecture arc of jiaotongdeng is-----结构体

type states is(green_red,yellow_red,red_green,red_yellow);-----定义了一个新的类型

signal state:states;

signal nx_state:states:=green_red;-----定义下一状态

signal data0:integer range 0 to 3;----支干道十位初始值范围

signal data1:integer range 0 to 9;----支干道个位初始值范围

signal data2:integer range 0 to 3;----主干道十位初始值范围

signal data3:integer range 0 to 9;----主干道个位初始值范围signal clock_1buffer:std_logic;

signal count_1time:integer range 0 to 39999999;----时钟技术范围signal clk:std_logic;--1m时钟

signal clock_2buffer:std_logic;

signal count_2time:integer range 0 to 200;----时钟技术范围signal clk2:std_logic;--动态显示输出时钟

signal sec0:integer range 0 to 3;----支干道十位显示值范围

signal sec1:integer range 0 to 9;----支干道个位显示值范围

signal sec2:integer range 0 to 3;----主干道十位显示值范围

signal sec3:integer range 0 to 9;----主干道个位显示值范围

signal LED7S0:STD_LOGIC_VECTOR(6 downto 0);-----支干道十位数字段码储存signal LED7S1:STD_LOGIC_VECTOR(6 downto 0);-----支干道个位数字段码储存signal LED7S2:STD_LOGIC_VECTOR(6 downto 0);----- 主干道十位数字段码储存signal LED7S3:STD_LOGIC_VECTOR(6 downto 0);---- 主干道个位数字段码储存begin

frequent:process(clk_in)----分频程序

begin

if (clk_in'event and clk_in='1' )then

count_1time<=count_1time+1;

count_2time<=count_2time+1;

if( count_1time=39999999)then----4MHZ翻转一次,1s定时

clock_1buffer<=not clock_1buffer;

count_1time<=0;

end if;

if(count_2time=100)then

clock_2buffer<=not clock_2buffer;

count_2time<=0;

end if;

clk<=clock_1buffer;-----输出为1HZ的频率

clk2<=clock_2buffer;-----扫描输出信号频率

end if;

end process;

time:process(rst,clk)-----记时状态

begin

if(rst='0') then --复位定义初始值

sec0<=3;

sec1<=9;

sec2<=3;

sec3<=4;

state<=green_red; ----数码管的初始值,初始状态

elsif (rising_edge(clk))then--------1m时钟频率转换

if(((sec0=0 )and(sec1=0) )or ((sec2=0 )and(sec3=0)))then ----若支干道十位为0,个位为0或者主干道十位为0,个位为0就跳转到下一个状态

state<=nx_state;----数码管置下一状态的初始值?

sec2<=data2;

sec3<=data3;

sec0<=data0;

sec1<=data1;

else

sec1<=sec1-1;

sec3<=sec3-1;----主干道个位减一

if((sec2/=0)and(sec3=0))then----主干道十位不为0,个位为0则十位减一,个位附为9

sec2<=sec2-1;

sec3<=9;

end if;

if ((sec0/=0)and(sec1=0))then----支干道十位不为0,个位为0则十位减一,个位附为9

sec0<=sec0-1;

sec1<=9;

end if;

end if;

end if;

case state is

when green_red=>light<="001100";--主干道绿灯亮,支干道红灯亮(状态一)nx_state<=yellow_red;

data2<=0;--下一状态的初始值设置

data3<=4;

data0<=0;

data1<=4;

when yellow_red=>light<="010100"; --主干道黄灯亮,支干道红灯亮(状态二)nx_state<=red_green;

data2<=2;

data3<=9;

data0<=2;

data1<=4;

when red_green=>light<="100001"; --主干道红灯亮,支干道绿灯亮(状态三)nx_state<=red_yellow;

data2<=0;

data3<=4;

data0<=0;

data1<=4;

when red_yellow=>light<="100010"; --主干道红灯亮,支干道黄灯亮(状态四)nx_state<=green_red;

data2<=3;

data3<=4;

data0<=3;

data1<=9;

end case;

----支干道十位计数值七段数码管译码

case sec0 is

WHEN 0 => LED7S0 <=not "1000000" ;---0

WHEN 1 => LED7S0 <=not "1111001" ;---1

WHEN 2 => LED7S0 <=not "0100100" ;---2

WHEN 3 => LED7S0 <=not "0110000" ;---3

WHEN others=>LED7S0<=not "1111111";---其余状态为不显示

END case;

---- 支干道个位计数值七段数码管译码

case sec1 is

WHEN 0 => LED7S1 <=not "1000000" ;---0

WHEN 1 => LED7S1 <=not "1111001" ;---1

WHEN 2 => LED7S1 <=not "0100100" ;---2

WHEN 3 => LED7S1 <=not "0110000" ;---3

WHEN 4 => LED7S1 <=not "0011001" ;---4

WHEN 5 => LED7S1 <=not "0010010" ;---5

WHEN 6 => LED7S1 <=not "0000010" ;---6

WHEN 7 => LED7S1 <=not "1111000" ;---7

WHEN 8 => LED7S1 <=not "0000000" ;---8

WHEN 9 => LED7S1 <=not "0010000" ;---9

END case;

----主干道十位计数值七段数码管译码

case sec2 is

WHEN 0 => LED7S2 <=not "1000000" ;---0

WHEN 1 => LED7S2 <=not "1111001" ;---1

WHEN 2 => LED7S2 <=not "0100100" ;---2

WHEN 3 => LED7S2 <=not "0110000" ;---3

WHEN others=>LED7S2<=not"1111111";---其余状态不显示END case;

----主干道个位计数值七段数码管译码

case sec3 is

WHEN 0 => LED7S3 <=not "1000000" ;---0

WHEN 1 => LED7S3 <=not "1111001" ;---1

WHEN 2 => LED7S3 <=not "0100100" ;---2

WHEN 3 => LED7S3 <=not "0110000" ;---3

WHEN 4 => LED7S3 <=not "0011001" ;---4

WHEN 5 => LED7S3 <=not "0010010" ;---5

WHEN 6 => LED7S3 <=not "0000010" ;---6

WHEN 7 => LED7S3 <=not "1111000" ;---7

WHEN 8 => LED7S3 <=not "0000000" ;---8

WHEN 9 => LED7S3 <=not "0010000" ;---9

END case;

END process;

process(clk2)--------动态扫描显示数码管

variable c: integer range 0 to 3 ; --动态扫描

variable wm:STD_LOGIC_VECTOR(7 downto 0); --动态扫描位码储存

variable fc: integer range 0 to 2 ; --动态扫描频率设计

variable LED7:STD_LOGIC_VECTOR(6 downto 0);-----数码管七段段码储存 begin

if(clk2'event and clk2='1') then

fc:=fc+1;

if(fc=2) then

fc:=0;

c:=c+1;

if(c=4) then

c:=0;

end if;

end if;

end if;

case c is

when 0=> wm:="00100000";LED7:=LED7S0;

when 1=> wm:="00010000";LED7:=LED7S1;

when 2=> wm:="00001000";LED7:=LED7S2;

when 3=> wm:="00000100";LED7:=LED7S3;

when others=>NULL;

end case;

weima<=wm;-----位码输出

LED7S<=LED7;---段码输出

END process;

end arc;

第五章实验结果

东西方向红灯倒计时还剩下5s 南北方向黄灯开始倒计时5s

南北方向红灯倒计时40s

东西方向绿灯开始倒计时35s

东西方向黄灯倒计时5s

东西方向红灯倒计时35s

第六章总结与体会

这次的EDA课程设计,可以说是苦多于甜,但是不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。在程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示:在设定输入的时钟信号后,计时开始,但是始终看不到红黄绿灯的变化。后来,在几次的调试之后,才发现是因为输入的时钟信号对于器件的延迟时间来说太短了。经过屡次调试,终于找到了比较合适的输入数值:Endtime的值需要设置的长一点:1000us左右,这样就可以观察到完整的仿真结果。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,最后在老师的辛勤的指导下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的。最后,对给过我帮助的同学和老师再次表示忠心的感谢!

数字化时代的到来给人们的生活水平带来了极大的改变,我们有理由相信,随着数字化的深入,交通灯控制器的功能将日趋完善。而且,VHDL语言对EDA技术产生的影响也是深远的,它缩短了电子产品的设计周期,为设计者提供了方便。在今后的电子产品研究开发过程中,EDA技术将会具有更好的开发手段和更高的性价比,并且将拥有更为广阔的市场应用前景。

第七章参考文献

[1]综合电子设计与实践,王振红,清华大学出版社,2008年9月第2版;

[2]EDA实用技术及应用,刘艳萍,国防工业出版社,2006年第1版;

[3]EDA技术实用教程.-3版,潘松,黄继业,北京:科学出版社,2006

[4]CPLD/FPGA常用模块与综合系统设计实例精讲,罗苑棠,电子工业出版社,2007。[5]VHDL程序设计,曾繁泰,陈美金,清华大学出版社,2000;

[6]FPGA设计及应用,褚振勇,翁木云,西安:西安电子科技大学出版社,2002

相关主题
文本预览
相关文档 最新文档