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;
|