В прошлом я писал код, который Vivado успешно синтезировал 2D-массив в VHDL в BRAM. Что-то вроде:
TYPE MY_2D_ARR IS ARRAY (0 to ARR_LEN-1) of STD_LOGIC_VECTOR(SLV_LEN-1 DOWNTO 0);
В моем коде я определил размер этого типа так, чтобы он вписывался в одну BRAM, и инструмент отображает его как таковой (после использования атрибута RAM_STYLE) .
Я хотел бы получить массив BRAM, каждый из которых может индексироваться в a для l oop. Вот что я попробовал:
TYPE MY_3D_ARR IS ARRAY (0 to NUM_BRAMS-1) of MY_2D_ARRAY
И я получаю к нему доступ следующим образом, за исключением, конечно, более полезного способа в моем реальном коде.
PROCESS(clk)
BEGIN
IF rising_edge(clk) THEN
IF wr_en = '1' THEN
FOR i IN 0 TO NUM_BRAMS-1 LOOP
my_3d_array(i)(wr_address) <= wr_data(i);
END LOOP;
END IF;
END IF;
END PROCESS;
PROCESS(clk)
BEGIN
IF rising_edge(clk) THEN
FOR i IN 0 TO NUM_BRAMS-1 LOOP
data_out(i) <= my_3d_array(i)(rd_address);
END LOOP;
END IF;
END PROCESS;
Это заканчивается отображением в LUT, к сожалению, даже после использования атрибута RAM_STYLE. Есть ли другой способ определения моих типов, чтобы они выводились как BRAM, но при этом могли индексировать их в for для l oop?
Я знаю, что всегда мог использовать примитив BRAM из Xilinx, но я хотел бы сохранить код переносимым.