Скалярные типы данных в VHDL
Скалярные типы — это базовое множество предопределенных типов, из которых конструируются все остальные типы в VHDL. Всего определено четыре вида скалярных типов: целый, с плавающей точкой, перечисление (enumertaion) и физический тип. Также есть возможность задавать подтипы скалярных типов.
Целый тип (integer)
Объекты целого типа используются для представления абстрактных числовых значений, диапазон представления ограничен разрядностью платформы. Существует возможность задания диапазона при помощи добавочных целых типов. Для формирования значения целых типов используются целые литералы. Примеры объявления целых типов и объектов:
type Bus_width is range 0 to 64;
type Bus_width is range 63 downto 0;
— объявление переменных и сигналов данных типов
variable address_range: Bus_width:=32;
signal current_slot: Bus_index;
Для целых типов предопределены все обычные арифметические операторы и операторы отношения, при этом оба аргумента оператора должны быть одного типа. Для обеспечения сравнения объектов разного типа в VHDL определены преобразования для тесно связных типов. Все целые типы и типы с плавающей точкой являются тесно связанными типами, и их можно сравнивать при помощи явного преобразования:
if Bus_index (address_range) > current_slot …
При преобразовании между типом с плавающей точкой и целым типом выполняется округление до ближайшего целого.
Тип с плавающей точкой (real)
Объекты типа с плавающей точкой используются для представления абстрактных числовых значений, тип геа1 предопределен и включает вещественные числа. Добавочные типы с плавающей точкой могут быть объявлены явно заданием диапазона значений, допустимых для объектов данного типа. Для формирования значения типа с плавающей точкой используются действительные литералы. Примеры добавочных типов с плавающей точкой и формирования значений приведены ниже:
type Speed is range 0.0 to 100.0;
constant low_speed: Speed := 5.0;
variable current_speed: Speed;
Для типов с плавающей точкой действуют аналогичные целым типам правила преобразования при выполнении арифметических операций и операций отношения.
Перечислимый тип (enumeration)
Перечисление определяется множеством возможных значений объектов данного типа. Значения перечислимых типов упорядочены и отношение упорядочения определяется последовательностью их появления в списке объявления типа. Примеры объявления перечислимых типов и объектов:
type Oruent is (North, South, West, East);
type bit4 is (‘U’, ‘0’, ‘1’, ‘Z’);
signal synch, ready: bit4;
variable direction: Orient;
variable test result:probability;
signal proceed:boolean; — предопределенный перечислимый тип
Существует несколько предопределенных перечислимых типов: boolean, bit, character и т.д.
Подтипы скалярных типов
Для ограничения диапазона принимаемых скалярным объектом значений используется объявление подтипа. Объявление подтипа определяет базовый тип (base type) и ограничение диапазона (range constraint); базовый тип и ограничение диапазона могут быть включены прямо в объявление объекта:
subtype SW_orient is Orient range South to West;
signal unit_orient: SW_orient;
signal unit_orient1: Orient range South to West;
В ходе моделирования проверяется соответствие назначаемого значения заданному диапазону, и в случае нарушения моделирование останавливается и выдается сообщение, описывающее это нарушение.
Операторы определяются для типов, а не для подтипов, поэтому объекты с общим базовым типом могут использоваться в одном выражении.
Предопределенные атрибуты скалярных типов
Характеристики скалярных типов и подтипов могут быть определены в программе при помощи атрибутов. Для скалярного типа Т доступны следующие атрибуты:
• T’low — возвращает наименьшее значение объекта данного типа;
• T’high — возвращает наибольшее значение объекта данного типа;
• T’left — возвращает левую границу значений объекта данного типа;
• T’right — возвращает правую границу значений объекта данного типа;
Примеры значений атрибутов для типа:
type Bus_index is range 63 downto 0;
Bus_index’low = 0
Bus_index’high = 63
Bus_index’left = 63
Bus_index’right = 0
Целый, перечислимый и физический типы имеют позиционный номер (0-based), связанный с каждым значением типа. Для определения соответствия элемента типа и его позиции, а также для итерирования позиции определены следующие атрибуты:
• T’pos(value) — возвращает позицию указанного элемента;
• T’val(position) — возвращает элемент, находящийся в заданной позиции;
• T’pred(value) — возвращает предыдущий указанному элемент (без учета направления диапазона);
• T’succ(value) — возвращает следующий за указанным элемент (без учета направления диапазона);
• T’leftof(value) — возвращает элемент слева от указанного;
• T’rightof(position) — возвращает элемент справа от указанного.