当前位置:文档之家› 交通灯信号控制器的设计

交通灯信号控制器的设计

交通灯信号控制器的设计一,设计任务与要求交通灯控制信号用于主干道公路的交叉口,要求是优先保证主干道的畅通,因此,平时处于“主干道绿灯,支干道红灯”的状态。

1.当处于“主干道绿灯,支干道红灯”状态时:(1)、主干道有车要求通行,支干道也有车要求通行时,若主干道通行时间大于等于30S则切换到“主黄,支红”,4S后自动换到“主红,支绿”。

(2)、主干道无车要求通行,支干道有车要求通行时,立即切换到“主黄,支红”,4S后自动自动切换到“主红,支绿”。

其他情况保持“主绿,支红”。

2.当处于“主红,支绿”状态时:(1)、支道有车要求通行时,保持“主红,支绿”状态,但最多保持30S 然后自动切换到“主红,支黄”状态,4S后自动切换到“主绿,支红”状态。

(2)、支道无车要求通过时,立即切换到“主红,支黄”状态,4S后自动切换到“主绿,支红”状态。

3.利用八位七段管码显示模块其中的2位实现时间显示。

二,总体框图初步设计图三,选择器件1,(1)3-8译码器74138芯片.(2)3-8译码器74138的逻辑功能表:(3)3-8译码器74138的内部原理图:(4)3-8译码器74138的作用:74138有三个附加的控制端。

当G1为高电平,G2AN和G2BN为低电平时,输出为高电平(S=1),译码器处于工作状态。

否则,译码器被禁止,所有的输出端被封锁在高电平。

这三个控制端也叫做“片选”输入端,利用片选的作用可以将多篇连接起来以扩展译码器的功能。

本设计所用实验箱的8个数码管采用扫描显示方式,数码管位选电路在扫描信号的控制下轮流输出8路数据,此8路数据时分复用一个BCD7段显示译码器。

数码管位选电路同时输出位选信号,经74LS138译码器译码后分别选中8个数码管。

在位选选中一个数码管的的情况下送出段码,在该段码管中显示段码字符,然后接着选中其它数码管,送其他字符。

四,功能模块1..原理概述:(1)由于主干道,支干道的交通灯均在绿,黄,红三种状态之间有顺序的转换,组合共有四种。

所以,利用状态机按照设定的条件实现"主绿,支红" 、"主黄,支红" 、"主红,支绿"、"主红,支黄"4种状态之间的切换。

(2)因为红黄绿灯之间转换有时间限制,所以要有计数器,可用七段数码管显示模块,由于时间是两位数,所以只需要八位七段管码显示模块其中的2位实现时间显示。

(3)由于实验室提供的基准频率为50MHZ,所以得用分频器得到所需要的频率。

2.各模块设计程序及模块图1.1计数器:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY counter ISPORT (clk:IN STD_LOGIC;reset:in std_logic;countNum:BuFFeR INTEGER RANGE 0 TO 64);END;ARCHITECTURE behavior OF counter ISBEGINprocess(reset,Clk)BEGINIF Reset='1' THENcountNum<=0;ELSIF rising_edge(Clk) THENIF countNum=64 THENcountNum<=0;ELSEcountNum<=countNum+1;END IF;END IF;END PROCESS;END;生成模块图:1.2七段显示器程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY bcd_data ISPORT(bcd_data:in STD_LOGIC_VECTOR(3 downto 0); segout: out STD_LOGIC_VECTOR(6 downto 0)); END;ARCHITECTURE behavior OF bcd_data IS BEGINprocess(bcd_data)BEGINcase bcd_data iswhen "0000"=>segout<="0111111";when "0001"=>segout<="0000110";when "0010"=>segout<="1011011";when "0011" =>segout<="1001111";when "0100" =>segout<="1100110" ;when "0101"=>segout<="1101101" ;when "0110"=>segout<="1111101" ;when "0111"=>segout<="0000111" ;when "1000" =>segout<="1111111" ;when "1001" =>segout<="1101111";when others =>null;END CASE;END PROCESS;END;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_unsigned.ALL;ENTITY dtsm ISPORT(clk:in STD_LOGIC;NumA,NumB: in STD_LOGIC_VECTOR(3 downto 0); segout1:out STD_LOGIC_VECTOR(6 downto 0);led_sel:out STD_LOGIC_VECTOR(2 downto 0)); END dtsm;architecture bhv of dtsm iscomponent bcd_data isport (bcd_data:in STD_LOGIC_VECTOR(3 downto 0);segout:out STD_LOGIC_VECTOR(6 downto 0)); end component;signal x:STD_LOGIC_VECTOR(3 downto 0);signal Q:STD_LOGIC;beginp1:process(clk)beginif clk'event and clk ='1' thenif Q='1' THEN Q<='0';ELSE Q<='1';END IF;end if;end process;p2:process(Q)begincase Q iswhen'0'=>led_sel<="010";x<=NumB;when'1'=>led_sel<="001";x<=NumA;when others=>null;end case;end process;u1:bcd_data PORT map(bcd_data=>x,segout=>segout1);end;生成模块图:1.3分频器:分频器实现的是将高频时钟信号转换成低频的时钟信号,用于触发控制器、计数器和扫描显示电路。

1.3.1 分频到512Hz程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin123 isport (clk: in std_logic;clkfen: out std_logic);end fenpin123;architecture fenpin of fenpin123 issignal clk_mid: std_logic;beginprocess(clk)variable data:integer range 0 to 48828;---将基准信号分频到512Hz beginif clk'event and clk='1' thenif data=48828 thendata:=0;clk_mid<=not clk_mid;elsedata:=data+1;end if;end if;clkfen<=clk_mid;end process;end fenpin;生成模块图:1.3.2分频到1Hz程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin isport( clk:in std_logic;finout:out std_logic);end fenpin;architecture bhv of fenpin issignal tmp:INTEGER RANGE 0 TO 49999999; beginprocess(clk)beginif clk'event and clk='1' thenif tmp=49999999 then tmp<=00000000;else tmp<=tmp+1;end if;if tmp<25000000 then finout<='0';else finout<='1';end if;end if;end process;end bhv;生成模块图:1.4分位程序因为控制器输出的到计时数值可能是1位或者2位十进制数,所以在七段数码管的译码电路前要加上分位电路(即将其分为2个1位的十进制数,如25分为2和5,7分为0和7)。

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH;ENTITY FENWEI ISPORT(Numin:IN integer RANGE 0 TO 31;NumA,NumB:OUT Integer RANGE 0 to 9);END;ARCHITECTURE behavior OF FENWEI ISBEGINprocess(Numin)BEGINIF Numin>=30 THENNumA<=3;NumB<=Numin-30;ELSIF Numin>=20 THENNumA<=2;NumB<=Numin-20;ELSIF Numin>=10 THENNumA<=1;NumB<=Numin-10;ELSENumA<=0;NumB<=Numin;END IF;END PROCESS;END;生成模块图:1.5交通灯控制程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH;ENTITY traffic ISPORT(CLK , SM , SB : IN BIT;MR,MY,MG,BR,BY,BG : OUT BIT;reset:OUT std_logic;CountNum:in INTEGER RANGE 0 TO 64;Num:out INTEGER RANGE 0 TO 31);END traffic;ARCHITECTURE BEHA V OF traffic ISTYPE STATE_TYPE IS (A,B,C,D);SIGNAL STATE : STATE_TYPE ;BEGINCNT:PROCESS(CLK,SM,SB,CountNum)BEGINIF CLK'EVENT AND CLK='1' THENCASE STATE ISWHEN A => MR<='0';MY<='0';MG<='1';--主绿支红BR<='1';BY<='0';BG<='0';RESET<='0';IF CountNum<=29 THENNum<=30-CountNum;ELSESTATE<=B;RESET<='1';END IF;END IF;IF (SB AND(NOT SM))='1' THENSTATE<=B;RESET<='1';END IF;WHEN B => MR<='0';MY<='1';MG<='0';--主黄支红BR<='1';BY<='0';BG<='0';RESET<='0';IF CountNum<=3 THENNum<=4-CountNum;ELSESTATE<=C;RESET<='1';END IF;WHEN C => MR<='1';MY<='0';MG<='0';--主红支绿BR<='0';BY<='0';BG<='1';RESET<='0';IF (SB AND SM)='1' THENNum<=30-CountNum;ELSESTATE<=D;RESET<='1';END IF;END IF;IF SB='0' THENSTATE<=D;RESET<='1';END IF;WHEN D => MR<='1';MY<='0';MG<='0';--主红支黄BR<='0';BY<='1';BG<='0';RESET<='0';IF CountNum<=3 THENNum<=4-CountNum;ELSESTATE<=A;RESET<='1';END IF;WHEN OTHERS=>STATE<=A;END CASE;END IF;END PROCESS CNT;END BEHA V;生成模块图:五,总体设计电路图1,总体原理图示管显示出时间。

相关主题