EDA课程设计报告交通灯.doc

上传人:土8路 文档编号:10204191 上传时间:2021-04-28 格式:DOC 页数:23 大小:282KB
返回 下载 相关 举报
EDA课程设计报告交通灯.doc_第1页
第1页 / 共23页
EDA课程设计报告交通灯.doc_第2页
第2页 / 共23页
EDA课程设计报告交通灯.doc_第3页
第3页 / 共23页
EDA课程设计报告交通灯.doc_第4页
第4页 / 共23页
EDA课程设计报告交通灯.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《EDA课程设计报告交通灯.doc》由会员分享,可在线阅读,更多相关《EDA课程设计报告交通灯.doc(23页珍藏版)》请在三一文库上搜索。

1、目录(ECJTU2008)一、方案分析与对比21.1方案分析21.2方案对比2二、整体设计论述4三、单元模块设计与仿真6 3.1时钟分频模块6 3.2交通灯控制及计时模块7 3.3扫描显示译码模块83.4顶层文件的编写及波形仿真10四、硬件实验方案及实验结果13 4.1硬件实验方案13 4.2实验结果14五、收获和体会15六、程序代码16一、 方案分析与对比1.1方案分析 通过分析课程设计的要求可以知道,所要设计的交通信号灯控制电路要能够适用于由一条主干道和一条支干道的汇合点形成的十字交叉路口,其主要功能是:主干道处于常允许通行的状态,支干道有车来时才允许通行;当支干道没有车通行时,主干道亮绿

2、灯,而支干道亮红灯,主、支干道的倒计时数码管不显示数字;当支干道有车通行时,进入了主干道和支干道交替通行的情况。 当进入到交替通行时,主干道每次放行45秒,支干道每次放行25秒。首先主干道通行45秒,并且主干道显示45秒的倒计时,此45秒内主干道亮绿灯,当45秒计时结束,主干道亮黄灯5秒,而且显示5秒倒计时,用于绿灯转为红灯作为过渡,使行驶中的车辆有时间停到禁行线外,在主干道亮绿灯和黄灯的50秒内,支干道亮红灯50秒,而且支干道显示50秒的倒计时。然后,当支干道亮红灯50秒结束时,主干道由黄灯转为红灯,并且主干道的红灯亮30秒,显示30秒的倒计时,在此过程中,支干道先亮绿灯25秒,显示25秒的

3、倒计时,25秒过后绿灯转为黄灯,而且黄灯亮5秒,显示5秒倒计时,用于绿灯转为红灯作为过渡,使行驶中的车辆有时间停到禁行线外。支干道通行结束后,主干道通行,以此交替。1.2方案对比方案一、用纯数字系统方式控制实现当支干道没有车通行时,只需要点亮主干道的绿灯和支干道的红灯,而且主、支干道的数码管不需要显示,则很容易实现。当支干道有车通行时,则进入交替通行的情况,交替通行一次所需要的时间是80秒,所以需要一个0到79循环计数的计时器,在不同的计数时间段里实现相应的功能。主干道:0到44秒亮绿灯,数码管从44倒计时到00;45到49秒亮黄灯,数码管从04倒计时到00;50到79秒亮红灯,数码管从29倒

4、计时到00。支干道:0到49秒,亮红灯,数码管从49倒计时到00;50到74秒,亮绿灯,数码管从24倒计时到00;75到79秒,亮黄灯,数码管从04倒计时到00。所以要根据0到79循环计数器的计数情况来控制主、支干道的红绿黄灯和50秒、45秒、30秒、25秒和5秒倒计时计数器的计数。方案二、用状态机控制交通灯的工作明显可以分成5个状态,如下表支干道是否有车状态实现功能支干道没车St0支干道亮红灯,主干道亮绿灯,数码管不显示。支干道有车St1主干道亮绿灯45秒,数码管显示45秒倒计时;支干道亮红灯,数码管显示从49秒倒计时到05秒。St2主干道亮黄灯5秒,数码管显示5秒倒计时;支干道亮红灯,数码

5、管显示从04秒倒计时到00秒。St3支干道亮绿灯25秒,数码管显示25秒倒计时;主干道亮红灯,数码管显示从29秒倒计时到05秒。St4支干道亮黄灯5秒,数码管显示5秒倒计时;主干道亮红灯,数码管显示从04秒倒计时到00秒。 把交通灯的工作分成五个状态,则写程序的时候思路就比较清晰,只要在相应的状态里完成相应的工作,控制好黄绿红灯和数码管的倒计时显示,而且把握好五个状态转换的条件。通过对比可以知道选用状态机能方便地实现,而方案一显得有些麻烦。二、整体设计论述根据题目要求的功能,可以把整体设计分为三个模块:分频模块,把2kHz的频率分成1Hz,1Hz用于倒计时计数的时钟信号,而2kHz则可以用于数

6、码管扫描显示的片选时钟信号;交通灯控制及倒计时(五个状态的控制)模块;数码管译码扫描显示模块。整体的系统框图如下:分频2kHz交通灯控制及倒计时主支干道红黄绿灯数码管倒计时显示支干道是否有车 七段译码 1Hz 位选 图2-1系统框架图分频模块就是把输入的2kHz时钟频率2000分频得到1Hz的频率用于数码管倒计时的时钟信号,其原理就是设计一个0到999循环计数的的计数器,当计数溢出,即计数到999时使输出量取反,则输出为0.5秒的高电平和0.5秒的低电平交替出现,就得到了1Hz的方波,作为秒倒计时的时钟信号。交通灯控制及倒计时模块就是五个状态的转换模块,是整个系统的核心模块,其五个状态分别st

7、0、st1、st2、st3、st4。其中st0是当支干道没有车通行的状态,st1是主干道绿灯亮45秒的状态,st2是主干道亮黄灯5秒的状态,st3是支干道亮绿灯25秒的状态,st4是支干道亮黄灯5秒的状态。当主干道亮绿灯和黄灯时,支干道都是亮红灯,当支干道亮绿灯和黄灯时,主干道都是亮红灯,并且主、支干道都会显示亮灯的倒计时时间,主、支干道的红黄绿灯用六个LED发光二极管代替。五个状态图如下:St1St2St4St3St0 Car为1且主干道绿灯倒计时结束 Car为0 Car为1 car为0 Car为0 car为1且主干道 Car为1 且支干道 黄灯倒计时结束 黄灯倒计时结束 Car为0 car

8、为0 Car为1且支干道绿灯倒计时结束图2-2状态图 数码管倒计时显示,是用四个一体的数码管,分别表示主干道和支干道的秒倒计时,所以是动态扫描显示,扫描的频率直接用2KHz的输入时钟频率。根据上面的思路分析最终得到的顶层文件原理图如下:图2-3顶层文件原理图三、单元模块设计与仿真3.1时钟分频模块时钟分频模块就是把输入的2kHz时钟频率2000分频得到1Hz的频率用于数码管倒计时的时钟信号,其原理就是设计一个0到999循环计数的的计数器,当计数溢出,即计数到999时使输出量取反,则输出为0.5秒的高电平和0.5秒的低电平交替出现,就得到了1Hz的方波,作为秒倒计时的时钟信号。时钟分频模块生成的

9、元件符号如下: clk2khz是频率为为2khz的输入时钟信号,clk1hz是经过2000分频后得到的频率为1hz方波的输出信号。图3-1 时钟分频模块仿真波形图如下:设置的end time是3s,输入clk2kHz是频率为2kHz的方波。T=1s图3-2 分频模块仿真波形图波形分析:开始时clk1hz为低电平,当计数器第一次计满时,clk1hz由低电平转为高电平,当计数器第二次计满时,clk1hz转为低电平。在这一过程中,clk1hz先后经历了500ms的低电平和高电平,恰好为一个周期1s,之后依次高低交替,得到频率为1Hz的方波。3.2交通灯控制及计时模块 此模块是整个系统的核心部分,主要

10、功能是完成五个状态的转换,并且在每个状态里完成相应的控制作用,即控制主干道和支干道的红黄绿灯的点亮和各自数码管倒计时显示。编程时主要是用一个进程语句,其敏感信号是时钟分频模块产生的1Hz时钟信号,进程里主要用case语句完成五个状态的控制,在每个状态里要控制主干道和支干道的红黄绿灯的点亮,而且要控制各自数码管倒计时的显示,并为扫描显示译码模块提供倒计时时间,同时要使每个状态结束时能顺利进入下一个状态。五个状态及相应的功能是:St0,支干道亮红灯,主干道亮绿灯,数码管不显示;St1,主干道亮绿灯45秒,数码管显示45秒倒计时;支干道亮红灯,数码管显示从49秒倒计时到05秒;St2,主干道亮黄灯5

11、秒,数码管显示5秒倒计时;支干道亮红灯,数码管显示从04秒倒计时到00秒;St3,支干道亮绿灯25秒,数码管显示25秒倒计时;主干道亮红灯,数码管显示从29秒倒计时到05秒;St4,支干道亮黄灯5秒,数码管显示5秒倒计时;主干道亮红灯,数码管显示从04秒倒计时到00秒。状态转换条件参照图2-2。此模块生成的元件符号如下:图3-3 交通灯控制及计时模块clk1hz是分频模块输出的1Hz的时钟信号,car是支干道是否有车的判断信号,one1、ten1、one2、ten2分别是主干道倒计时的个位和十位,支干道倒计时的个位和十位。r_a、g_a、y_a、r_b、g_b、y_b分别是主干道和支干道的红、

12、绿、黄灯控制信号。仿真波形如下:设置的end time为100ms,clk1hz为周期是1ms的方波(把周期缩小为的是可以缩小仿真的时间,方便波形的仿真)。 放大之后图34 交通灯控制及倒计时模块仿真波形图波形分析:当car为0时,状态为st0,此状态中主干道亮绿灯,支干道亮红灯,当car为1不变时,变为状态st1,之后进入st1-st2-st3-st4-st1的循环状态,在相应的状态里面也能正确地控制红黄绿灯点亮。将上图中下面太密的地方放大一段后,可以清楚地看到,在状态st1中,主干道进行着45秒的倒计时,而支干道进行着50秒的倒计时,两个倒计时在st0的状态中始终相差5秒。3.3扫描显示译

13、码模块此模块中含有七段数码管译码和扫描显示两个部分。七段译码可以使用case语句,将数码管要显示的数译成对应的七位二进制数,用来控制数码管的a、b、c、d、e、f、g的导通。主干道和支干道倒计时要用到4个数码管,且是四位一体的,则要使用扫描显示的方法:设计一个00到11循环计数的计数器,而且计数的时钟要比较大,选用输入的2KHz的时钟信号;当计数器计数为00时,选通第一个数码管,给它主干道倒计时个位的七段译码,当计数器计数为01时,选通第二个数码管,给它主干道倒计时十位的七段译码,当计数器计数为10时,选通第三个数码管,给它支干道倒计时个位的七段译码,当计数器计数为11时,选通第四个数码管,给

14、它支干道倒计时十位的七段译码,并以此循环扫描显示,达到人眼看上去四个数码管全显示的效果。此模块生成的元件符号如下:图3-5 扫描显示译码模块元件符号其中clk2khz是输入的扫描时钟信号。one1、ten1分别是主干道倒计时的个位和十位,one2、ten2分别是支干道倒计时的个位和十位,这四个信号都是有交通灯控制及倒计时模块输出的。Scan是四个数码管的片选信号,seg_7是七段译码输出信号。仿真波形如下:方便仿真设设置的end time为6ms,clk2khz周期为500us 当one和ten为10时对应的七段译码是0000000,使数码管不显示,用于支干道没有车的情况!图3-6 扫描显示译

15、码模块的波形仿真图波形仿真说明:为方便观察one1、ten1、one2、ten2及scan用的是无符号十进制数,当scan=0时显示one1,当scan=1时显示ten1,当scan=2时显示one2,当scan=3时显示ten2。Seg_7的从高到低七位分别对应数码管gfedcba七段。3.4顶层文件的编写及波形仿真 顶层文件就是将上述的三个模块进行例化,把它们连接起来组成一个整体。元件例化语句由两部分组成,第一部分是将一个现成的设计实体定义为一个元件,它的最简单表达式如下: component 元件名 is port (端口名表); end component 文件名;元件例化语句的第二部

16、分是此元件与当前设计实体中元件间及端口的连接说明,语句的表达式如下: 例化名:元件名 port map (端口名=连接端口名,.); 由顶层文件生成的元件符号如下:图3-7顶层文件生成元件符号clk_2k是外部输入的频率为2khz的时钟信号,car是判断支干道是否有车的输入信号。scan1.0是四位一体数码管的片选输出信号,seg_76.0是数码管的七段译码输出信号,ra、ga、ya、rb、gb、yb分别是主干道和支干道红、绿、黄灯的输出控制信号。顶层文件的波形仿真图如下:为了方便波形仿真,设置end time为1.2s,clk_2k是周期为5us的方波。图3-8 顶层文件波形仿真图仿真波形分

17、析:当car为0时,为状态st0,ga、rb为高电平,即主干道亮绿灯,支干道亮红灯;当car由0变为1且不变时,状态转为st1,ga、rb为高电平,即主干道亮绿灯,支干道亮红灯;当st1倒计时结束,则转为st2,ya、rb为高电平,即主干道亮黄灯,支干道亮红灯;当st2倒计时结束,则转为st3,ra、gb为高电平,即主干道亮红灯,支干道亮绿灯;当st3倒计时结束,则转为st4,ra、yb为高电平,即主干道亮红灯,支干道亮黄灯;当st4倒计时结束,则转为st1。当在状态st1,大约在1s处car由高电平变为低电平时,状态则会转为st0。鉴于图3-8中的scan和seg7太密而看不出其中的变化,所

18、以要把其中几段放大才能便于观察。1、st=st0时放大的波形如下:图3-9 st=st0时放大的一段波形图3-9波形分析:通过图3-9可以清晰地观察到当st=st0时,主干道和支干道的数码管都是灭的,即seg7=”0000000”。2、st=st1时放大的一段波形如下:图3-10 st=st1时放大的一段波形图3-10波形分析:由于要经过clk_2k两千分频后才能得到1hz的倒计时时钟信号,则要经过clk_2k两千个周期后主干道和支干道的数码管秒倒计时才减一秒,所以在顶层文件波形仿真时不好看到倒计时的变化。在图3-10中可以看到在st为st1时主干道的数码管显示为44,支干道的数码管显示为49

19、,即scan为0时,seg7是“1100110”,scan为1时,seg7是“1100110”,scan为2时,seg7是“1101111”,scan为3时,seg7是“1100110”。而st2、st3、st4放大后的波形和图3-10相似。四、硬件实验方案及实验结果4.1硬件实验方案 把整个程序输入好后,设置好顶层文件,然后编译,编译结束后,经行引脚绑定,绑定后保存并再次编译,最后配置文件下载。引脚绑定如图4-1。图4-1 引脚绑定说明:clk_2k引脚绑定为pin_152是选用实验箱的时钟clk3,而且要把clk3的2khz的引脚用短路帽接上。car是绑定了pin_164,是高低电平的第八

20、个键,而且ON为低电平,OFF为高电平。虽然实验箱里没有绿灯和黄灯,但可以假定8个红色发光二极管中的六个分别为主、支干道的红、黄、绿灯。4.2实验结果接好硬件,下载好程序,开始时把car置为低电平,即表示支干道没有车来时,主干道亮绿灯,支干道亮红灯,四个倒计时数码管都是灭的。当把car置为高电平并不变后,主干道和支干道分别继续亮绿灯和红灯,同时主干道的数码管从44开始一秒一秒地倒计时显示直至倒计时到00,而支干道的数码管从49开始一秒一秒地倒计时显示,并且主、支干道的数码管显示值始终相差5。当主干道的倒计时到00(支干道倒计时到05)后的下一秒,主干道的绿灯灭,亮起了黄灯,而且主干道的数码管从

21、04开始秒倒计时直至00,支干道的红灯在这一过程中始终是亮的,而且数码管正常倒计时,和主干道的数码管显示。当主、支干道数码管倒计时到00后的下一秒,主干道的黄灯灭,红灯亮,数码管从29开始一秒一秒地倒计时,而支干道的红灯灭,绿灯亮,数码管开始从24一秒一秒地倒计时,始终和主干道的数码管少5,直至倒计时到00。当支干道数码管倒计时到00(主干道为05)的下一秒后,支干道的绿灯灭,黄灯亮,数码管开始从04一秒一秒地倒计时直至00,而主干道在这一过程中继续亮红灯,数码管继续正常地倒计时,而和支干道数码管显示相同。当主、支干道倒计时到00的下一秒,则进入到主干道亮绿灯,支干道亮红灯的状态,只要car依

22、然维持在高电平,就会不断循环支干道有车通信的四个状态。当car从高电平变为低电平后,不管之前处于st1、st2、st3、st4中的任何一个状态都会进入到st0状态,即主干道亮绿灯,支干道亮红灯,四个数码管都不会显示。五、收获和体会交通灯这个EDA的课设题目应该是本次课设题目里面最简单的一个,但是我们在这个学期EDA的实验课程中,基本上多数情况是在实验室里机械地敲出书本上已有的程序,让后验证它们,以加强对书本知识的理解,而我们自己并没有真正地去用VHDL语言写程序,所以我选一个最简单的题目,还是从最简单的事做起。当选了这个题目的时候,老师就说了可以用状态机实现,而自己在PLC实验课中也编写过用P

23、LC实现交通灯的程序,而那时候用的思路基本上和用有限状态机来控制是差不多的,即一步一步来,换句话说就是一个状态一个状态来。如果不用状态机控制,那么就要编一个总的计数器,在不同的时间端里,应要实现同时控制两个秒倒计时和灯的亮、灭,那就是数字电路里的逻辑组合电路和时序组合电路,既然VHDL语言里有状态机的方式,就要学会用新的知识。在一些资料里面其实也有好多交通灯的例子,但是那些都是些很简单的例子,这次课设的核心程序是自己编的。写个程序还是没有什么大的问题,编的时候也不能找出出问题,当自己写完程程序仿真后,发现有点问题,倒计时部分不是很好。到实验室在硬件上调试时,出现的问题是例如当一边的倒计时从20

24、变为19时,另一边的倒计时会停滞一秒。后来发现是自己没有把握好状态机的转换过程的细节问题,还是时序没有把握好,通过硬件调试后自己才体会到程序出现的问题,并且顺利解决了。除了实现基本功能外,自己也没有多少新的东西。完成了自己这个简单的题目,发现我们很多时候,都是没有好好地把知识学扎实,特别是细节知识方面更是模棱两可,当实际编程时就会出现问题,所以自己要仔细看书本的内容,何况我们的课本自己都还有好多内容没有认真地看。以上就是我的收获和体会。六、程序代码1、时钟分频模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsign

25、ed.all;entity div isport(clk2khz:in std_logic;-2khz的输入时钟 clk1hz:out std_logic);-经2000分频后的1hz时钟输出信号end;architecture one of div isbeginprocess(clk2khz)-2KHz to 1Hzvariable count:integer range 0 to 999;-0到999计数器variable clk1:std_logic;beginif clk2khzevent and clk2khz=1 then if count=999 then clk1:=not

26、clk1;count:=0; else count:=count+1; end if;end if;clk1hzseg77seg77seg77seg77seg77seg77seg77seg77seg77seg77seg77=0000000;end case;end process;seg_7=seg77;process(clk2khz,one1,ten1,one2,ten2)-数码管动态扫描计数beginif clk2khzevent and clk2khz=1 then -00到11循环计数器 if cnt=11 then cnt=00; else cntdata=one1;scandata

27、=ten1;scandata=one2;scandata=ten2;scannull;end case;end process;end three;3、交通灯控制及计时模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity state5 isport(clk1hz,car:in std_logic;-1hz倒计时时钟信号 one1,ten1,one2,ten2:out integer range 0 to 10;-倒计时数 r_a,g_a,y_a,r_b,g_b,y_b:out std_

28、logic);-主支干道红黄绿灯end;architecture two of state5 is type states is (st0,st1,st2,st3,st4);-定义五个状态 signal r1,g1,y1,r2,g2,y2:std_logic;beginprocess(clk1hz)-5 states variable st:states; variable eoc:std_logic;-倒计时结束标志位 variable h1,l1,h2,l2:integer range 0 to 10;beginif clk1hzevent and clk1hz=1 thencase st

29、 iswhen st0=if car=0 then-支干道没车经过 g1=1;r1=0;y1=0;g2=0;r2=1;y2if car=0 then st:=st0;-主干道绿灯亮45秒 else if eoc=0 then h1:=4;l1:=4; h2:=4;l2:=9; eoc:=1; g1=1;r1=0;y1=0;g2=0;r2=1;y2if car=0 then st:=st0;-主干道黄灯亮5秒 else if eoc=0 then h1:=0;l1:=4; h2:=0;l2:=4; eoc:=1; g1=0;r1=0;y1=1;g2=0;r2=1;y2if car=0 then

30、st:=st0;-支干道绿灯亮25秒 else if eoc=0 then h1:=2;l1:=9; h2:=2;l2:=4; eoc:=1; g1=0;r1=1;y1=0;g2=1;r2=0;y2if car=0 then st:=st0;-支干道黄灯亮5秒 else if eoc=0 then h1:=0;l1:=4; h2:=0;l2:=4; eoc:=1; g1=0;r1=1;y1=0;g2=0;r2=0;y2=1; else if l2=1 then st:=st1;eoc:=0;h1:=0;l1:=0;h2:=0;l2:=0; else l1:=l1-1;l2:=l2-1; end

31、 if; end if; end if;end case;end if;r_a=r1;g_a=g1;y_a=y1;r_b=r2;g_b=g2;y_b=y2;one1=l1;ten1=h1;one2=l2;ten2=h2;end process;end;4、顶层文件模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jtd isport(clk_2k,car:in std_logic;-2khz输入时钟信号 scan:out std_logic_vector(1 downto 0);-

32、数码管片选输出信号 seg7:out std_logic_vector(6 downto 0);-七段译码输出信号 ra,ga,ya,rb,gb,yb:out std_logic);主支干道红黄绿灯end;architecture behave of jtd iscomponent div-定义时钟分频元件port(clk2khz:in std_logic; clk1hz:out std_logic);end component;component state5-定义交通灯控制及计时元件port(clk1hz,car:in std_logic; one1,ten1,one2,ten2:out

33、integer range 0 to 10; r_a,g_a,y_a,r_b,g_b,y_b:out std_logic);end component;component display-定义扫描显示译码元件port(clk2khz:in std_logic; one1,ten1,one2,ten2:in integer range 0 to 10; scan:out std_logic_vector(1 downto 0); seg_7:out std_logic_vector(6 downto 0);end component;signal clk_1hz:std_logic;signal onea,tena,oneb,tenb:intege

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1