VHDL: Можно ли определить общий тип с записями? - PullRequest
5 голосов
/ 15 июня 2011

Я пытаюсь определить сложный тип (т. Е. Тип, который состоит из вещественной и мнимой частей) и пытаюсь найти способ сделать его универсальным.

This my current static code:

  type complex_vector is record
    Re : signed(15 downto 0);
    Im : signed(15 downto 0);
  end record;

Теперь яИнтересно, есть ли способ сделать это универсальным, другими словами что-то вроде:

  type complex_vector (Generic: Integer := WIDTH) is record
    Re : signed(WIDTH downto 0);
    Im : signed(WIDTH downto 0);
  end record;

Я пытался найти решение для Google, а также просматривал свои книги, но я не могу найти никакого решения.Там действительно нет?Без записей можно записать что-то вроде этого:

type blaaa is array (NATURAL range <>) of STD_LOGIC;

Спасибо за любой ввод

РЕДАКТИРОВАТЬ:

Или я мог бы сделать что-то вроде следующего?

type complex_primitives is (re, im);
type complex_vector is array (re to im) of signed(natural range <>);

Хотя компилятор жалуется ..

Ответы [ 2 ]

7 голосов
/ 16 июня 2011

Ниже приведен допустимый синтаксис в VHDL-2008:

type complex is record
  re : signed ;  -- Note that this is unconstrained
  im : signed ;
end record ;

signal my_complex_signal : complex (re(7 downto 0), im(7 downto 0)) ;

ВАЖНОЕ ПРИМЕЧАНИЕ В этом примере используются записи с неограниченными массивами.Поддержка VHDL-2008 на данный момент является хитом и мисс.Некоторые инструменты поддерживают многие функции VHDL-2008, но многие еще не полностью поддерживают все новые функции.

Чтобы прочитать о VHDL-2008 и новых функциях, см. эту презентацию , которая являетсяхорошее резюме по этому вопросу.

5 голосов
/ 16 июня 2011

Пока не поддерживается VHDL-2008 (не задерживайте дыхание!), Существует неоптимальная выдумка ...

Создайте нужные записи разного размера в нескольких пакетах с одинаковыми именами, а затем при необходимости скомпилируйте их в пакет, определяющий ширину, которую вы хотите использовать.

-- complex_vector_16.vhd
package types is
  type complex_vector is record
    Re : signed(15 downto 0);
    Im : signed(15 downto 0);
  end record;
end;

-- complex_vector_32.vhd
package types is
  type complex_vector is record
    Re : signed(31 downto 0);
    Im : signed(31 downto 0);
  end record;
end;


library complex.types
use complex.types.complex_vector;

Серьезным ограничением этого метода является то, что вы можете поддерживать только одну форму complex_vector в дизайне, но, с другой стороны, вам не нужно беспокоиться о поддержке инструментов!

Было бы полезно подать запрос на поддержку / расширение для каждого поставщика в вашей цепочке инструментов относительно вашего варианта использования. Чем больше ошибок будет получено, тем скорее будет поддерживаться VHDL-2008.

...