EDA报告-交通灯控制器_第1页
EDA报告-交通灯控制器_第2页
EDA报告-交通灯控制器_第3页
EDA报告-交通灯控制器_第4页
EDA报告-交通灯控制器_第5页
已阅读5页,还剩12页未读, 继续免费阅读

下载本文档

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

文档简介

1、天津工业大学EDA课程设计报告题目: 交通灯控制器 班级: 电子1301 学号: 姓名: 一、设计目的1.了解交通灯的变化规律;2.掌握VHDL编程语言,了解实际设计中的优化方案。二、开发软件Quartus II三、设计任务及分析 1.设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。 2.红、绿、黄发光二极管作信号灯。 3.主干道处于常允许通行的状态,支干道有车来时才允许通行。主干道亮绿灯时,支干道亮红灯;支干道亮绿灯时,主干道亮红灯。 4.主、支干道均有车时,两者

2、交替允许通行,主干道每次放行45秒,支干道每次放行25秒,设立45秒、25秒计时、显示电路。5.在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡,使行驶中的车辆有时间停到禁行线外,设立5秒计时、显示电路。题目分析:根据题目要求可以知道,系统需要在几种不同的状态之间进行切换,为了设计的方便,并且实现高效率和高可靠的逻辑控制,这里我们采用状态机的方法进行设计。四、设计方案主控电路是一个单进程Moore型有限状态机,通过接收计数器发送的“时间到”(进位)信号以及根据s(用来指示支干道是否有车来,1表示支干道没有车来,0 支干道有车来)的值进行状态的切换,实现对十字路口主干道、支干道两个方向的

3、红、黄、绿灯状态的控制。系统框图如图一所示。图一 系统整体框图具体控制过程为:当s=1时,支干道没有车来,主干道处于常允许通行的状态,此时主干道亮绿灯,支干道亮红灯;当s=0时,支干道有车来,即主、支干道均有车,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒,且在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡。变化规律为:主干道绿灯亮,支干道红灯亮主干道黄灯亮,支干道红灯亮主干道红灯亮,支干道绿灯亮主干道红灯亮,支干道黄灯亮主干道绿灯亮,支干道红灯亮,这样依次循环。由于主、支干道有45秒和25秒的放行时间,以及每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡,所以设

4、计45秒、25秒和5秒计时电路,均采用倒计时。关于显示的问题,译码电路是把对应的二进制码直接转换成数码管显示时的码字,并且由于实验箱上采用的是8位数码管,所以必须采用数码管的动态扫描。五、各模块功能介绍1.顶层原理图及基本原理如图1-1所示,系统时钟(48M)经过分频得到1HZ方波,为状态机和计数器提供时钟,lsdsn5.0六位总线分别表示主干道和支干道的绿灯、黄灯、红灯。ledsn5:主干道绿灯,ledsn4:主干道黄灯,ledsn3:主干道红灯,ledsn2:支干道绿灯,ledsn1:支干道黄灯,ledsn0:支干道红灯。当系统复位后,如果s输入一个低电平(主、支干道均有车时,两者交替允许

5、通行,主干道每次放行45秒,支干道每次放行25秒)状态机进入s0,主控电路c45输出一个高电平使能45s倒计时计数器(此时主干道绿灯亮,支干道红灯亮);当计数结束后,45s倒计时计数器的cout输出一个进位信号,使状态机进入下一个状态s1,此时主控电路(状态机)c545输出一个高电平使能主干道5s倒计时计数器(此时主干道黄灯亮,支干道红灯亮);当计数结束后,5s倒计时计数器的cout输出一个进位信号,使状态机进入下一个状态s2,此时主控电路c25输出一个高电平使能25s倒计时计数器(此时主干道红灯亮,支干道绿灯亮);当计数结束后,25s倒计时计数器的cout输出一个进位信号,使状态机进入下一个

6、状态s3,此时主控电路c525输出一个高电平使能支干道5s倒计时计数器(干道红灯亮,支干道黄灯亮);当计数结束后, 5s倒计时计数器的cout输出一个进位信号,使状态机重新进入下一个状态s0,依次循环.当系统复位后,如果s输入一个高电平(主干道处于常允许通行的状态),此时状态机一直保持在s0状态。图1-1 顶层原理图图1-2 s=0时原理图仿真结果 当s=0时,表示主、支干道均有车时,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒,从仿真波形图上可以看到,ledsn5.0分别表示主干道绿、黄、红灯,支干道绿、黄、红灯,当复位后,主干道绿灯(ledsn5=1),支干道红灯(leds

7、n0=1);计满45秒后进入下个状态,主干道黄灯(ledsn4=1),支干道红灯(ledsn0=1);计满5秒后进入下个状态,主干道红灯(ledsn3=1),支干道绿灯(ledsn2=1);计满25秒后进入下个状态,主干道红灯(ledsn3=1),支干道黄灯(ledsn1=1);计满5秒后进入下个状态,主干道绿灯(ledsn5=1),支干道红灯(ledsn0=1),依次循环.(sg和bt为译码电路的仿真结果,在此可以忽略)图1-3 s=1时原理图仿真结果当s=1时,表示主干道处于常允许通行的状态,此时从仿真图上可以看到状态一直保持在主干道绿灯(ledsn5=1),支干道红灯(ledsn0=1)

8、。2.分频器如图2-1所示,这次交通灯的设计用到了两个分频器,一个是将系统时钟进行48M分频得到1HZ的时钟提供给状态机和计数器;另一个分频器是将系统时钟进行48K分频得到1KHZ的时钟,给数码管动态显示模块作为扫频时钟用。这里采用的是事先写好的通用程序,分频系数可以根据具体需要进行修改,在此只给出原理图及VHDL源代码。图2-1 分频器原理图其VHDL代码如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.NUMERIC_B

9、IT.ALL;-包含移位函数等.ENTITY int_div2ISGENERIC(F_DIV:Integer:=48000;-分频系数F_DIV_WIDTH:Integer:=32-分频计数器宽度);PORT(clock :INSTD_LOGIC;clock_out:OUTSTD_LOGIC);END;ARCHITECTURE one OFint_div2ISSIGNAL clk_p_r:STD_LOGIC;-上升沿输出时钟SIGNAL clk_n_r:STD_LOGIC;-下降沿输出时钟SIGNAL count_p:STD_LOGIC_VECTOR(f_div_width-1DOWNTO 0

10、);-上升沿脉冲计数器SIGNAL count_n:STD_LOGIC_VECTOR(f_div_width-1DOWNTO 0);-下降沿脉冲计数器-SIGNAL f_div_width_r:STD_LOGIC_VECTOR(f_div_width-1DOWNTO 0);SIGNAL clock_out_r:STD_LOGIC;SIGNAL full_div_p:STD_LOGIC;-上升沿计数满标志SIGNAL half_div_p:STD_LOGIC;-上升沿计数半满标志SIGNAL full_div_n:STD_LOGIC;-下降沿计数满标志SIGNAL half_div_n:STD_

11、LOGIC;-下降沿计数半满标志BEGINclock_out<=clock_out_r;-clock_out<=clock WHEN (F_DIV=1) ELSE (clk_p_r='1' AND clk_n_r='1') WHEN (F_DIV(0)='1') clk_p_r);-<<判断计数标志位置位与否.full_div_p<='1' WHEN (count_p<F_DIV-1) ELSE '0'half_div_p<='1' WHEN (count_

12、p<(F_DIV/2 )-1) ELSE '0'full_div_n<='1' WHEN (count_n<F_DIV -1) ELSE '0'half_div_n<='1' WHEN (count_n<(F_DIV/2)-1)ELSE '0'PROCESS(clock)-上升沿脉冲计数-VARIABLE i:Integer RANGE 0 TO 31;BEGINIFRISING_EDGE(clock)THENIF full_div_p='1' THENcount_p&

13、lt;=count_p+1;IF (half_div_p='1') THENclk_p_r<='0'ELSEclk_p_r<='1'END IF;ELSEcount_p<= (OTHERS =>'0');clk_p_r<= '0'END IF;END IF;END PROCESS;PROCESS(clock)-下降沿脉冲计数BEGINIFFALLING_EDGE(clock)THENIF full_div_n='1' THENcount_n<=count_n+1;

14、IF half_div_n='1' THENclk_n_r<='0'ELSEclk_n_r<='1'END IF;ELSEcount_n<=(OTHERS =>'0');clk_n_r <= '0'END IF;END IF;END PROCESS;PROCESS(clock)BEGINIFRISING_EDGE(clock)THENIF F_DIV= 1 THENclock_out_r<=clock;ELSEIF (F_DIV REM 2) =1 THENclock_out_r

15、<= clk_p_r AND clk_n_r;ELSEclock_out_r<=clk_p_r;END IF;END IF;END IF;END PROCESS;END;3.主控电路(状态机)主控电路是一个单进程的Moore型有限状态机,状态转换图如图3-1所示。图3-1 状态转换图每种状态说明如下:原状态目的状态转换条件状态输出s0s1s=1且s45=1ledsn<="100001"c45<='1'c25<='0'c545<='0'c525<='0's1s2s545=

16、1ledsn<="010001"c45<='0'c25<='0'c545<='1'c525<='0's2s3s25=1ledsn<="001100"c45<='0'c25<='1'c545<='0'c525<='0's3s0s525=1ledsn<="001010"c45<='0'c25<='0'c5

17、45<='0'c525<='1'状态机原理图如图3-2所示。图3-2 状态机原理图状态机仿真结果如图3-3所示。图3-3 状态机仿真结果从仿真结果可以看到,满足状态转换条件后,状态机就会从现在的状态转移到下一个状态,具体的转换结果与上表相同。其VHDL代码如下:library ieee;use ieee.std_logic_1164.all;entity traffic is port(CLK,RST,s,s45,s25,s545,s525:in std_logic; c45,c25,c545,c525:out std_logic; ledsn:ou

18、t std_logic_vector(5 downto 0);end traffic;architecture one of traffic is type sx is(s0,s1,s2,s3); signal current_state:sx; begin process(RST,CLK) beginif RST='1' then current_state<=s0;ledsn<="100001"c45<='1'c25<='0'c545<='0'c525<='0&#

19、39; elsif CLK'event and CLK='1' then case current_state is when s0=>if s='1' then current_state<=s0; elsif s45='1' then current_state<=s1; else current_state<=s0;end if; ledsn<="100001"c45<='1'c25<='0'c545<='0'c525

20、<='0' when s1=>if s545='1' then current_state<=s2; else current_state<=s1;end if; ledsn<="010001"c45<='0'c25<='0'c545<='1'c525<='0' when s2=>if s25='1' then current_state<=s3; else current_state<=s2

21、;end if; ledsn<="001100"c45<='0'c25<='1'c545<='0'c525<='0' when s3=>if s525='1' then current_state<=s0; else current_state<=s3;end if; ledsn<="001010" c45<='0'c25<='0'c545<='0'c525

22、<='1' end case; end if; end process;end one;4. 45秒倒计时电路45秒倒计时电路是一个45秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。其原理图如图4-1所示。图4-1 45秒计数器原理图45秒倒计时电路的仿真结果如图4-2所示。图4-2 45秒计数器仿真结果其VHDL代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt45 is port(CLK,RST,EN:in std_logic

23、; CQ:out std_logic_vector(5 downto 0); cout:out std_logic);end;architecture behav of cnt45 isbegin process(CLK,RST,EN) variable CQI:std_logic_vector(5 downto 0); begin if CLK'event and CLK='1' then if RST='1' then CQI:="101100" elsif EN='1' then if CQI>0 then

24、 CQI:=CQI-1;cout<='0' else CQI:="101100"cout<='1' end if; end if; end if; CQ<=CQI; end process;end behav;5. 25秒倒计时电路25秒倒计时电路是一个25秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。其原理图如图5-1所示。图5-1 25秒计数器原理图 25秒倒计时电路的仿真结果如图5-2所示。图5-2 25秒计数器仿真结果其VHDL代码如下:library ieee;use ieee.std_logic

25、_1164.all;use ieee.std_logic_unsigned.all;entity cnt25 is port(CLK,RST,EN:in std_logic; CQ:out std_logic_vector(4 downto 0); cout:out std_logic);end;architecture behav of cnt25 isbegin process(CLK,RST,EN) variable CQI:std_logic_vector(4 downto 0); begin if CLK'event and CLK='1' then if R

26、ST='1' then CQI:="11000" elsif EN='1' then if CQI>0 then CQI:=CQI-1;cout<='0' else CQI:="11000"cout<='1' end if; end if; end if; CQ<=CQI; end process;end behav;6. 5秒倒计时电路5秒倒计时电路是一个5秒的减一计数器,当减到0时输出进位信号作为状态机的状态转换信号。其原理图如图6-1所示。图6-1 5秒计数器原

27、理图5秒倒计时电路的仿真结果如图6-2所示,由于交通灯没有对黄灯5秒的倒计时进行显示,所以没有添加计数输出的端口,只用到了进位端口,在仿真图中可以看到,每次5个计数脉冲之后计数器就会输出一个进位信号。图6-2 5秒计数器仿真结果其VHDL代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt5 isport(CLK,RST,EN:in std_logic; cout:out std_logic);end;architecture behav of cnt5 isbegin

28、process(CLK,RST,EN) variable CQI:std_logic_vector(2 downto 0); begin if CLK'event and CLK='1' then if RST='1' then CQI:="100" elsif EN='1' then if CQI>0 then CQI:=CQI-1;cout<='0' else CQI:="100"cout<='1' end if; end if; end if;

29、 end process;end behav;7. 数码管动态扫描译码电路数码管动态扫描译码电路如图7-1所示,此电路负责将主干道和支干道的45秒和25秒倒计时进行译码然后显示输出。考虑到实验箱上的数码管位8位数码管,这里采用动态扫描的显示方式。由于仿真结果并不能正确的看到数码管的输出结果,这里没有给出仿真图。图7-1 数码管动态扫描译码电路原理图其VHDL代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity decl7s4 isport ( clk : in std_logic

30、; a45 : in std_logic_vector(5 downto 0);a25: in std_logic_vector(4 downto 0);sg : out std_logic_vector(6 downto 0);bt : out std_logic_vector(3 downto 0); end; architecture one of decl7s4 issignal cnt4 : std_logic_vector(2 downto 0);signal a : std_logic_vector(5 downto 0);signal a1 : std_logic_vector

31、(5 downto 0);signal a2 : std_logic_vector(5 downto 0);signal a3 : std_logic_vector(5 downto 0);signal a4 : std_logic_vector(5 downto 0);beginp0 : process(a45)begin case a45 iswhen "000000"=>a2<="000000"a1<="000000"-0when "000001"=>a2<="0000

32、00"a1<="000001"-1when "000010"=>a2<="000000"a1<="000010"-2when "000011"=>a2<="000000"a1<="000011"-3when "000100"=>a2<="000000"a1<="000100"-4when "000101"=&

33、gt;a2<="000000"a1<="000101"-5when "000110"=>a2<="000000"a1<="000110"-6when "000111"=>a2<="000000"a1<="000111"-7when "001000"=>a2<="000000"a1<="001000"-8when

34、"001001"=>a2<="000000"a1<="001001"-9when "001010"=>a2<="000001"a1<="000000"-10when "001011"=>a2<="000001"a1<="000001"-11when "001100"=>a2<="000001"a1<=&qu

35、ot;000010"-12when "001101"=>a2<="000001"a1<="000011"-13when "001110"=>a2<="000001"a1<="000100"-14when "001111"=>a2<="000001"a1<="000101"-15when "010000"=>a2<=&quo

36、t;000001"a1<="000110"-16when "010001"=>a2<="000001"a1<="000111"-17when "010010"=>a2<="000001"a1<="001000"-18when "010011"=>a2<="000001"a1<="001001"-19when "0101

37、00"=>a2<="000010"a1<="000000"-20when "010101"=>a2<="000010"a1<="000001"-21when "010110"=>a2<="000010"a1<="000010"-22when "010111"=>a2<="000010"a1<="000011

38、"-23when "011000"=>a2<="000010"a1<="000100"-24when "011001"=>a2<="000010"a1<="000101"-25when "011010"=>a2<="000010"a1<="000110"-26when "011011"=>a2<="000010&

39、quot;a1<="000111"-27when "011100"=>a2<="000010"a1<="001000"-28when "011101"=>a2<="000010"a1<="001001"-29when "011110"=>a2<="000011"a1<="000000"-30when "011111"=

40、>a2<="000011"a1<="000001"-31when "100000"=>a2<="000011"a1<="000010"-32when "100001"=>a2<="000011"a1<="000011"-33when "100010"=>a2<="000011"a1<="000100"-34

41、when "100011"=>a2<="000011"a1<="000101"-35when "100100"=>a2<="000011"a1<="000110"-36when "100101"=>a2<="000011"a1<="000111"-37when "100110"=>a2<="000011"a1&l

42、t;="001000"-38when "100111"=>a2<="000011"a1<="001001"-39when "101000"=>a2<="000100"a1<="000000"-40when "101001"=>a2<="000100"a1<="000001"-41when "101010"=>a2<

43、;="000100"a1<="000010"-42when "101011"=>a2<="000100"a1<="000011"-43when "101100"=>a2<="000100"a1<="000100"-44when others=>null;end case;end process p0;p1 : process(a25)begin case a25 iswhen "

44、00000"=>a4<="000000"a3<="000000"-0when "00001"=>a4<="000000"a3<="000001"-1when "00010"=>a4<="000000"a3<="000010"-2when "00011"=>a4<="000000"a3<="000011&qu

45、ot;-3when "00100"=>a4<="000000"a3<="000100"-4when "00101"=>a4<="000000"a3<="000101"-5when "00110"=>a4<="000000"a3<="000110"-6when "00111"=>a4<="000000"a3<

46、="000111"-7when "01000"=>a4<="000000"a3<="001000"-8when "01001"=>a4<="000000"a3<="001001"-9when "01010"=>a4<="000001"a3<="000000"-10when "01011"=>a4<="0

47、00001"a3<="000001"-11when "01100"=>a4<="000001"a3<="000010"-12when "01101"=>a4<="000001"a3<="000011"-13when "01110"=>a4<="000001"a3<="000100"-14when "01111"

48、;=>a4<="000001"a3<="000101"-15when "10000"=>a4<="000001"a3<="000110"-16when "10001"=>a4<="000001"a3<="000111"-17when "10010"=>a4<="000001"a3<="001000"-18w

49、hen "10011"=>a4<="000001"a3<="001001"-19when "10100"=>a4<="000010"a3<="000000"-20when "10101"=>a4<="000010"a3<="000001"-21when "10110"=>a4<="000010"a3<=&q

50、uot;000010"-22when "10111"=>a4<="000010"a3<="000011"-23when "11000"=>a4<="000010"a3<="000100"-24when others=>null;end case;end process p1;p2 : process(cnt4)begincase cnt4 iswhen "000" => bt <= "1110" ; a<=a1;when "001" => bt <= "1101" ; a<=a2;wh

温馨提示

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

评论

0/150

提交评论