
- •Типы vhdl-данных и их интерпретация
- •1 Объявление типов
- •2 Классификация скалярных типов данных
- •3 Целочисленные типы
- •4 Вещественные типы
- •5 Физические типы
- •6 Перечислимые типы
- •7 Подтипы
- •8 Атрибуты
- •9 Массивы
- •10 Многомерные массивы
- •11 Неограниченные массивы
- •12 Атрибуты
- •13 Операции
- •14 Преобразование типов
- •15 Агрегаты
- •16 Строковые литералы
- •17 Записи
- •18 Преобразование типов данных в процессе vhdl-синтеза
- •Перечислимый тип представляется набором шин:
Лекция 4
Типы vhdl-данных и их интерпретация
ПРИ RTL-СИНТЕЗЕ
1 Объявление типов
В языке VHDL любой тип должен быть объявлен перед использованием. Объявление содержит имя типа и секцию определения.
<объявление типа> ::=
type <идентификатор> is <определение типа>;
В качестве примера рассмотрим объявление типа, объекты которого это целые числа, лежащие в диапазоне от 0 до 255 включительно:
type byte is range 0 to 255;
Показанный тип относится к классу целочисленных типов, что влияет, во-первых, на способ его определения, во-вторых, на набор операций, применимых к объектам этого типа.
Следует отметить, что способы определения родственных типов схожи между собой. Например, для определения любого числового типа необходимо задание границ диапазона допустимых значений и порядка их следования.
В дальнейшем, при анализе конкретных типов будет рассматриваться только секция определения типа.
2 Классификация скалярных типов данных
В языке VHDL любой тип относится к определенному классу. В зависимости от того, к какому классу принадлежит тип, различаются синтаксис его определения и применимые к объектам этого типа операции. Скалярные типы разделяются на четыре класса:
целочисленные;
вещественные;
физические;
перечислимые.
Типы этих классов упорядочены, так как они определяются на основе упорядоченного множества значений. Поэтому к объектам этих типов применимы некоторые специфические операции, например, операции сравнения, которые будут рассмотрены отдельно при разборе булевого типа данных.
Целочисленные, вещественные и физические типы образуют группу числовых типов данных (рис. 1). С другой стороны, целочисленные и перечислимые типы образуют группу дискретных типов данных. Вещественные и физические типы не являются дискретными, так как они обеспечивают только аппроксимацию континуума значений на некоторое конечное множество значений (рис. 2). Типы, которые относятся к одной группе, схожи между собой. В дальнейшем будут рассмотрены конструкции языка VHDL, в которых специфицируется не использование конкретного класса, а использование определенной группы. В частности, речь идет о дискретных типах данных.
Рисунок 1 – Классификация скалярных типов данных (числовые типы)
Рисунок 2 – Классификация скалярных типов данных (дискретные типы)
Для каждого из показанных классов мы рассмотрим синтаксис определения типа, все применимые к его объектам операции и предоставляемые по умолчанию типы этого класса.
3 Целочисленные типы
Любой целочисленный тип языка VHDL определяется фиксированным диапазоном целых чисел, принадлежащему некоторому, предопределенному платформой, множеству.
Поэтому определение типа требует задания границ диапазона допустимых значений, то есть крайнего левого и крайнего правого значений, а также указания порядка следования значений в нём:
<определение целочисленного типа> ::=
range <простое выражение> [to | downto] <простое выражение>
Диапазон значений, которые могут принимать объекты типа, можно упорядочить по возрастанию или по убыванию. При упорядочении по возрастанию крайнее левое значение должно быть наименьшим в диапазоне, а крайнее правое – наибольшим. С другой стороны, при упорядочении диапазона значений по убыванию крайнее левое значение должно быть наибольшим, а крайнее правое – наименьшим.
Для задания упорядочения используются соответствующие ключевые слова: to – для упорядочения по возрастанию и downto – для упорядочения по убыванию. Следует отметить, что в случае нарушения правил для задания границ диапазона будет создан, так называемый, пустой диапазон (null range), который не содержит ни одного значения:
type null_range is range 127 to 0;
Границы диапазона могут быть заданы посредством простых выражений. Однако на такие выражения накладывается важное ограничение – они должны вычисляться статически и на основе данных доступных в точке их вычисления.
По умолчанию, язык VHDL предоставляет единственный целочисленный тип – целое. Диапазон значений этого типа зависит от ограничений конкретной платформы, но, согласно стандарту языка VHDL, он не может быть уже, чем от -2 147 483 647 до 2 147 483 647:
type integer is range -2147483647 to 2147483647;
При объявлении целочисленных типов предпочтительно считать границы показанного диапазона максимально допустимыми.
К объектам, которые принадлежат целочисленным типам данных, можно применять ряд арифметических операций. Это унарные операции:
тождественность (+A);
отрицание (-A);
взятие модуля (abs A).
А также бинарные операции:
сложение (A + B);
вычитание (A - B);
умножение (A * B);
деление (A / B);
деление по модулю (A mod B);
взятие остатка от деления (A rem B);
возведение в степень (A ** B).
Для всех перечисленных бинарных операций, кроме операции возведения в степень, оба операнда должны иметь один и тот же тип. Для операции возведения в степень второй или правый операнд должен быть целым неотрицательным числом.
При выполнении арифметических операций внимание нужно обращать, в частности, на правила формирования знака результата. Например, при взятии остатка от деления знак результата всегда совпадает со знаком первого или левого операнда, а в случае деления по модулю знак результата всегда совпадает со знаком второго операнда.