Составные (композитные) типы: массивы и записи в VHDL


Массивы
Массив в VHDL представлен набором элементов одного типа, способ представления массива и способ выбора элемента массива определяется его размерностью. Любому элементу массива может быть присвоено значение, он может использоваться в выражениях и связываться с портом компонента; кроме того, существует возможность выборки секции массива при использовании диапазона вместо индекса.

Объявление
Существует возможность объявлять как ограниченные (диапазон измерений задается при объявлении), так и неограниченные массивы. В объявлении типа массива задается число индексов, тип и позиция каждого индекса, ограничение диапазона измерений и тип элементов массива:

type bit_vector is array (natural range <>) of bit;
type string is array (positive range <>) of character;
type matrix is array (integer range <>, integer range <>) of real;
type bit_box is array (bit, bit) of bit;
subtype transform is matrix (1 to 4, 1 to 4);

Выражение range <> означает, что определение границ индекса было отложено, кроме того, размерность массива можно задавать явным диапазоном либо диапазоном значений типа. Границы для неограниченного массива подставляются в момент, когда создается объект данного типа:

variable det: matrix (1 to 3, 1 to 3);
signal accum: bit_vector (31 downto 0);
constant ic_name: string:=»KT1533LA3″;
variable conv: bit_vector(bit);

Индексные позиции в объявлении объекта типа массив, который использует неограниченный тип, должны быть ограничены. Диапазон может быть ограничен явным указанием границ, начальным значением или перечислимым типом. Некоторые типы массивов предопределены: string, bit_string.

Конструирование
Для конструирования значений объектов массивных типов используются строки, битовые строки и агрегаты (набор значений). Они могут использоваться в любом месте, где допускается значение типа массив, например, как начальное значение константы или операнд в выражении. При использовании агрегатов для конструирования массива возможна их запись в позиционной, поименованной или комбинированных формах. Примеры конструирования массива:

type bit4_array is array (natural range <>) of bit4;
type orient_array is array (Orient) of integer;

signal data: bit4_array (0 to 8);
— конструирование

—битовая строка;
constant reset: bit_vector := X"FF"

— агрегат, позиционная форма;
constant clear: bit_vector := (‘0’, ‘0’, ‘1’, ‘0’, ‘1’, ‘0’, ‘1’, ‘0’);

— агрегат, поименованная форма;
constant pos: orient_array := (west => 1, east => 2, others => 0);

— строка;
data <= "0011ZZ11";

Операции над массивами
Для массивов определены операции выбора элемента путем задания индексной позиции, операторы равенства и неравенства, для одномерных массивов определяются две дополнительных операции: вырезка (slicing) и конкатенация (&), а также операции сравнения, если элементы массивов целого или перечислимых типов. Массивы должны быть необязательно одинаковой длины, при совпадении всех элементов меньшего по длине массива длинный массив считается большим. Если элементы массива типа BIT или boolean (или тесно связные с ними) и длины массивов равны, то для них определены логические операции:

variable AL: bit_vector := "01010011";
variable AH: bit_vector := "10110110";
AL(1) := ‘0’ — выбор элемента при помощи индекса;
AH (1 to 3) := "101"; — присваивание слайса;
AL (6 to 7) := AH (3 to 4);
AH := "101" & ‘0’ & ‘1’ & "111"; — конкатенация;
… AL <= AH ... -- сравнение (результат - boolean); AL: = AL xor AH; - логическая операция;

Допускается преобразование типов между двумя массивами, если:
1) массивные типы имеют одинаковое число измерений;
2) элементы имеют одинаковые типы и либо индексы целого типа, либо индексы одинакового перечислимого типа.
Типы таких массивов называются тесно связанными (closely related).

Записи
Запись (record) — способ группировки объектов, принадлежащих одному классу (константы, переменные или сигналы), но, возможно, имеющих различные типы. Доступ к объекту в записи осуществляется при помощи оператора выбора (.). Пример объявления записи и инициализации объекта:

type rect is
record
left, top, right, bottom: integer;
end record;
type ic_id is
record
name: string (1 to 20);
num: natural;
pos: rect;
end record;

variable current_rect, next_rect: rect;
constant first_id: ic_id := (name => «mux», num => 39427, pos => (0, 0, 100, 100)); — конструирование агрегатом;

current_rect.left := 10; — доступ к объекту в записи

Конструирование записи производится именованным агрегатом.


Комментарии запрещены.




Статистика