, , , ,
addr_len
. 2 **
addr_len, .
, ,
,
, , ceil(log2(entries)), :
package common is
function ceil_log2(i : natural) return natural;
end package;
library ieee;
use ieee.math_real.all;
package body common is
function ceil_log2(i : natural) return natural is
begin
return integer(ceil(log2(real(i))));
end function;
end package body;
reg_num = 2 ** len,
, ceil_log2, :
library ieee;
use ieee.std_logic_1164.all;
library work;
use work.common.all;
entity register_file is
generic(
reg_width : integer := 32;
reg_num : integer := 16);
port (
data_in : in std_logic_vector(reg_width - 1 downto 0);
data_out : out std_logic_vector(reg_width - 1 downto 0);
rd_sel : in std_logic_vector(ceil_log2(reg_num) - 1 downto 0);
wr_sel : in std_logic_vector(ceil_log2(reg_num) - 1 downto 0);
rd_enable : in std_logic;
wr_enable : in std_logic;
clock : in std_logic);
end register_file;
register_file
rd_sel/wr_sel, , , , ,
ceil_log2, , .
, ,
reg_num sel_num:
entity register_file is
generic(
...
reg_num : integer := 16;
sel_num : integer := 4);
port (
...
rd_sel : in std_logic_vector(sel_num - 1 downto 0);
wr_sel : in std_logic_vector(sel_num - 1 downto 0);
...
...
architecture syn of register_file is
...
begin
...
assert 2 ** sel_num >= reg_num report "sel_num to small to address all registers given by reg_num";
end architecture;
.