基于EDA技术基础的交通灯设计论文_第1页
基于EDA技术基础的交通灯设计论文_第2页
基于EDA技术基础的交通灯设计论文_第3页
基于EDA技术基础的交通灯设计论文_第4页
基于EDA技术基础的交通灯设计论文_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、基于eda技术的交通灯设计 班 级: 姓 名: 学 号: 指导教师: 1、绪论1.1课程设计背景 随着世界范围内城市化和机动化进程的加快,城市交通越来越成为一个全球化的问题。城市交通基础设施供给滞后于高速机动化增长需求,道路堵塞日趋加重,交通事故频繁,环境污染加剧等问题普遍存在。目前,全国大中城市普遍存在着道路拥挤、车辆堵塞、交通秩序混乱的现象,交通事故频发,这给人民的生命财产安全带来了极大的损失。如何解决城市交通问题已成为全社会关注的焦点和大众的迫切呼声。探究城市交通发展中存在问题的原因,无论是从宏观上还是从微观上分析,其根本原因在于城市交通系统的管理机制不适应。城市交通控制系统(utc ,

2、urban traffic control system)是现代城市智能交通系统(idj ,intelligent transport system)的组成之一,主要用于城市道路交通的控制与管理。城市平交路口实现交通信号控制是城市交通管理现代化的基本标志之一,是提高交通管理效能的重要技术手段。路口信号控制器是控制交叉路口交通信号的设备,它是交通信号控制的重要组成部分。各种交通控制方案,最终都要由路口信号控制器来实现。为了确保十字路口的行人和车辆顺利、畅通地通过,往往采用电子控制的交通信号来进行指挥。伴随着社会的发展以及人类生活水平的提高,汽车的数量在不断增加,eda技术的发展和应用领域也在不断

3、的扩大与深入,机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域的重要性日益突出。利用eda技术设计交通灯来完成这个需求就显的更加迫切,同样也是非常的实用和合理。1.2 课程设计目a.掌握十字路口交通灯控制的设计原理,并能够运用vhdl编程语言编写出实验程序,进一步对所学的eda知识进行掌握与实际应用。b.学会在max+plus 软件环境中仿真,熟悉软件的基本操作和运行环境。c.锻炼自己获取信息的能力,以及能够独立自主的思考和解决问题的能力。2、系统分析与总体方案2.1系统分析 通过分析可以知道,所要设计的十字路口交通灯控制电路要能够使南北、东西各四个灯(红、黄、绿、左转),四

4、个灯能够按顺序依次亮灭。而且要求绿灯亮转红灯亮或者转左转灯亮之前要先转黄灯亮5秒,左转灯亮转红灯亮之前也要先转黄灯亮5秒,红灯亮可以直接转绿灯或左转灯亮(四种灯的循环顺序如图2.1所示)。还要求四种灯的点亮时间能够以倒计时的形式显示出来。可以用vhdl语言合理设计系统功能,使红黄绿左转灯的转换有一个准确的时间间隔和转换顺序。绿灯黄灯左转灯黄灯红灯图2.1 四种灯的循环顺序2.2 方案比较实现路口交通灯的方法很多,可以用标准逻辑器件、可变程序控制器和单片机等方案来实现。若用单片机来实现的话,模型可以由电源电路、单片机主控电路、无限收发控制电路和显示电路四部分组成。在电源电路中,需要用到+5v的直

5、流稳压电源,无限收发控制电路和显示电路应由编码芯片和数据发射模块两部分组成,主控电路的主要元件为at89c51。硬件设计完成后还要利用计算机软件经行软件部分的设计才能够实现相应的功能。虽然利用单片机系统设计的交通灯控制器相对来说比较稳定,能够完成较多功能的实现,但这些控制方法的功能修改及调试都需要硬件电路的支持,在一定程度上增加了功能修改和系统设计与调试的困难。相反,使用基于fpga的方法具有周期短、使用灵活、易于修改等明显的优点。而且,随着fpga器件,设计语言和电子设计自动化工具的发展和改进,越来越多的电子系统采用fpga来设计。未来使用fpga器件设计的产品将出现在各个领域。因此此次的交

6、通灯控制器将基于fpga的设计方案来实现所需要的功能。 2.3 设计的总体方案 根据设计要求和系统所具有功能,并参考相关的文献资料经行方案设计画出如下所示的十字路口交通灯控制器系统框图,及为设计的总体方案,框图如下图3.1所示:clk时钟分频模块交通灯控制及计时模块扫描显示模块led显示数码管位码数码管段码图2.2 系统的框图3、硬件电路设计3.1分频器设计 分频器实现的是将高频时钟信号转换成低频时钟信号,用于触发控制器、计数器和扫描显示电路。具体实物模块如图: 图3.1 分频器模块3.2 状态控制电路设计状态控制器的作用是根据计数器的计数值控制各方向上发光二极管的亮、灭,当计时时间到达,状态

7、控制器就响应,自动跳转到下一个状态。此外,当检测到特殊情况(emi =1)发生时,无条件点亮红灯的二极管(急救灯按下emi='1',则东西南北都亮红灯,在这种状态下原来的状态必须保持,即东西南北方向定时时间保持不变。急救灯未按下或者按下后恢复,则继续计时(计时通过计数器ct),同时恢复东西南北原来灯的状态)。具体实物模块如图:图3.2控制电路模块3.3计数器设计这里需要的计数器的计数范围为0-80。计到80后,下一个时钟沿回复到0,开始下一轮计数。此外,当检测到特殊情况(emi =1)发生是,计数器暂停计数,而系统复位信号reset则使计数器异步清零。图3.3计数器模块3.4译

8、码显示电路设计根据状态控制器所控制的状态和计数器的计时时间,选择当前状态下的显示器,使显示器输出当前状态下的数码管亮、灭指令,其中数码管的显示采用动态扫描显示。具体实物模块如图:图3.4译码显示电路模块4、实验程序设计一个完整的vhdl语言程序通常包括实体(entity)、构造体(architecture)、配置、包集合(package)和库(library)5个部分组成。下面结合实际的程序来加以说明。4.1实体定义:library ieee;use ieee.std_logic_1164.all;entity traffic_light is port(clk : in std_logic;

9、 - 时钟频率为250khz. start : in std_logic; - 交通灯控制:'1' 开, '0' 关. emi : in std_logic; - 急救灯控制,'1' 所有红灯亮. ew_rled : out std_logic; -东西红灯控制,'0' 开, '1' 关. ew_gled : out std_logic; - 东西绿灯控制,'0' 开, '1' 关. ew_yled : out std_logic; - 东西黄灯控制,'0' 开, &

10、#39;1' 关. ew_turnled: out std_logic; - 东西左转灯控制,'0' 开, '1' 关 sn_rled : out std_logic; - 南北红灯控制,'0' 开, '1' 关 sn_gled : out std_logic; - 南北绿灯控制,'0'开, '1'关 sn_yled : out std_logic; - 南北黄灯控制,'0' 开, '1' 关 sn_turnled: out std_logic; - 南北左转

11、灯控制,'0' 开, '1' 关 l : out std_logic_vector(2 downto 0); -显示器选取 dled : out std_logic_vector(7 downto 0); -显示器数据输出end traffic_light;4.2译码显示: architecture control of traffic_light is type eastwest is (ew_red,ew_green,ew_yellow0,ew_yellow1,ew_turnl); type southnorth is (sn_red,sn_green,sn

12、_yellow0,sn_yellow1,sn_turnl); signal ew_state: eastwest; signal sn_state: southnorth; begin process(clk) function display(s:integer range 0 to 9) return std_logic_vector is variable result:std_logic_vector(7 downto 0); begin cases is when 0 => result:=x"fc"-0 when 1 => result:=x&quo

13、t;60"-1 when 2 => result:=x"da"-2 when 3 => result:=x"f2"-3 when 4 => result:=x"66"-4 when 5 => result:=x"b6"-5 when 6 => result:=x"be"-6 when 7 => result:=x"e0"-7 when 8 => result:=x"fe"-8 when 9 => r

14、esult:=x"f6"-9 when others => null; end case; return result;end display; 4.3状态转换: variable cnt:integer range 0 to 7; variable ct:integer range 0 to 5; variable ew_secondh,sn_secondh: integer range 0 to 8; variable ew_secondl,sn_secondl: integer range 0 to 9; begin if start='0' t

15、hen 初始化 dled<=x"00" ew_state<=ew_red; sn_state<=sn_green; ew_secondh:=8; ew_secondl:=0; sn_secondh:=5; sn_secondl:=0; ew_rled<='0' ew_gled<='1' ew_yled<='1'ew_turnled<='1' sn_rled<='1' sn_gled<='0' sn_yled<='

16、1'sn_turnled<='1' elsif clk'event and clk='1' then - clk rising edge detection cnt:=cnt+1; if emi='1' then ew_rled<='0' ew_gled<='1' ew_yled<='1'ew_turnled<='1' sn_rled<='0' sn_gled<='1' sn_yled<=

17、'1'sn_turnled<='1' else ct:=ct+1; case ew_state is when ew_red => ew_rled<='0' ew_gled<='1' ew_yled<='1'ew_turnled<='1' - 东西向红灯 when ew_green => ew_rled<='1' ew_gled<='0' ew_yled<='1' ew_turnled<

18、='1'- 东西向绿灯 when ew_yellow0 => ew_rled<='1' ew_gled<='1' ew_yled<='0'ew_turnled<='1' - 东西向黄灯 when ew_yellow1 => ew_rled<='1' ew_gled<='1' ew_yled<='0'ew_turnled<='1' -东西向黄灯 when ew_turnl => ew_tu

19、rnled<='0'ew_rled<='1' ew_gled<='1' ew_yled<='1' - 东西向左转灯 when others => ew_rled<='0' ew_gled<='1' ew_yled<='1' ew_turnled<='1'- 东西向红灯 end case; case sn_state is when sn_red => sn_rled<='0' sn_gl

20、ed<='1' sn_yled<='1' sn_turnled<='1' - 南北向红灯 when sn_green => sn_rled<='1' sn_gled<='0' sn_yled<='1'sn_turnled<='1' - 南北向绿灯 when sn_yellow0 => sn_rled<='1' sn_gled<='1' sn_yled<='0'sn_

21、turnled<='1' - 南北向黄灯 when sn_yellow1 => sn_rled<='1' sn_gled<='1' sn_yled<='0'sn_turnled<='1' - 南北向黄灯 when sn_turnl=> sn_turnled<='0'sn_rled<='1' sn_gled<='1' sn_yled<='1' - 南北向左转灯 when others =&

22、gt; sn_rled<='0' sn_gled<='1' sn_yled<='1'sn_turnled<='1' - 南北向红灯 end case; end if; if ct=5 then ct:=0; if ew_secondh=0 and ew_secondl=0 then 状态结束 case ew_state is 东西向当前状态 when ew_red => ew_state<=ew_green; ew_secondh:=5; ew_secondl:=0; -下一状态的绿灯 when

23、 ew_green => ew_state<=ew_yellow0; ew_secondh:=0; ew_secondl:=5; -下一状态的黄灯 when ew_yellow0 => ew_state<=ew_turnl; ew_secondh:=2; ew_secondl:=0; - 下一状态的左转灯 when ew_turnl =>ew_state<=ew_yellow1; ew_secondh:=0; ew_secondl:=5; - 下一状态的黄灯 when ew_yellow1 =>ew_state<=ew_red; ew_secon

24、dh:=8; ew_secondl:=0; - 下一状态的红灯 when others => ew_state<=ew_red; ew_secondh:=8; ew_secondl:=0; - 下一状态的红灯 end case; elsif ew_secondl=0 then ew_secondl:=9; ew_secondh:=ew_secondh-1; else ew_secondl:=ew_s_secondl-1; end if; if sn_secondh=0 and sn_secondl=0 then 状态结束 case sn_state is 南北向当前状态 when

25、sn_red => sn_state<=sn_green; sn_secondh:=5; sn_secondl:=0; - 下一状态的绿灯 when sn_green => sn_state<=sn_yellow0; sn_secondh:=0; sn_secondl:=5; -下一状态的黄灯 when sn_yellow0 => sn_state<=sn_turnl; sn_secondh:=2; sn_secondl:=0; -下一状态的左转灯 when sn_turnl =>sn_state<=sn_yellow1; sn_secondh:

26、=0; sn_secondl:=5; -下一状态的黄灯 when sn_yellow1 =>sn_state<=sn_red; sn_secondh:=8; sn_secondl:=0; -下一状态的红灯 when others => sn_state<=sn_red; sn_secondh:=8; sn_secondl:=0; -下一状态的红灯 end case; elsif sn_secondl=0 then sn_secondl:=9; sn_secondh:=sn_secondh-1; else sn_secondl:=sn_secondl-1; end if;

27、 end if;4.4显示器片选: case cnt is 显示时间 when 0 => l<="000" dled<=display(ew_secondh); when 1 => l<="001" dled<=display(ew_secondl); when 2 => l<="010" dled<=x"00" when 3 => l<="011" dled<=x"00" when 4 => l&

28、lt;="100" dled<=x"00" when 5 => l<="101" dled<=x"00" when 6 => l<="110" dled<=display(sn_secondh); when 7 => l<="111" dled<=display(sn_secondl); end case; end if; end process;end control;5、程序仿真与分析5.1 仿真结果利用max+

29、plus ii软件对本程序进行编译,生成了可以进行仿真定时分析以及下载到可编程器件的相关文件。仿真结果如图5.1所示:图5.1 仿真结果5.2 仿真结果分析通过设定clk值以及start和emi的初值,就可以得到如上所示的仿真波形图。由仿真波形图可以看出波形是由start初值信号触发而显示出各个状态的。emi高电平信号输入时,所有交通灯都变为红灯状态(符合任务书的要求)。由仿真波形图还可以清楚的看出各时间段每个交通灯的状态。要得到正确的仿真波形图就不许设定合适的时间信号clk值。如果clk值设置的太小则交通灯状态变化得太快无法分辨,如果clk值设置得太大则交通灯状态转换缓慢,效果不明显。其次,

30、要设定start初值,如果没有设定start初值就不可能触发而得到仿真图。最后,就是要设置一emi高电平信号来检测紧急情况下的交通灯的状态。5.3硬件运行结果 将程序下载到实验板上,经过硬件测试达到了设计要求,实现了交通灯控制器的基本功能,下图为运行结果图:6、心得体会eda课程设计就要结束了,这次课程设计历时近二个星期,通过这两个星期的学习,发现了自己的很多不足,发现了很多知识上的漏洞。同时也看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。这次课程设计让我学到了很多,不仅是巩固了先前学的eda技术的理论知识,而且也培养了我的动手能力,更令我的创造性思维得到拓展。在课程设计中一

31、个人的力量是远远不够的,真正的完成任务需要共同的智慧与劳动,团结协作是我们成功的一项非常重要的保证。在这个过程中,我也曾经因为实践经验的缺乏失落过,也曾经仿真成功而热情高涨。还有一点是我们做任何事情都无法缺少的,那就是细心认真。此次设计我们就深深地体会到了,由于编程的时候没有做到足够的细心,导致一串代码弄混了。但是密密麻麻的英文字母混在一起,我始终没有发现。最终在调试的时候,就出现了问题。只知道出现了问题,就是不知道到问题的根源在哪里,好长时间都没有找出问题的所在。这也让我真正的明白了,科学的严谨性,它不允许出半点差错,否则后果会是比较麻烦的。做其他事情也一样,都需要我们付出足够的认真去对待,

32、才能顺利的完成。生活就是这样,汗水预示着结果也见证着收获。劳动是人类生存生活永恒不变的话题。虽然我这次做的课程设计不是非常的复杂,但在设计和仿真的过程中,我们也遇到了不少的困难,回首整个过程,却受益匪浅。对我而言,知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆!参考文献1 阎石 主编,数字电子技术基础,高等教育出版社,19982 谭会生等主编,eda技术及应用,西安电子科技大学出版社,20013 廖裕评

33、等主编,cpld数字电路设计使用max+plus入门篇,清华大学出版社,20014 冯涛等主编,可编程逻辑器件开发技术:max+plus入门与提高,人民邮电出版社,20025 杨崇志,特殊新型电子元件手册,辽宁科学技术出版社,19996 彭介华,电子技术课程设计指导高等教育出版社.2000年出版.7 mark zwolinski, digital system design with vhdl, 电子工业出版社,20028 alan b. marcovitz introduction to logic design, 电子工业出版社,2002附录a、仿真时序波形图附录b、vhdl源程序代码li

34、brary ieee;use ieee.std_logic_1164.all;entity traffic_light is port(clk : in std_logic; - 时钟频率为250khz. start : in std_logic; - 交通灯控制:'1' 开, '0' 关. emi : in std_logic; - 急救灯控制,'1' 所有红灯亮. ew_rled : out std_logic; -东西红灯控制,'0' 开, '1' 关. ew_gled : out std_logic; -

35、东西绿灯控制,'0' 开, '1' 关. ew_yled : out std_logic; - 东西黄灯控制,'0' 开, '1' 关. ew_turnled: out std_logic; - 东西左转灯控制,'0' 开, '1' 关 sn_rled : out std_logic; - 南北红灯控制,'0' 开, '1' 关 sn_gled : out std_logic; - 南北绿灯控制,'0'开, '1'关 sn_yled :

36、 out std_logic; - 南北黄灯控制,'0' 开, '1' 关 sn_turnled: out std_logic; - 南北左转灯控制,'0' 开, '1' 关 l : out std_logic_vector(2 downto 0); -显示器选取 dled : out std_logic_vector(7 downto 0); -显示器数据输出end traffic_light;architecture control of traffic_light is type eastwest is (ew_red,ew

37、_green,ew_yellow0,ew_yellow1,ew_turnl); type southnorth is (sn_red,sn_green,sn_yellow0,sn_yellow1,sn_turnl); signal ew_state: eastwest; signal sn_state: southnorth; begin process(clk) function display(s:integer range 0 to 9) return std_logic_vector is variable result:std_logic_vector(7 downto 0); be

38、gin cases is when 0 => result:=x"fc"-0 when 1 => result:=x"60"-1 when 2 => result:=x"da"-2 when 3 => result:=x"f2"-3 when 4 => result:=x"66"-4 when 5 => result:=x"b6"-5 when 6 => result:=x"be"-6 when 7 => r

39、esult:=x"e0"-7 when 8 => result:=x"fe"-8 when 9 => result:=x"f6"-9 when others => null; end case; return result;end display; variable cnt:integer range 0 to 7; variable ct:integer range 0 to 5; variable ew_secondh,sn_secondh: integer range 0 to 8; variable ew_s

40、econdl,sn_secondl: integer range 0 to 9; begin if start='0' then 初始化 dled<=x"00" ew_state<=ew_red; sn_state<=sn_green; ew_secondh:=8; ew_secondl:=0; sn_secondh:=5; sn_secondl:=0; ew_rled<='0' ew_gled<='1' ew_yled<='1'ew_turnled<='1&#

41、39; sn_rled<='1' sn_gled<='0' sn_yled<='1'sn_turnled<='1' elsif clk'event and clk='1' then - clk rising edge detection cnt:=cnt+1; if emi='1' then ew_rled<='0' ew_gled<='1' ew_yled<='1'ew_turnled<=

42、9;1' sn_rled<='0' sn_gled<='1' sn_yled<='1'sn_turnled<='1' else ct:=ct+1; case ew_state is when ew_red => ew_rled<='0' ew_gled<='1' ew_yled<='1'ew_turnled<='1' - 东西向红灯 when ew_green => ew_rled<='

43、1' ew_gled<='0' ew_yled<='1' ew_turnled<='1'- 东西向绿灯 when ew_yellow0 => ew_rled<='1' ew_gled<='1' ew_yled<='0'ew_turnled<='1' - 东西向黄灯 when ew_yellow1 => ew_rled<='1' ew_gled<='1' ew_yled<=&

44、#39;0'ew_turnled<='1' -东西向黄灯 when ew_turnl => ew_turnled<='0'ew_rled<='1' ew_gled<='1' ew_yled<='1' - 东西向左转灯 when others => ew_rled<='0' ew_gled<='1' ew_yled<='1' ew_turnled<='1'- 东西向红灯 end c

45、ase; case sn_state is when sn_red => sn_rled<='0' sn_gled<='1' sn_yled<='1' sn_turnled<='1' - 南北向红灯 when sn_green => sn_rled<='1' sn_gled<='0' sn_yled<='1'sn_turnled<='1' - 南北向绿灯 when sn_yellow0 => sn_rl

46、ed<='1' sn_gled<='1' sn_yled<='0'sn_turnled<='1' - 南北向黄灯 when sn_yellow1 => sn_rled<='1' sn_gled<='1' sn_yled<='0'sn_turnled<='1' - 南北向黄灯 when sn_turnl=> sn_turnled<='0'sn_rled<='1' sn

47、_gled<='1' sn_yled<='1' - 南北向左转灯 when others => sn_rled<='0' sn_gled<='1' sn_yled<='1'sn_turnled<='1' - 南北向红灯 end case; end if; if ct=5 then ct:=0; if ew_secondh=0 and ew_secondl=0 then 状态结束 case ew_state is 东西向当前状态 when ew_red => ew_state<=ew_green; ew_secondh:=5; ew_secondl:=0; -下一状态的绿灯 when ew_green => ew_state<=ew_yellow0; ew_secondh:=0; ew_secondl:=5; -下一状态的黄灯 when ew_yellow0 => ew_state<=ew_turnl; ew_secondh:=2; ew_secondl:=0; - 下一状态的左转灯 when ew_

温馨提示

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

评论

0/150

提交评论