Передача Generics для записи типов портов - PullRequest
9 голосов
/ 28 октября 2011

Я недавно начал использовать записи для своих определений портов, особенно если я хочу сгруппировать сигналы, которые принадлежат определенному интерфейсу. Однако проблема, с которой я здесь сталкиваюсь, заключается в том, что я не могу передать, скажем, ширину std_logic_vector, сущности посредством универсального объекта. Итак, что я в основном хочу сделать, это следующее:

library ieee;
use ieee.std_logic_1164.all;
use work.math_pkg.all;

package fifo_pkg is

  type fifo_in_type is record
    data_in : std_logic_vector(DATA_WIDTH_??- 1 downto 0);
    rd      : std_logic;
    wr      : std_logic;
  end record;

  type fifo_out_type is record
    data_out : std_logic_vector(DATA_WIDTH_?? - 1 downto 0);
    empty    : std_logic;
    full     : std_logic;
  end record;

  component fifo is
    generic
      (
        MIN_DEPTH  : integer;
        DATA_WIDTH : integer
        );
    port
      (
        clk   : in  std_logic;
        res_n : in  std_logic;
        i     : in  fifo_in_type;
        o     : out fifo_out_type
        );
  end component fifo;

end fifo_pkg;   

Таким образом, идеальные решения были бы, когда я мог бы использовать тот же общий в моей записи, что и в сущности. (Так что DATA_WIDTH совпадает с DATA_WIDTH_ ??). Я знаю, что это должно как-то работать с vhdl 2008, однако мой Quartus II 11sp1 не поддерживает генерики в записях.

Есть ли элегантный способ добиться такого рода "общего прохождения", который можно синтезировать? Я знаю, что можно просто сохранить константу в пакете, но тогда я не могу использовать один и тот же пакет fifo для создания экземпляров нескольких fifo с различной шириной.

Спасибо за миллион, T

1 Ответ

9 голосов
/ 28 октября 2011

Можете ли вы использовать дженерики типов с Quartus?

Затем вы оставляете тип полностью неопределенным, чтобы вы могли создать FIFO integers или любой другой тип данных:

package fifo_pkg is
  generic (type element_type);

  type fifo_in_type is record
    data_in : element_type;
    rd      : std_logic;
    wr      : std_logic;
  end record;

  type fifo_out_type is record
    data_out : element_type;
    empty    : std_logic;
    full     : std_logic;
  end record;

  component fifo is
    generic
      (
        MIN_DEPTH  : integer;
        DATA_WIDTH : integer
        );
    port
      (
        clk   : in  std_logic;
        res_n : in  std_logic;
        i     : in  fifo_in_type;
        o     : out fifo_out_type
        );
  end component fifo;

end fifo_pkg;

Затем, когда вы хотите использовать его:

package wide_fifo_pkg is new fifo_pkg
   generic map (type => std_logic_vector(31 downto 0));

, а затем вы можете использовать fifo_in_type и fifo_out_type:

signal i : fifo_in_type;

Если у вас есть более одного FIFO в дизайнеКроме того, вы можете создать несколько версий пакета и использовать префикс пакета, чтобы получить правильный тип:

package narrow_fifo_pkg is new fifo_pkg
   generic map (type => std_logic_vector(3 downto 0));

signal i32 : wide_fifo_pkg.fifo_in_type;
signal i4  : narrow_fifo_pkg.fifo_in_type;

Другой вариант VHDL 2008: вы можете иметь неограниченный тип записи:

 type fifo_in_type is record
    data_in : std_logic_vector;
    rd      : std_logic;
    wr      : std_logic;
  end record;

, который вы можете затем создать subtype s для различных целей:

subtype fifo1_data_type is fifo_in_type(data_in(31 downto 0));
subtype fifo2_data_type is fifo_in_type(data_in(15 downto 0));

Не знаю, поддерживает ли Quartus какой-либо из этих параметров - сообщите нам!

...