library IEEE;
use IEEE.std_logic_1164.all;

entity Vggame is 
  port ( CLOCK, RESET, G1, G2, G3, G4: in  STD_LOGIC;
         L1, L2, L3, L4, ERR:          out STD_LOGIC );
end;

architecture Vggameoc_arch of Vggame is
signal Sreg: STD_LOGIC_VECTOR (1 to 5);
-- bit positions of output-coded assignment: L1, L2, L3, L4, ERR
constant S1:   STD_LOGIC_VECTOR (1 to 5) := "10000";
constant S2:   STD_LOGIC_VECTOR (1 to 5) := "01000";
constant S3:   STD_LOGIC_VECTOR (1 to 5) := "00100";
constant S4:   STD_LOGIC_VECTOR (1 to 5) := "00010";
constant SERR: STD_LOGIC_VECTOR (1 to 5) := "00001";
constant SOK:  STD_LOGIC_VECTOR (1 to 5) := "00000";
begin

  process (CLOCK)
  begin
    if CLOCK'event and CLOCK = '1' then
      if RESET = '1' then Sreg <= SOK; else
        case Sreg is
          when S1   => if    G2='1' or G3='1' or G4='1' then Sreg <= SERR;
                       elsif G1='1'                     then Sreg <= SOK;
                       else                                  Sreg <= S2;
                       end if;
          when S2   => if    G1='1' or G3='1' or G4='1' then Sreg <= SERR;
                       elsif G1='1'                     then Sreg <= SOK;
                       else                                  Sreg <= S3;
                       end if;
          when S3   => if    G1='1' or G2='1' or G4='1' then Sreg <= SERR;
                       elsif G1='1'                     then Sreg <= SOK;
                       else                                  Sreg <= S4;
                       end if;
          when S4   => if    G1='1' or G2='1' or G3='1' then Sreg <= SERR;
                       elsif G1='1'                     then Sreg <= SOK;
                       else                                  Sreg <= S1;
                       end if;
          when SOK | SERR => if G1='0' and G2='0' and G3='0' and G4='0' 
                                 then Sreg <= S1; end if;
          when others => Sreg <= S1;
        end case;
      end if;
    end if;
  end process;      

  L1  <= Sreg(1);
  L2  <= Sreg(2);
  L3  <= Sreg(3);
  L4  <= Sreg(4);
  ERR <= Sreg(5);

end Vggameoc_arch;
