📄 traffic.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TRAFFIC IS
PORT(start,en,clk,ew,sn : IN std_logic;
t1 : buffer INTEGER RANGE 107 downto 0;
EW_M : OUT std_logic_vector(2 downto 0);
EW_P : OUT std_logic_vector(1 downto 0);
EW_R,EW_L : OUT std_logic_vector(2 downto 0);
SN_M : OUT std_logic_vector(2 downto 0);
SN_P : OUT std_logic_vector(1 downto 0);
SN_R,SN_L :OUT std_logic_vector(2 downto 0));
END TRAFFIC ;
ARCHITECTURE one OF TRAFFIC IS
TYPE C_ST0 IS (S0,S1,S2,S3,S4,S5);
TYPE C_St1 IS (ST0,ST1,ST2,ST3,ST4,ST5);
SIGNAL SS0 : C_ST0;
SIGNAL SS1 : C_ST1;
SIGNAL Q1,Q2 : std_logic_vector(10 downto 0);
BEGIN
--计时时钟
CLOCK: PROCESS (start,en,clk)
VARIABLE t10:INTEGER RANGE 107 downto 0;
BEGIN
IF start='1' then t10:=0;
ELSIF clk'EVENT AND clk='1' then
IF en='1' then
t10:=t10+1;
END IF ;
END IF ;
t1<=t10;
END PROCESS;
--东西方向通道
EAST_WEST: PROCESS (start,clk)
BEGIN
IF start='1' THEN Q1<=(OTHERS=>'0');SS0<=S0;
ELSIF clk'EVENT AND clk='1' then
CASE SS0 IS
WHEN S0 => IF t1=30 then SS0<=S1;END IF;
Q1<="00101100100";
WHEN S1 =>
IF t1=32 then SS0<=S2;END IF;
Q1<="11010110100";
WHEN S2 => IF t1=87 then SS0<=S3;END IF;
Q1<="10010001100";
WHEN S3 => IF t1=89 then SS0<=S4;END IF;
Q1<="10010001110";
WHEN S4 => IF t1=105 then SS0<=S5;END IF;
Q1<="10010001001";
WHEN S5 => IF t1=107 then SS0<=S0;END IF;
Q1<="11010010010";
WHEN OTHERS =>SS0<=S0;
END CASE;
END IF;
IF en='0' and ew='0' and sn='1' THEN
Q1<="10010100100";
ELSIF en='0'and ew='1' and sn='0' THEN
Q1<="00110100100";END IF;
--东西方向紧急控制
IF t1>26 and t1<30 then Q1(6)<=CLK;END IF;
IF t1>101 and t1<105 then Q1(3)<=CLK;Q1(0)<=CLK;END IF;
EW_M<=Q1(10 DOWNTO 8);EW_P<=Q1(7 DOWNTO 6);
EW_R<=Q1(5 DOWNTO 3 );EW_L<=Q1(2 DOWNTO 0);
END PROCESS;
--南北方向通道
SOUTH_NORTH: PROCESS (start,clk)
BEGIN
IF start='1' THEN
Q2<=(OTHERS=>'0');SS1<=ST0;
ELSIF clk'EVENT AND clk='1' THEN
CASE SS1 IS
WHEN ST0 => IF t1=55 then SS1<=ST1;END IF;
Q2<="10010001100";
WHEN ST1 => IF t1=57 then SS1<=ST2;END IF;
Q2<="10010001110";
WHEN ST2 => IF t1=73 then SS1<=ST3;END IF;
Q2<="10010001001";
WHEN ST3 => IF t1=75 then SS1<=ST4;END IF;
Q2<="11010010010";
WHEN ST4 => IF t1=105 then SS1<=ST5;END IF;
Q2<="00101100100";
WHEN ST5 => IF t1=107 then SS1<=ST0;END IF;
Q2<="11010110100";
END CASE;
END IF;
IF en='0' and ew='1' and sn='0' THEN
Q2<="10010100100";
ELSIF en='0' and ew='0' and sn='1' THEN
Q2<="00110100100";END IF;
--南北方向紧急控制
IF t1>69 and t1<73 then Q2(3)<=CLK;Q2(0)<=CLK;END IF;
IF t1>101 and t1<105 then Q2(6)<=CLK;END IF;
SN_M<=Q2(10 DOWNTO 8);SN_P<=Q2(7 DOWNTO 6);
SN_R<=Q2(5 DOWNTO 3 );SN_L<=Q2(2 DOWNTO 0);
END PROCESS;
END One;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -