LIBRARY IEEE; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_1164.all; ENTITY Decode2 IS PORT( Enable : IN STD_LOGIC; clk : IN STD_LOGIC; Data : IN STD_LOGIC; DataReady : OUT STD_LOGIC; R : OUT STD_LOGIC; A : OUT STD_LOGIC; B : OUT STD_LOGIC; LEFTRIGHTSIGN : OUT STD_LOGIC; UPDOWNSIGN : OUT STD_LOGIC; LEFTRIGHTOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); UPDOWNOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END Decode2; ARCHITECTURE a OF Decode2 IS SIGNAL Bit : STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL Byte : STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL UPDOWN : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL LEFTRIGHT : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS (clk) BEGIN IF(Clk'EVENT and Clk = '1') THEN IF(Enable = '0') THEN Bit <= "111"; Byte <= "111"; A <= '0'; B <= '0'; R <= '0'; DataReady <= '0'; UPDOWN <= "00000000"; LEFTRIGHT <= "00000000"; UPDOWNOUT <= "00000000"; LEFTRIGHTOUT <= "00000000"; UPDOWNSIGN <= '0'; LEFTRIGHTSIGN <= '0'; ELSE IF(Bit = "111") THEN Bit <= "000"; Byte <= Byte + 1; ELSE Bit <= Bit +1; END IF; IF(Byte = "000" AND Bit = "111" AND Data = '1') THEN --is A Pressed? A <= '1'; END IF; IF(Byte = "000" AND Bit = "110" AND Data = '1') THEN --is B Pressed? B <= '1'; END IF; IF(Byte = "001" AND Bit = "010" AND Data = '1') THEN --is R Pressed? R <= '1'; END IF; IF(Byte = "100") THEN --Analog LeftRight? LEFTRIGHT <= LEFTRIGHT(6 DOWNTO 0) & Data; ELSIF(Byte = "101") THEN --Analog UPDOWN? UPDOWN <= UPDOWN(6 DOWNTO 0) & Data; ELSIF(Byte = "110" AND Bit = "111") THEN --IF(LEFTRIGHT(7) = '0' AND LEFTRIGHT(6) = '0')THEN -- LEFTRIGHTOUT <= "11111111"; -- LEFTRIGHTSIGN <= '1'; --ELSIF(LEFTRIGHT(7) = '1' AND LEFTRIGHT(6) = '1') THEN -- LEFTRIGHTOUT <= "00000001"; -- LEFTRIGHTSIGN <= '0'; --ELSE -- LEFTRIGHTOUT <= "00000000"; -- LEFTRIGHTSIGN <= '0'; --END IF; IF(LEFTRIGHT(7) = '0' AND LEFTRIGHT(6) = '0' AND LEFTRIGHT(5) = '0') THEN LEFTRIGHTOUT <= "11111101"; LEFTRIGHTSIGN <= '1'; ELSIF(LEFTRIGHT(7) = '0' AND LEFTRIGHT(6) = '0' AND LEFTRIGHT(5) = '1') THEN LEFTRIGHTOUT <= "11111110"; LEFTRIGHTSIGN <= '1'; ELSIF(LEFTRIGHT(7) = '0' AND LEFTRIGHT(6) = '1' AND LEFTRIGHT(5) = '0') THEN LEFTRIGHTOUT <= "11111111"; LEFTRIGHTSIGN <= '1'; ELSIF(LEFTRIGHT(7) = '0' AND LEFTRIGHT(6) = '1' AND LEFTRIGHT(5) = '1') THEN LEFTRIGHTOUT <= "00000000"; LEFTRIGHTSIGN <= '0'; ELSIF(LEFTRIGHT(7) = '1' AND LEFTRIGHT(6) = '0' AND LEFTRIGHT(5) = '0') THEN LEFTRIGHTOUT <= "00000000"; LEFTRIGHTSIGN <= '0'; ELSIF(LEFTRIGHT(7) = '1' AND LEFTRIGHT(6) = '0' AND LEFTRIGHT(5) = '1') THEN LEFTRIGHTOUT <= "00000001"; LEFTRIGHTSIGN <= '0'; ELSIF(LEFTRIGHT(7) = '1' AND LEFTRIGHT(6) = '1' AND LEFTRIGHT(5) = '0') THEN LEFTRIGHTOUT <= "00000010"; LEFTRIGHTSIGN <= '0'; ELSIF(LEFTRIGHT(7) = '1' AND LEFTRIGHT(6) = '1' AND LEFTRIGHT(5) = '1') THEN LEFTRIGHTOUT <= "00000011"; LEFTRIGHTSIGN <= '0'; END IF; IF(UPDOWN(7) = '0' AND UPDOWN(6) = '0' AND UPDOWN(5) = '0') THEN UPDOWNOUT <= "11111101"; UPDOWNSIGN <= '1'; ELSIF(UPDOWN(7) = '0' AND UPDOWN(6) = '0' AND UPDOWN(5) = '1') THEN UPDOWNOUT <= "11111110"; UPDOWNSIGN <= '1'; ELSIF(UPDOWN(7) = '0' AND UPDOWN(6) = '1' AND UPDOWN(5) = '0') THEN UPDOWNOUT <= "11111111"; UPDOWNSIGN <= '1'; ELSIF(UPDOWN(7) = '0' AND UPDOWN(6) = '1' AND UPDOWN(5) = '1') THEN UPDOWNOUT <= "00000000"; UPDOWNSIGN <= '0'; ELSIF(UPDOWN(7) = '1' AND UPDOWN(6) = '0' AND UPDOWN(5) = '0') THEN UPDOWNOUT <= "00000000"; UPDOWNSIGN <= '0'; ELSIF(UPDOWN(7) = '1' AND UPDOWN(6) = '0' AND UPDOWN(5) = '1') THEN UPDOWNOUT <= "00000001"; UPDOWNSIGN <= '0'; ELSIF(UPDOWN(7) = '1' AND UPDOWN(6) = '1' AND UPDOWN(5) = '0') THEN UPDOWNOUT <= "00000010"; UPDOWNSIGN <= '0'; ELSIF(UPDOWN(7) = '1' AND UPDOWN(6) = '1' AND UPDOWN(5) = '1') THEN UPDOWNOUT <= "00000011"; UPDOWNSIGN <= '0'; END IF; --IF(UPDOWN(7) = '0' AND UPDOWN(6) = '0')THEN -- UPDOWNOUT <= "11111111"; -- UPDOWNSIGN <= '1'; --ELSIF(UPDOWN(7) = '1' AND UPDOWN(6) = '1') THEN -- UPDOWNOUT <= "00000001"; -- UPDOWNSIGN <= '0'; --ELSE -- UPDOWNOUT <= "00000000"; -- UPDOWNSIGN <= '0'; --END IF; ELSIF(Byte = "111" AND Bit = "000") THEN DataReady <= '1'; END IF; END IF; END IF; END PROCESS; END a; --behavior