基于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;