Синтез 3D RAM в качестве массива BRAM в VHDL - PullRequest
0 голосов
/ 05 февраля 2020

В прошлом я писал код, который 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, но я хотел бы сохранить код переносимым.

...