library IEEE; use IEEE.std_logic_1164.all; entity Vsvale is port ( CLOCK, RESET, NSCAR, EWCAR, TMSHORT, TMLONG: in STD_LOGIC; OVERRIDE, FLASHCLK: in STD_LOGIC; NSRED, NSYELLOW, NSGREEN: out STD_LOGIC; EWRED, EWYELLOW, EWGREEN, TMRESET: out STD_LOGIC ); end; architecture Vsvaleoc_arch of Vsvale is signal Sreg: STD_LOGIC_VECTOR (1 to 7); -- bit positions of output-coded assignment: (1) NSRED, (2) NSYELLOW, (3) NSGREEN, -- (4) EWRED, (5) EWYELLOW, (6) EWGREEN, (7) EXTRA constant NSGO: STD_LOGIC_VECTOR (1 to 7) := "0011000"; constant NSWAIT: STD_LOGIC_VECTOR (1 to 7) := "0101000"; constant NSWAIT2: STD_LOGIC_VECTOR (1 to 7) := "0101001"; constant NSDELAY: STD_LOGIC_VECTOR (1 to 7) := "1001000"; constant EWGO: STD_LOGIC_VECTOR (1 to 7) := "1000010"; constant EWWAIT: STD_LOGIC_VECTOR (1 to 7) := "1000100"; constant EWWAIT2: STD_LOGIC_VECTOR (1 to 7) := "1000101"; constant EWDELAY: STD_LOGIC_VECTOR (1 to 7) := "1001001"; begin process (CLOCK) begin if CLOCK'event and CLOCK = '1' then if RESET = '1' then Sreg <= NSDELAY; else case Sreg is when NSGO => -- North-south green. if TMSHORT='0' then Sreg <= NSGO; -- Minimum 5 seconds. elsif TMLONG='1' then Sreg <= NSWAIT; -- Maximum 5 minutes. elsif EWCAR='1' and NSCAR='0' then Sreg <= NSGO; -- Make EW car wait. elsif EWCAR='1' and NSCAR='1' then Sreg <= NSWAIT; -- Thrash if cars both ways. elsif EWCAR='0' and NSCAR='1' then Sreg <= NSWAIT; -- New NS car? Make it stop! else Sreg <= NSGO; -- No one coming, stay as is. end if; when NSWAIT => Sreg <= NSWAIT2; -- Yellow light, when NSWAIT2 => Sreg <= NSDELAY; -- two ticks for safety. when NSDELAY => Sreg <= EWGO; -- Red both ways for safety. when EWGO => -- East-west green. if TMSHORT='0' then Sreg <= EWGO; -- Same behavior as above. elsif TMLONG='1' then Sreg <= EWWAIT; elsif NSCAR='1' and EWCAR='0' then Sreg <= EWGO; elsif NSCAR='1' and EWCAR='1' then Sreg <= EWWAIT; elsif NSCAR='0' and EWCAR='1' then Sreg <= EWWAIT; else Sreg <= EWGO; end if; when EWWAIT => Sreg <= EWWAIT2; when EWWAIT2 => Sreg <= EWDELAY; when EWDELAY => Sreg <= NSGO; when others => Sreg <= NSDELAY; -- "Reset" state. end case; end if; end if; end process; TMRESET <= '1' when Sreg=NSWAIT2 or Sreg=EWWAIT2 else '0'; NSRED <= Sreg(1); NSYELLOW <= Sreg(2); NSGREEN <= Sreg(3); EWRED <= Sreg(4); EWYELLOW <= Sreg(5); EWGREEN <= Sreg(6); end Vsvaleoc_arch;