
- •Аннотация
- •Содержание
- •Введение
- •1. Уровни описания электронной аппаратуры
- •2. Обзор HDL
- •2.1. История развития HDL
- •2.2. Варианты использования HDL
- •2.3. Преимущества HDL
- •3. Общие положения
- •3.1. HDL с точки зрения схемотехника
- •3.2. HDL с точки зрения программиста
- •4. Основы языка VHDL
- •4.1. Структура проекта
- •4.2. Сущности и архитектурные тела
- •4.3. Типы данных
- •4.3.1. Предопределённые типы данных
- •4.3.2. Скалярные типы, вводимые пользователем
- •4.3.3. Физические типы
- •4.3.4. Агрегатные типы
- •4.3.4.1. Массивы
- •4.3.4.2. Записи
- •4.3.5. Подтипы
- •4.4. Сигналы и переменные
- •4.5. Атрибуты
- •4.6. Процессы
- •4.7. Последовательные операторы
- •4.7.1. Операторы присваивания
- •4.7.2. Оператор условия и оператор выбора
- •4.7.3. Оператор ожидания
- •4.7.4. Операторы повторения
- •4.7.5. Операторы проверки
- •4.8. Параллельные операторы
- •4.8.1. Параллельное присваивание
- •4.8.2. Оператор блока
- •4.9. Разрешение сигналов и шины
- •4.10. Подпрограммы
- •4.11. Структурное представление проекта
- •4.12. Настройка и конфигурирование компонентов
- •4.13. Пакеты
- •Литература
- •Приложение 1. Алфавит моделирования

4.3. Типы данных
Язык VHDL основан на концепции строгой типизации данных, т.е. любой единице информации в программе обязательно присваивается имя, и для неё должен быть определён тип. Определение информационной единицы размещается в разделе деклараций программного модуля, в котором оно используется, или иерархически предшествующего модуля. Тип данных определяет набор значений объектов, отнесённых к этому типу, а также набор допустимых преобразований этих данных. Данные разных типов несовместимы в одном выражении.
Язык VHDL предоставляет некоторый базовый набор типов данных, которые не требуют объявления в программе пользователя. Кроме того, пользователь может определить свои типы данных и подключить существующие из библиотек. Различают скалярные типы данных и агрегатные типы. Объект, отнесённый к скалярному типу, рассматривается как законченная единица информации. Агрегат представляет упорядоченную совокупность скалярных единиц, объединённых единым именем. Классификация типов данных в VHDL представлена на рис. 4.1.
|
|
|
|
|
|
|
|
|
|
Типы данных |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Скалярные |
|
|
|
|
Указатели |
|
|
|
Агрегатные |
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Численные |
|
Перечислимые |
|
Физические |
|
Массивы |
|
Записи |
|
Файлы |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
character |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
integer |
|
|
bit |
|
|
|
|
|
|
|
string |
|
Предопределённые |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
time |
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
типы данных |
||||
|
real |
|
|
boolean |
|
|
|
|
|
bit_vector |
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
severity_level |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Типы данных, определяемые пользователем
Рис. 4.1. Классификация типов данных в VHDL Данные, используемые в программах, относятся к одной из категорий:
9константы;
9переменные;
9сигналы.
Различие между переменными и сигналами будет рассмотрено в разделе 4.4. Декларация объектов имеет следующий вид:
<декларация объекта> ::= <категория> <имя>{,<имя>}:<тип> [:=<выражение>];
<категория> ::= constant | variable | signal
14
Одна декларация может определить несколько объектов. Выражение в декларации должно совпадать по типу с декларируемым объектом и задаёт значения константы либо начальные значения сигналов и переменных.
4.3.1. Предопределённые типы данных
<предопределённые типы>::=
integer | real | bit | boolean | character | string | time | but_vector | severity_level | file_open_status | file_open_kind
Типы integer и real определяют численные данные — целые и действительные соответственно. Количество байт, отводимых для хранения чисел может зависеть от реализации, но стандартом считается 4 байта, что соответствует типам данных int и float для стандарта ANSI C. Для них определены следующие бинарные арифметические операции:
Таблица 4.1. Бинарные арифметические операции
Операция |
Пример |
||
|
|
||
Выражение |
Результат |
||
|
|||
|
|
|
|
Сложение |
5+6 |
11 |
|
|
|
|
|
Вычитание |
8-3 |
5 |
|
|
|
|
|
Умножение |
3*6 |
18 |
|
|
|
|
|
Деление (для целых) |
9/4 |
2 |
|
|
|
|
|
Деление (для вещественных) |
9/4 |
2.25 |
|
|
|
|
|
Деление по модулю (для целых) |
9 mod 4 |
1 |
|
-14 mod 5 |
1 |
||
|
|||
|
|
|
|
Остаток от деления (для целых) |
9 rem 4 |
1 |
|
-14 rem 5 |
-4 |
||
|
|||
|
|
|
|
Абсолютное значение (модуль) |
abs (-5) |
5 |
|
|
|
|
|
Возведение в степень |
2**4 |
16 |
|
|
|
|
Также определены унарные арифметические операции сохранения и смены знака. В арифметических выражениях предполагаются традиционные способы определения приоритетов операций, включая применение скобок. Поддерживаются также операторы отношения (сравнения): =, /=, <, <=, >, >=. Результатом сравнения является значение типа boolean.
Данные типа bit могут принимать значения из множества {'0', ' 1'}. Для данных типа BIT определены логические операции:
9not — инверсия;
9or — операция ИЛИ;
9nor — операция ИЛИ-НЕ;
9and — операция И;
9nand — операция И-НЕ;
15
9xor — неравнозначность;
9xnor — равнозначность.
Данные типа boolean также могут принимать два значения: {true, false}, и для них определены те же операции, что и над данными типа bit. Разница между типами bit и boolean состоит в том, что первые применяются для представления уровней логических сигналов в аппаратуре, а вторые для представления обобщенных условий, например результатов сравнения. Данные разных типов несовместимы.
Тип character объединяет символы, определенные в используемой операционной системе — буквы, цифры, специальные символы. VHDL'87 допускает применение только первых 128 символов кодов ASCII (латинские буквы, цифры, специальные символы). В тексте программы символьная константа записывается как стандартный символ, заключенный в одинарные кавычки. Отметим, что символы '0' и '1' имеют двойное — и как символ, и как логическое значение. В каждом конкретном случае тип данных определяется по контексту.
Тип time служит для задания задержек элементов и времени приостанова процессов при моделировании. Запись временной константы имеет вид:
<целое> <единица измерения времени>
Определены следующие единицы измерения времени:
9fs — фептосекунда;
9ps — пикосекунда;
9ns — наносекунда;
9us — микросекунда;
9ms — миллисекунда;
9s — секунда.
Над данными типа "время" определены операции отношения, сложения и вычитания, а также умножения и деления на целое.
Данные этого типа применяются для задания задержек элементов и длительности интервалов останова. Важную роль при моделировании имеет определенная на этом типе функция now, возвращающая значение текущего времени на момент ее вызова. Например, выражение
now> 1 us
примет значение true через 1 микросекунду модельного времени от начала моделирования и может обеспечить формирование последовательности входных воздействий или контрольных точек при моделировании.
Тип severity_level задает следующее множество значений: {note, warning, error, failure} и используется для управления работой компилятора или программы моделирования. С помощью переменных и констант этого типа в операторах assert определяются действия, которые следует выполнить при обнаружении некоторых условий. Фактическая трактовка действий в стандарте не оговорена и оставлена на усмотрение разработчиков системы моделирования.
16
Типы FILE_OPEN_STATUS и FILE_OPEN_KIND обеспечивают возможность контроля процедур обмена между программой моделирования и файловой системой инструментального компьютера.
Типы string и bit_vector относятся к агрегатным и фактически определены как неограниченный массив символов и массив битов соответственно. Более подробно правила работы с массивами и их элементами будут рассмотрены далее. В тексте программы строковая константа заключается в двойные кавычки.
4.3.2. Скалярные типы, вводимые пользователем
Пользователь имеет возможность определить собственные типы данных, используя декларацию типа данных:
<декларация типа данных>::= TYPE <имя типа> IS <определение типа>;
<определение типа>::= <определение перечислимого типа> |<определение целого типа>
|<определение действительного типа> |<определение физического типа> |<определение типа массивов> |<определение типа записей>
Начнём рассмотрение пользовательских типов данных со скалярных типов. Определение перечислимого типа имеет вид:
<Определение перечислимого типа>::= (перечислимое значение {,перечислимое значение});
<перечислимое значение>::= <идентификатор> | <символьная константа>
Например:
TYPE state IS (SO,SI,S2,S3);
может представлять, например, набор допустимых состояний системы, для каждого состояния определяются выполняемые действия и правила перехода в другое состояние.
Важнейшим приложением перечислимого типа данных являются расширенные алфавиты моделирования, в частности тип std_logic и соответствующий ему тип std_logic_vector, описанный в пакете std_logic_1164. Данный девятизначный алфавит моделирования рассмотрен в приложении 1 настоящего методического указания.
Определение численных типов пользователя целесообразно, во-первых, для контроля совместимости данных в программах, а во-вторых, для точного задания разрядности слов, представляющих данные в проектируемом объекте. В общем случае определение ограниченного типа подчиняется синтаксическому правилу:
<Определение ограниченного типа>::= [<базовый тип>] <диапазон>;
<диапазон>::=
range <ограничение><направление><ограничение> |range<>
<направление>::= downto | to
17