VHDL (VHSIC Hardware Description Language)

{{Infobox programming language�

| name                  = VHSIC Hardware Description Language
| paradigm             = Язык описания аппаратуры
|year                   = 1983
|designer               = Министерство обороны США
| file_ext              = .vhd
|typing                 = строгая
|operating system       = Windows, OS X, Linux
|influenced_by          = Ada, Pascal

| website = http://accellera.org/ }}

VHDL (англ. VHSIC (Very high speed integrated circuits) Hardware Description Language) — язык описания аппаратуры интегральных схем. Язык проектирования VHDL является базовым языком при разработке аппаратуры современных вычислительных систем.

История

Был разработан в 1983 г. по заказу Министерства обороны США с целью формального описания логических схем для всех этапов разработки электронных систем, начиная модулями микросхем и заканчивая крупными вычислительными системами.

Первоначально язык предназначался для моделирования, но позднее из него было выделено синтезируемое подмножество. Написание модели на синтезируемом подмножестве позволяет автоматический синтез схемы функционально эквивалентной исходной модели. Средствами языка VHDL возможно проектирование на различных уровнях абстракции (поведенческом или алгоритмическом, регистровых передач, структурном), в соответствии с техническим заданием и предпочтениями разработчика. Заложена возможность иерархического проектирования, максимально реализующая себя в экстремально больших проектах с участием большой группы разработчиков. Представляется возможным выделить следующие три составные части языка: алгоритмическую — основанную на языках Ada и Pascal и придающую языку VHDL свойства языков программирования; проблемно ориентированную — в сущности и обращающую VHDL в язык описания аппаратуры; и объектно-ориентированную, интенсивно развиваемую в последнее время.

Стандартами 1987, 1991, 1993, 1996, 1997, 1999, 2000, 2002 и 2008 гг. закреплены многие его усовершенствования, так например начиная со стандарта VHDL-2000, язык приобретает основы объектно-ориентированной парадигмы. Стандарт VHDL-93 является последним, полностью поддерживаемым средствами САПР стандартом[источник не указан 2040 дней].

VHDL создан как средство описания цифровых систем, однако существует подмножество языка — VHDL AMS (Analog Mixed Signal), позволяющее описывать как чисто аналоговые, так и смешанные, цифро-аналоговые схемы.

Первичная абстракция языка VHDL

VHDL является формальной записью, предназначенной для описания цифровой системы. Функция системы определяется как преобразование значений на входах в значения на выходах. Организация системы задается перечнем связанных компонентов.

Объект проекта

Объект проекта entity представляет собой описание компонента проекта, имеющего четко заданные входы и выходы и выполняющей четко определенную функцию. Объект проекта может представлять всю проектируемую систему, некоторую подсистему, устройство, узел, стойку, плату, кристалл, макроячейку, логический элемент и т.п.

Иерархия проекта

В описании объекта проекта можно использовать компоненты, которые, в свою очередь, могут быть описаны как самостоятельные объекты проекта более низкого уровня. Совокупность этих связанных объектов проекта называется иерархией проекта design_hierarchy.

Типы описаний

Каждый объект проекта состоит, как минимум, из двух различных типов описаний: описания интерфейса и одного или более архитектурных тел.

При описании цифровой системы на языке VHDL, пользователь может использовать пять различных типов описаний:

  • Интерфейс описывается в объявлении объекта проекта entity_declaration и определяет только входы и выходы объекта проекта.
  • Для описания поведения объекта или его структуры служит архитектурное тело architecture_body.
  • Чтобы задать, какие объекты проекта использованы для создания полного проекта, используется объявление конфигурации configuration_declaration.
  • В языке VHDL предусмотрен механизм пакетов для часто используемых описаний, констант, типов, сигналов. Эти описания помещаются в объявлении пакета package_declaration.
  • Если пользователь использует нестандартные операции или функции, их интерфейсы описываются в объявлении пакета, а тела содержатся в теле пакета package_body.

Модуль проекта

Каждое из описаний является самостоятельной конструкцией языка VHDL, может быть независимо проанализировано анализатором и поэтому получило название Модуль проекта design_unit. Модули проекта, в свою очередь, можно разбить на две категории:

  • первичные (различного типа объявления)
  • вторичные (отдельно анализируемые тела первичных модулей)

Один или несколько модулей проекта могут быть помещены в один файл, называемый файлом проекта design_file.

Каждый проанализированный модуль проекта помещается в библиотеку проекта design_library и становится библиотечным модулем library_unit. Данная реализация позволяет создать любое число библиотек проекта. Каждая библиотека проекта в языке VHDL имеет логическое имя (идентификатор). Фактическое имя файла, содержащего эту библиотеку, может совпадать или не совпадать с логическим именем библиотеки проекта. Для ассоциации логического имени библиотеки с соответствующим ей фактическим именем предусмотрен специальный механизм установки внешних ссылок.

По отношению к сеансу работы VHDL существует два класса библиотек проекта: рабочие библиотеки и библиотеки ресурсов. Рабочая библиотека - это библиотека, с которой в данном сеансе работает пользователь и в которую помещается библиотечный модуль, полученный в результате анализа модуля проекта.

Библиотека ресурсов - это библиотека, содержащая библиотечные модули, ссылка на которые имеется в анализируемом модуле проекта.

В каждый конкретный момент пользователь работает с одной рабочей библиотекой и произвольным числом библиотек ресурсов.

Возможность создания и использования многих библиотек ресурсов позволяет пользователю классифицировать библиотечные модули по различным признакам. Например, в одной библиотеке хранить описания микросхем одной серии, в другой - описания микросхем другой серии и т.д. Или в одной библиотеке хранить описания микросхем с одним типом задержки, в другой - описания микросхем с другим типом задержки и т.д.

Лексические элементы

Любой машинный язык характеризуется определенным множеством разрешенных лексических элементов. Текст описания на языке VHDL состоит из одного или более файлов проекта. Файл проекта представляет собой последовательность лексических элементов, каждый из которых составлен из символов строго определенного набора символов. Текст каждого модуля проекта является последовательностью отдельных лексических элементов.

Ограничитель

Ограничителем может быть один из следующих символов (входящих в базовый набор): & ' ( ) * + , - . / : < = > |

Ограничителем может быть также один из составных ограничителей, составленный из стоящих рядом специальных символов:

ог. имя
=> стрелка
** двойная звезда, возведение в степень
:= присваивание переменной
/= не равно
>= больше или равно
<= меньше или равно, а также назначение сигнала
<> блок

Идентификатор

Идентификаторы используются в качестве имен, а также в качестве зарезервированных слов. Идентификаторы могут содержать латинские буквы в верхнем и нижнем регистре, цифры и символ подчеркивания. Заглавные и строчные буквы в идентификаторах считаются равнозначными. Так как пробел является разделителем, то использование его недопустимо внутри идентификатора. Пример: COUNT X C_OUT FFT Decoder VHSIC X1 PageCount STORE_NEXT_ITEM

Комментарии

Комментарий начинается с двух рядом стоящих символов дефиса и ограничен концом строки. Комментарий может появиться в любой строке VHDL-описания. Наличие или отсутствие комментариев не оказывает влияние на правильность описания. Более того, комментарии не оказывают влияния на выполнение модуля моделирования; единственным назначением комментариев является повышение читабельности описания. Горизонтальная табуляция может быть использована в комментарии после двойного символа дефиса и это эквивалентно одному или более пробелов.

Литералы

ВИД ОПИСАНИЕ ПРИМЕРЫ
Десятичный абстрактный литерал Абстрактный литерал, выраженный в десятичной системе счисления. Символ подчеркивания, стоящий между двумя соседними цифрами, не оказывает влияния на значение литерала. Буква Е в выражении экспоненты (если используется) может быть написана в любой регистре. Выражение экспоненты в целом литерале не должно содержать знак минус. В абстрактных литералах допускаются незначащие нули. Так как пробел является разделителем, то он не разрешен в абстрактных литералах, даже между составными частями экспоненты. Значение 0 экспоненты разрешено только в целых литералах. 11, 1Е6, 0, 123_456, 3.141_592, 11.0, 0.331, 6.023Е+24, 2.64Е-12, 1.0E+6
Базированный абстрактный литерал Абстрактный литерал, выраженный в форме, которая явно содержит базу счисления (от 2 до 16). Символ подчеркивания, стоящий между двумя соседними цифрами, не влияет на значение литерала. База счисления (base) и экспонента должны быть выражены десятичным числом. Буква в базированном литерале (будь то буква Е в экспоненте или расширенная цифра) может писаться в любом регистре. Экспонента обозначает степень базы, на которую умножается значение базированного литерала, взятого без выражения экспоненты, для получения значения этого литерала с экспонентой. Выражение экспоненты в целом литерале не должно содержать знак минус. 2#1111_1111#, 16#FF# 016#0FF#, 16#F.FF#E+2, 2#1.1111_1111_111#E11
Символьный литерал Формируется включением одного из 95 графических символов (включая символ пробела) между двумя символами апострофа. Символьный литерал содержит значение символьного типа. 'А', '*', , ' '
Строковый литерал Формируются из последовательности графических символов (возможно и пустой), заключенной между двумя символами кавычки, используемых как строковые скобки. Строковый литерал имеет значение, представляющее собой последовательность символьных значений, соответствующих графическим символам этого строкового литерала, исключая сами кавычки. Если необходимо включить символ кавычки в состав строкового литерала, то этот символ надо повторить подряд два раза на соответствующем месте. Длина строкового литерала равна количеству символьных значений в представленной последовательности. (Каждый удвоенный символ кавычки считывается как один символ). Строковый литерал должен писаться на одной строчке, т.к. он является лексическим элементом. "Setup time is too short", "", " ", "A", """"
Битово-строковый литерал Битово-строковые литералы bit-string literal формируются из последовательности расширенных цифр, заключаемой между двумя символами кавычки, используемых как скобки строки битов, и которой предшествует спецификатор базы base specifier. Спецификатор базы может принимать значения В, О, Х. Если спецификатором базы счисления является В, то в качестве расширенных цифр могут выступать только цифры 0 и 1; если O, то цифры от 0 до 7; и если Х, то цифры от 0 до 9 и от А до F. Символ подчеркивания, стоящий между двумя соседними цифрами в битово-строковом литерале, не влияет на значение этого литерала. Буквой, используемой в качестве расширенной цифры, могут быть буквы от А до F, представляющие, соответственно, цифры от 10 до 15. Буква в битово-строковом литерале (расширенная цифра или спецификатор базы) может писаться как в заглавной, так и в строчной форме - значение литерала от этого не меняется.

Битово-строковый литерал имеет значение, представляющее собой последовательность значений предопределенного типа BIT (т.е. последовательность из '0' и '1'). Если указатель базы счисления есть В, то значение битово-строкового литерала есть сам литерал. Если указатель базы есть O (или Х), то значением литерала является последовательность, полученная замещением каждой расширенной цифры последовательностью из трех (или соответственно четырех) значений предопределенного типа BIT. Длина битово-строкового литерала равна числу значений типа BIT в представленной последовательности.

X"FFF", 0"777", X"777"

Разделители

Между любыми двумя соседними лексическими элементами разрешено ставить один или более разделителей, а также перед первым лексическим элементом или после последнего лексического элемента в каждом модуле проекта. По крайней мере, один разделитель необходим между идентификатором или абстрактным литералом и соседним идентификатором, или абстрактным литералом.

Разделителем может быть либо символ пробела, либо символ управления форматом, либо конец строки. Символ пробела не является разделителем внутри комментария, строкового литерала или символьного литерала, включающего этот символ.

Зарезервированные слова

Идентификаторы, перечисленные ниже, называются зарезервированными словами, они зарезервированы в языке для специального назначения.

Зарезервированные слова
ABS

ACCESS AFTER ALIAS ALL AND ARCHITECTURE ARRAY ASSERT ATTRIBUTE BEGIN BLOCK BODY BUFFER BUS CASE COMPONENT CONFIGURATION CONSTANT DISCONNECT DOWNTO

ELSE

ELSEIF END ENTITY EXIT FILE FOR FUNCTION GENERATE GENERIC GUARDED IF IMPORT IN INITIALIZE INOUT IS LABEL LIBRARY LINKAGE LOOP MAP

MOD

NAND NEW NEXT NOR NOT NULL OF ON OPEN OR OTHERS OUT PACKAGE PORT PROCEDURE PROCESS RANGE RECORD REGISTER REM REPORT

RETURN

SELECT SEVERITY SIGNAL SUBTYPE THEN TO TRANSPORT TYPE UNITS UNTIL USE VARIABLE WAIT WHEN WHILE WITH XOR

Зарезервированное слово не должно использоваться как объявленный идентификатор. Зарезервированные слова, различающиеся только в использовании соответствующих заглавных и строчных букв, рассматриваются как идентичные. 1.2.7. Допустимые замены символов Для базовых символов "вертикальная черта", "диез", "кавычка" разрешены следующие замены: 1) вертикальная черта (|) может быть заменена восклицательным знаком (!) при использовании в качестве ограничителя; 2) диез (#) в базированном литерале может быть заменен двоеточием (:), при этом заменить надо оба знака в этом литерале; 3) кавычки ("), используемые как ограничители в строковом литерале с обеих сторон, могут быть заменены на проценты (%). При этом необходимо заменить обе строковые скобки, а из последовательности символов исключить все символы кавычки. Каждый символ процента внутри последовательности символов должен быть удвоен. Удвоенный символ процента интерпретируется в этом случае как один символ. Такие замены не изменяют смысл описания. Правила использования идентификаторов и абстрактных литералов таковы, что строчные и заглавные буквы могут быть использованы без различия. Эти лексические элементы, таким образом, могут быть написаны с использованием только базового набора символов.

Модели данных в VHDL

Модели данных позволяют создавать различные типы и объекты данных на основе базовых предопределенных типов. Любой объект данных характеризуется определенным классом и типом. Объекты данных (data_object) являются хранилищами для значений определенного типа. Все типы в VHDL конструируются из элементов, представляющих собой скалярные типы.

Скалярные типы

Скалярные (scalar) типы - это элементы, из которых конструируются все типы в VHDL. Базовое множество скалярных типов является предопределенным. По мере необходимости разработчик может создать дополнительные скалярные типы. В VHDL имеется четыре вида скалярных типов: целый тип, тип с плавающей точкой, перечислительный тип (enumeration) и физический тип. Разработчик имеет возможность задавать подтипы скалярных типов.

Целый тип

Объекты целого типа используются для представления абстрактных числовых значений. Тип integer является предопределенным. Он охватывает все целые числа, ограниченные разрядностью слова компьютера.

Добавочные целые типы могут быть объявлены явно заданием диапазона значений, допустимых для объектов данного типа. Рассмотрим несколько примеров объявлений целых типов.

type Apples is range 0 to 75;
type Oranges is range 0 to 75;
type Word_index is range 31 downto 0;

Рассмотрим, как объявляются объекты, использующие эти типы.

variable Macintosh: Apples;
variable Seville,Valencia,av_oranges:Oranges := 10;
signal   control_selector:Word_Index;

Константе должно быть присвоено значение в момент объявления. Аналогично начальное значение может быть присвоено переменной.

Все обычные арифметические операторы и операторы отношения являются предопределенными для целого типа. Тем не менее, оба аргумента оператора должны быть одного типа.

Нельзя сравнивать объекты разных типов.

Тем не менее, все целые типы и типы с плавающей точкой являются тесно связанными типами closely related types и VHDL обеспечивает для этих типов преобразование conversion между любыми парами. Значение выражения одного типа преобразуется к значению тесно связанного типа указанием перед выражением, заключенным в скобках, имени типа, к которому преобразуется выражение. При преобразовании между типом с плавающей точкой и целым типом будет выполняться округление до ближайшего целого.

Тип с плавающей точкой

Объекты типа с плавающей точкой используются для представления абстрактных числовых значений. Тип real является предопределенным. Он включает вещественные числа. Добавочные типы с плавающей точкой могут быть объявлены явно заданием диапазона значений, допустимых для объектов данного типа. Рассмотрим пример объявлений типа с плавающей точкой.

type Probability is range 0.0 to 1.0;

Диапазоны задаются либо убывающей, либо возрастающей последовательностью значений. Границы диапазона могут быть произвольными выражениями. Рассмотрим, как объявляются объекты, использующие эти типы.

constant alpha_level: Probability:=0.75;
variable beta_level:  Probability;

Константе должно быть присвоено значение в момент объявления. Аналогично начальное значение может быть присвоено переменной. Литералы с плавающей точкой представляют значения любого типа с плавающей точкой и всегда содержат десятичную точку или отрицательную экспоненту: например, 3.14159, -23.0, 1E-2. Запись с экспонентой может быть использована для любого вида числовых литералов: 9Е − целое, а 0.324Е-3 − с плавающей точкой. Для формирования выражения может быть использована комбинация имен объектов, литералов и операторов. Все обычные арифметические операторы и операторы отношения являются предопределенными для типа с плавающей точкой. Тем не менее, оба аргумента оператора должны быть одного типа. Предопределенный оператор ">" не работает с операндами различных типов, даже если они имеют одинаковый диапазон. Все целые типы и типы с плавающей точкой являются тесно связанными типами closely related types и VHDL обеспечивает для этих типов преобразование conversion между любыми парами.

Перечислительные типы

Тип состоит из множества возможных значений, которые могут принимать объекты этого типа, вместе с множеством операций над типом. В объявлении перечислительного типа явно перечисляются идентификаторы и графические символы, которые означают значения типа. Идентификаторы и символы являются литералами для типа точно так же, как 3 и 245 являются литералами целого типа. Значения упорядочены и отношение упорядочения определяется последовательностью их появления в списке. Рассмотрим несколько примеров:

type severity is(OKAY,NOTE,WARNING,ERROR,FAILURE);
type color is(red,orange,yellow,green,blue,indigo,violet);
type bit6 is('U','0','1','F','R','X');
type fuzzy_logic is('0', may be,'1');

Нет необходимости писать объявления для следующих перечислительных типов, поскольку они являются предопределенными:

type character is (NUL,...,'A','B','C',...DEL);
type boolean is (False,True);
type bit is ('0','1');

Тип character включает символы для всех печатаемых и непечатаемых элементов кода ASCII, а также для их графических представлений. Логические операторы and, or, nand, nor и xor определяются для операндов типа bit или типа boolean и дают результат того же самого типа, что и операнды (но нельзя задать один операнд типа boolean, а другой типа bit). Операторы отношения "=", ">", ">=" и другие дают результат типа boolean независимо от того, какие типы операндов.

Не нужно путать два значения символа "<=". Этот символ используется как при назначении сигналу значения некоторого выражения, так и представляет отношение "меньше или равно".

Подтипы скалярных типов

Если желательно, чтобы скалярный объект принимал значения некоторого типа из ограниченного диапазона, то это может быть отражено в тексте проекта при помощи объявления и использования подтипа. Предположим, к примеру, что разработчик желает создать сигнал А типа severity и что А может принимать только значения OKAY, NOTE и WARNING.

type severity is (OKAY,NOTE,WARNING,ERROR,FAILURE);
subtype go_status is severity range OKAY to WARNING;
signal A: go_status;

Объявление подтипа определяет базовый тип base type и ограничение диапазона range constraint. Любое значение, назначенное А, должно быть типа severity, который является базовым типом для А. Программа моделирования будет проверять, попадает ли значение в диапазон от OKAY до WARNING, в момент выполнения назначения. Если это не выполняется, то моделирование будет остановлено и будет выдано сообщение, описывающее это нарушение. Базовый тип и ограничение диапазона могут быть включены прямо в объявление объекта, если имеется немного объектов, которые должны быть объявлены с некоторым подтипом. Рассмотрим объявление, эквивалентное объявлениям подтипа и сигнала, приведенным выше:

signal A: severity range OKAY to WARNING;

Выбор из двух методов для определения подтипов объектов зависит от удобства. Так как операторы определяются для типов, а не для подтипов, то объекты с общим базовым типом могут свободно использоваться в одном выражении.

type Counter is range 0 to 100;
subtype low_range is Counter range 0 to 50;
subtype mid_range is Counter range 25 to 75;
subtype hi_range is Counter range 50 to 100;
variable low_count: low_range;
variable mid_count: mid_range;
variable hi_count: hi_range;
.
.
.
mid_count:=(hi_count + low_count)/2;

Значения hi_count и low_count оба имеют тип Counter. Сначала вычисляется значение выражения. Затем до выполнения назначения это значение проверяется с использованием ограничений диапазона для mid_count.

Физические типы

Физические типы позволяют разработчику непосредственно выразить величины в физических единицах измерения. В VHDL используется один физический тип - предопределенный физический тип TIME (время). Объявление физического типа задает множество единиц, определенных в терминах некоторой базовой единицы. В случае типа TIME базовой единицей является fs (фемтосекунда), а производными единицами являются ps, ns, us и так далее. Рассмотрим определение типа TIME.

type TIME is range -(2**31-1) to 2**31-1
units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
ms = 1000 us;
s  = 1000 ms;
min = 60 s;
hr = 60 min;
end units;

Диапазон типа TIME определяет диапазон базовых единиц, который может быть точно представлен объектами типа. Физические литералы, использующие любые из определенных имен для физических единиц, будут автоматически преобразовываться к фемтосекундам.

Массивы и записи

VHDL обеспечивает два вида составных типов, поддерживающих связывание объектов: массивы и записи.

Массивы

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

Объявления массивов

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

type bit_vector is array(natural range <>) of bit;
type string is array( positive range <>) of character;

Каждый из этих типов имеет одно измерение. Тип bit_vector индексирован значениями предопределенного типа natural и имеет элементы типа bit. Тип string индексируется предопределенным типом positive и имеет элементы типа character. Запись range<> (читается как "ящик диапазона" - range box) означает, что определение границ индекса было отложено. Границы подставляются в момент, когда создается объект данного типа.

Замечание. Как видно, в отличие от большинства языков программирования (Си, Паскаль, Фортран и др.), в VHDL можно задавать тип индексов массива. Индексы массива могут быть целого или перечислительного типа. Элементы могут быть любого типа. Например:

type matrix is array(integer range <>,integer range<>)of real;
type color_accumulator is array(color range <>) of natural;
type color_match is array(natural range<>) of color;
type bit6_data is array(positive range<>) of bit6;
type bit6_address is array(positive range<>) of bit6;
type transition_delay is array(bit6 range<>,bit6 range<>)of time;
type conversion_vector is array(bit6 range<>) of bit;

Объявление объекта типа массив определяет имя типа и ограничения на индекс (index constraint):

variable square: matrix(1 to 10,1 to 10);
signal A_register,B_register: bit6_data(63 downto 0);
signal parts_per_color:color_accumulator(green to indigo);
constrant part_id:string := "M00368";
variable bit_equivalence: conversion_vector(bit6);

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

  1. при помощи to или downto (первые три примера);
  2. он может также заменяться диапазоном начального значения (как в part_id);
  3. диапазон может быть назван именем индекса соответствующего перечислительного типа (как в bit_equivalence).

В последнем случае диапазон является полным диапазоном перечислительного типа.

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

subtype data_store is bit6_data(63 downto 0);
signal A_reg,B_reg: data_store;
subtype transform is matrix (1 to 4, 1 to 4);
variable X,Y:transform;
signal unit: transform;

Имеется также другая сокращенная запись, которая часто полезна при создании массивов. Рассмотрим следующую пару объявлений:

type transition_delay is array(bit6 range<>,bit6 range<>)of time;
subtype cmos_transition is transition_delay(bit6,bit6);

Эти объявления можно записать в следующем виде:

type cmos_transition is array(bit6,bit6) of time;

Отличие заключается в том, что неограниченный массивный тип transition_delay никогда явно не определяется. Это объявление создает анонимный тип (anonymous type) с объявлением, которое похоже на объявление для transition_delay, за которым непосредственно следует объявление подтипа для cmos_transition c данным ограничением на индекс.

Ссылки

Читать на другом языке