53 lines
1.4 KiB
VHDL
53 lines
1.4 KiB
VHDL
library IEEE;
|
|
use IEEE.STD_LOGIC_1164.ALL;
|
|
use ieee.numeric_std.all;
|
|
|
|
entity regfile is
|
|
Port ( outregna: in std_logic_vector(3 downto 0);
|
|
outregda: out std_logic_vector(15 downto 0);
|
|
|
|
outregnb: in std_logic_vector(3 downto 0);
|
|
outregdb: out std_logic_vector(15 downto 0);
|
|
|
|
inregn: in std_logic_vector(3 downto 0);
|
|
inregd: in std_logic_vector(15 downto 0);
|
|
inwe: in std_logic;
|
|
|
|
rst : in STD_LOGIC;
|
|
clk : in STD_LOGIC
|
|
);
|
|
end regfile;
|
|
|
|
architecture Behavioral of regfile is
|
|
component reg is
|
|
Port ( d : in STD_LOGIC_VECTOR (15 downto 0);
|
|
q : out STD_LOGIC_VECTOR (15 downto 0);
|
|
rst : in STD_LOGIC;
|
|
clk : in STD_LOGIC);
|
|
end component;
|
|
|
|
type regbank is array(0 to 15) of std_logic_vector(15 downto 0);
|
|
signal regd: regbank;
|
|
signal regq: regbank;
|
|
begin
|
|
|
|
regs:
|
|
for i in 0 to 15 generate
|
|
regx: reg port map(d => regd(i), q => regq(i), rst => rst, clk => clk);
|
|
end generate;
|
|
|
|
outregda <= regq(to_integer(unsigned(outregna)));
|
|
outregdb <= regq(to_integer(unsigned(outregnb)));
|
|
|
|
process(inregn, inregd, regq, inwe)
|
|
begin
|
|
for i in 0 to 15 loop
|
|
regd(i) <= regq(i);
|
|
if inwe = '1' then
|
|
regd(to_integer(unsigned(inregn))) <= inregd;
|
|
end if;
|
|
end loop;
|
|
end process;
|
|
|
|
end Behavioral;
|