Что такое правильный способ вывода ОЗУ с некоторыми неиспользуемыми более высокими адресами (с использованием блоков RAM)?
Используя приведенный ниже код (значения по умолчанию для дженерик, Xilinx синтезаторов и карты) я получаю ОЗУ размер такие же, как если бы глубина была установлен 2**ADDRWIDTH
:Вывод BRAM с неиспользуемыми адресами эффективно
entity foo is
generic (
DATAWIDTH : positive := 8;
DATADEPTH : positive := 5000;
ADDRWIDTH : positive := 13
);
port (
clk_a : in std_logic;
we_a : in std_logic;
addr_a : in std_logic_vector(ADDRWIDTH-1 downto 0);
di_a : in std_logic_vector(DATAWIDTH-1 downto 0);
do_a : out std_logic_vector(DATAWIDTH-1 downto 0)
);
end foo;
architecture bar of foo is
type myram_type is array (DATADEPTH-1 downto 0) of std_logic_vector(DATAWIDTH-1 downto 0); --! type for ram content
shared variable myram : myram_type; --! ram
begin
process (clk_a)
begin
if rising_edge(clk_a) then
if we_a = '1' then
myram(conv_integer(addr_a)) := di_a;
end if;
do_a <= myram(conv_integer(addr_a));
end if;
end process;
end bar;
Например, я хочу RAM с DATAWIDTH = 8
и DATADEPTH = 5000
, поэтому адрес должен быть ADDRWIDTH = 13
, потому что ADDRWIDTH = 12
разрешил бы только адреса 4096 RAM. Предположим, что один блок RAM-ресурса на моем FPGA может содержать 8192 бит. Если бы я закодировал это вручную, мне потребовалось 5000 * 8/8192, округленное вверх = 5 блоков памяти RAM. Однако с помощью кода, приведенного выше, синтез и карта Xilinx приводят к использованию 8-разрядных операционных ресурсов, потому что это то, что может быть адресовано адресами с 13-битным ширмом ...
Тем не менее, это не очень эффективное использование ресурсов с 3 из 8 блоков RAM никогда не будут использоваться.
Я попытался проверить, больше ли адрес на входе больше DATADEPTH
, а затем назначить, не заботясь о данных, но это приводит к тому, что весь ПЗУ реализуется как распределенная RAM/LUTRAM.
Я пропустил что-то важное или мне нужно использовать один большой уродливый генератор для этого?
Попробуйте использовать натуральный не SLV для типа адреса.Это может быть conv_integer (который в любом случае нестандартен), что заставляет синтезатор быть чрезмерно осторожным. –
Причина, по которой я использую slv, заключается в том, что это часть смешанного проекта Verilog/VHDL. По соглашению мы не используем другие типы на интерфейсах, чем slv и integer, чтобы избежать проблем с печатанием. – damage