基于VHDL语言的交通灯

基于VHDL语言的交通灯
基于VHDL语言的交通灯

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY traffic IS

PORT (CLK,R,SP,fault: IN STD_LOGIC;

eLIGHT : BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0);--东:绿,黄,红

sLIGHT : BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0);--南:绿,黄,红

wLIGHT : BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0);--西:绿,黄,红

nLIGHT : BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0);--北:绿,黄,红

SEL : BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0);

Q1,Q2 : OUT INTEGER RANGE 0 TO 24;---------倒计时

SMG :OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

END traffic ;

ARCHITECTURE RT1 OF traffic IS

TYPE STATES IS (S0,S1,S2,S3);

SIGNAL STATE : STATES ;

SIGNAL CLK1HZ:STD_LOGIC;

SIGNAL T:INTEGER RANGE 0 TO 10;

SIGNAL T1,T2: INTEGER RANGE 0 TO 24;

SIGNAL L1,L2,L3,L4 : INTEGER RANGE 0 TO 10;

BEGIN

P1:PROCESS(CLK) ------产生1Hz时钟的分频计数器

V ARIABLE cnt : INTEGER RANGE 0 TO 512;

BEGIN

IF CLK='1' AND CLK'EVENT THEN

IF cnt=511 THEN cnt:=0;

ELSE

IF cnt<256 THEN CLK1HZ<='1';

ELSE CLK1HZ<='0';

END IF;

cnt:=cnt+1;

END IF;

END IF;

END PROCESS;

----------------------------------------------------

P2: PROCESS (CLK1HZ,fault,T1,T2,SP,R,eLIGHT(1),sLIGHT(1),wLIGHT(1),nLIGHT(1)) BEGIN

IF R='1' THEN STA TE<=S0;T1<=16;T2<=19;--初始状态

ELSIF SP='1' THEN -------------------紧急状态

eLIGHT<="001";sLIGHT<="001";

wLIGHT<="001";nLIGHT<="001";

STATE<=S0;T1<=16;T2<=19;

ELSIF fault='1' THEN-----------------系统出现故障

eLIGHT<="010";sLIGHT<="010";

wLIGHT<="010";nLIGHT<="010";

eLIGHT(1)<=CLK1HZ;

sLIGHT(1)<=CLK1HZ;

wLIGHT(1)<=CLK1HZ;

nLIGHT(1)<=CLK1HZ;

STATE<=S0;T1<=16;T2<=19;

ELSIF (CLK1HZ'EVENT AND CLK1HZ='1') THEN------正常运行CASE STATE IS

--------------------------------------------------------------

WHEN S0=> eLIGHT<="001";wLIGHT<="001";--禁东西干道

sLIGHT<="100";nLIGHT<="100";--通南北干道T1<=T1-1;T2<=T2-1;

Q1<=T1;Q2<=T2;

IF T1=0 THEN

STATE<=S1;T1<=2;T2<=2;

END IF;

WHEN S1=> eLIGHT<="001";wLIGHT<="001";

sLIGHT<="010";nLIGHT<="010";--南北黄灯T1<=T1-1;T2<=T2-1;

Q1<=T1;Q2<=T2;

IF T1=0 THEN

STATE<=S2;T1<=24;T2<=19;

END IF;

---------------------------------------------------------------

WHEN S2=> eLIGHT<="100";wLIGHT<="100";--通东西干道

sLIGHT<="001";nLIGHT<="001";--禁南北干道T1<=T1-1;T2<=T2-1;

Q1<=T1;Q2<=T2;

IF T2=0 THEN

STATE<=S3;T1<=4;T2<=4;

END IF;

WHEN S3=> eLIGHT<="010";wLIGHT<="010";--东西黄灯

sLIGHT<="001";nLIGHT<="001";

T1<=T1-1;T2<=T2-1;

Q1<=T1;Q2<=T2;

IF T1=0 THEN

STATE<=S0;T1<=17;T2<=19;

END IF;

WHEN OTHERS=>STA TE<=S0;T1<=16;T2<=19;

END CASE;

END IF;

L1<=T1/10;L2<=T1 REM 10;--求A干道,十位,个位

L3<=T2/10;L4<=T2 REM 10;--求B干道,十位,个位

END PROCESS;

---------------------------------------------------------------------- P3:PROCESS(CLK)

BEGIN

IF CLK'EVENT AND CLK='1' THEN

SEL<=SEL+1;

END IF;

END PROCESS;

--------------------------------------------------------

P4:PROCESS(SEL,T,STATE,L1,L2,L3,L4)

BEGIN

if (STATE=S0 OR STA TE=S1) THEN

CASE SEL IS

WHEN "000" => T<=L2;

WHEN "001" => T<=L1;

WHEN OTHERS =>T<=10;

END CASE;

END IF;

IF (STATE=S2 OR STA TE=S3) THEN

CASE SEL IS

WHEN "010" => T<=L4;

WHEN "011" => T<=L3;

WHEN OTHERS =>T<=10;

END CASE;

END IF;

END PROCESS;

--------------------------------------------------------

P5:PROCESS(T)

BEGIN

CASE T IS

WHEN 0=>SMG<="01111110";

WHEN 1=>SMG<="00110000";

WHEN 2=>SMG<="01101101";

WHEN 3=>SMG<="01111001";

WHEN 4=>SMG<="00110011";

WHEN 5=>SMG<="01011011";

WHEN 6=>SMG<="00011111";

WHEN 7=>SMG<="01110000";

WHEN 8=>SMG<="01111111";

WHEN 9=>SMG<="01110011";

WHEN OTHERS=> SMG<="00000000";

END CASE;

END PROCESS;

END RT1;

相关主题
相关文档
最新文档