
- •Типы vhdl-данных и их интерпретация
- •1 Объявление типов
- •2 Классификация скалярных типов данных
- •3 Целочисленные типы
- •4 Вещественные типы
- •5 Физические типы
- •6 Перечислимые типы
- •7 Подтипы
- •8 Атрибуты
- •9 Массивы
- •10 Многомерные массивы
- •11 Неограниченные массивы
- •12 Атрибуты
- •13 Операции
- •14 Преобразование типов
- •15 Агрегаты
- •16 Строковые литералы
- •17 Записи
- •18 Преобразование типов данных в процессе vhdl-синтеза
- •Перечислимый тип представляется набором шин:
8 Атрибуты
Любой скалярный тип обладает рядом атрибутов. В первую очередь это следующий набор атрибутов:
крайнее левое значение диапазона – 'left;
крайнее правое значение диапазона – 'right;
наименьшее значение диапазона – 'low;
наибольшее значение диапазона – 'high;
упорядоченность диапазона по возрастанию – 'ascending;
литерал, соответствующий значению – 'image (x);
значение, соответствующее литералу – 'value (s).
Использование атрибута 'image (x) позволяет получить корректно сформированный литерал, а использование атрибута 'value (s) –сформировать значение соответствующее корректному литералу. Основное применение этих двух атрибутов – ввод и вывод данных.
Все скалярные типы, кроме вещественных, обладают несколькими дополнительными атрибутами:
позиция значения в диапазоне типа – 'pos (x);
значение в диапазоне типа в позиции – 'val (n);
значение, следующее за заданным – 'succ (x);
значение, предшествующее заданному – 'pred (x);
значение, находящееся слева от заданного – 'leftof (x);
значение, находящееся справа от заданного – 'rightof (x);
Например, для типов упорядоченных по возрастанию значение, расположенное справа от некоего значения это следующее за ним значение. С другой стороны, для типов, которые упорядочены по убыванию, следующим является значение находящееся слева от заданного.
Последним является атрибут 'base, но он может применяться только к подтипам для получения исходного для них типа. К полученному типу можно применять все допустимые для него атрибуты.
9 Массивы
В языке VHDL массив представляет собой упорядоченный набор объектов, которые принадлежат одному типу. Каждый элемент массива располагается в определенной позиции, которая определяется объектом скалярного типа данных, называемого индексом.
Перед созданием объекта массива необходимо предварительно выполнить объявление типа для него, согласно следующему правилу:
<определение типа массива> ::=
array (<дискретный диапазон> {, <дискретный диапазон>}*)
of <определение подтипа>
Это правило позволяет определить тип массива, путем задания одного или нескольких диапазонов индексов и подтипа для его элементов. Правила для определения подтипа и для задания дискретного диапазона были рассмотрены в предыдущих лекциях.
Допустим, необходимо
описать устройство, которое обеспечивает
расчет факториала значений, лежащих в
диапазоне
.
Так как диапазон входных значений
известен заранее, можно использовать
метод выборки значения из таблицы поиска
(lookup
table):
package types is
subtype fast_factorial_arg is natural range 0 to 10;
end package types;
use work.types.all;
entity fast_factorial is
port (
data_in : in fast_factorial_arg;
data_out : out integer
);
end entity fast_factorial;
architecture behavioral of fast_factorial is
type factorials_lookup_table is
array (fast_factorial_arg) of integer;
constant factorials : factorials_lookup_table :=
(1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800);
begin
lookup : data_out <= factorials (data_in);
end architecture behavioral;
В показанном примере для задания диапазона индексов использовалось имя подтипа, так как создаваемый массив должен содержать элементы, которые соответствуют каждому из значений этого подтипа.
Для доступа к некоторому элементу массива необходимо задать имя массива и индекс необходимого элемента в круглых скобках. Кроме того, можно обращаться к части массива, называемой срезом (array slice), посредством задания диапазона индексов. Также, можно использовать объект массива как единое целое, например, для присвоения значения одного массива другому.