library IEEE; use IEEE.STD_LOGIC_1164.all; library ieee; use ieee.std_logic_arith.all; library ieee; use ieee.STD_LOGIC_UNSIGNED.all; entity PICREGS is port ( Clk : in STD_LOGIC; WriteEnable : in STD_LOGIC; -- Interface to microprogram in ROM FSel : in STD_LOGIC_VECTOR(4 downto 0); -- Input busses Din : in STD_LOGIC_VECTOR(7 downto 0); -- Output busses Dout : out STD_LOGIC_VECTOR(7 downto 0)); end PICREGS; architecture first of PICREGS is -- Registers -- -- Note: I've commented out the higher registers beyond R12 because I -- did not reference them in my test, and they bog down my -- synthesizer. -- signal R8 : STD_LOGIC_VECTOR (7 downto 0); signal R9 : STD_LOGIC_VECTOR (7 downto 0); signal R10 : STD_LOGIC_VECTOR (7 downto 0); signal R11 : STD_LOGIC_VECTOR (7 downto 0); signal R12 : STD_LOGIC_VECTOR (7 downto 0); -- ** Let's not synthesize any more for now.. -- signal R13 : STD_LOGIC_VECTOR (7 downto 0); -- signal R14 : STD_LOGIC_VECTOR (7 downto 0); -- signal R15 : STD_LOGIC_VECTOR (7 downto 0); -- signal R16 : STD_LOGIC_VECTOR (7 downto 0); -- signal R17 : STD_LOGIC_VECTOR (7 downto 0); -- signal R18 : STD_LOGIC_VECTOR (7 downto 0); -- signal R19 : STD_LOGIC_VECTOR (7 downto 0); -- signal R20 : STD_LOGIC_VECTOR (7 downto 0); -- signal R21 : STD_LOGIC_VECTOR (7 downto 0); -- signal R22 : STD_LOGIC_VECTOR (7 downto 0); -- signal R23 : STD_LOGIC_VECTOR (7 downto 0); -- signal R24 : STD_LOGIC_VECTOR (7 downto 0); -- signal R25 : STD_LOGIC_VECTOR (7 downto 0); -- signal R26 : STD_LOGIC_VECTOR (7 downto 0); -- signal R27 : STD_LOGIC_VECTOR (7 downto 0); -- signal R28 : STD_LOGIC_VECTOR (7 downto 0); -- signal R29 : STD_LOGIC_VECTOR (7 downto 0); -- signal R30 : STD_LOGIC_VECTOR (7 downto 0); -- signal R31 : STD_LOGIC_VECTOR (7 downto 0); begin -- Concurrently always route register outputs out the register file based -- on the select lines. -- Dout <= R8 When CONV_INTEGER(Fsel) = 8 Else R9 When CONV_INTEGER(Fsel) = 9 Else R10 When CONV_INTEGER(Fsel) = 10 Else R11 When CONV_INTEGER(Fsel) = 11 Else R12 When CONV_INTEGER(Fsel) = 12 Else -- R13 When v1d2int(Fsel) = 13 Else -- R14 When v1d2int(Fsel) = 14 Else -- R15 When v1d2int(Fsel) = 15 Else -- R16 When v1d2int(Fsel) = 16 Else -- R17 When v1d2int(Fsel) = 17 Else -- R18 When v1d2int(Fsel) = 18 Else -- R19 When v1d2int(Fsel) = 19 Else -- R20 When v1d2int(Fsel) = 20 Else -- R21 When v1d2int(Fsel) = 21 Else -- R22 When v1d2int(Fsel) = 22 Else -- R23 When v1d2int(Fsel) = 23 Else -- R24 When v1d2int(Fsel) = 24 Else -- R25 When v1d2int(Fsel) = 25 Else -- R26 When v1d2int(Fsel) = 26 Else -- R27 When v1d2int(Fsel) = 27 Else -- R28 When v1d2int(Fsel) = 28 Else -- R29 When v1d2int(Fsel) = 29 Else -- R30 When v1d2int(Fsel) = 30 Else -- R31 When v1d2int(Fsel) = 31 Else "00000000"; -- Writes are synchronous with the clk. -- DoIt: process (clk) begin if rising_edge(clk) then if WriteEnable = '1' then -- Write Din into the selected register case CONV_INTEGER(FSel) is When 8 => R8 <= Din; When 9 => R9 <= Din; When 10 => R10 <= Din; When 11 => R11 <= Din; When 12 => R12 <= Din; -- When 13 => R13 <= Din; -- When 14 => R14 <= Din; -- When 15 => R15 <= Din; -- When 16 => R16 <= Din; -- When 17 => R17 <= Din; -- When 18 => R18 <= Din; -- When 19 => R19 <= Din; -- When 20 => R20 <= Din; -- When 21 => R21 <= Din; -- When 22 => R22 <= Din; -- When 23 => R23 <= Din; -- When 24 => R24 <= Din; -- When 25 => R25 <= Din; -- When 26 => R26 <= Din; -- When 27 => R27 <= Din; -- When 28 => R28 <= Din; -- When 29 => R29 <= Din; -- When 30 => R30 <= Din; -- When 31 => R31 <= Din; when OTHERS => NULL; end case; end if; end if; end process DoIt; end first;