VHDL (VHSIC Hardware Description Language) — различия между версиями

Материал из Национальной библиотеки им. Н. Э. Баумана
Строка 11: Строка 11:
  
 
'''VHDL''' (''англ. VHSIC (Very high speed integrated circuits) Hardware Description Language'') — язык описания аппаратуры интегральных схем. Язык проектирования VHDL является базовым языком при разработке аппаратуры современных вычислительных систем.
 
'''VHDL''' (''англ. VHSIC (Very high speed integrated circuits) Hardware Description Language'') — язык описания аппаратуры интегральных схем. Язык проектирования VHDL является базовым языком при разработке аппаратуры современных вычислительных систем.
==История==
+
== История ==
  
 
Был разработан в 1983 г. по заказу Министерства обороны США с целью формального описания логических схем для всех этапов разработки электронных систем, начиная модулями микросхем и заканчивая крупными вычислительными системами.
 
Был разработан в 1983 г. по заказу Министерства обороны США с целью формального описания логических схем для всех этапов разработки электронных систем, начиная модулями микросхем и заканчивая крупными вычислительными системами.
Строка 21: Строка 21:
 
VHDL создан как средство описания цифровых систем, однако существует подмножество языка — VHDL AMS (Analog Mixed Signal), позволяющее описывать как чисто аналоговые, так и смешанные, цифро-аналоговые схемы.
 
VHDL создан как средство описания цифровых систем, однако существует подмножество языка — VHDL AMS (Analog Mixed Signal), позволяющее описывать как чисто аналоговые, так и смешанные, цифро-аналоговые схемы.
  
==Основные элементы языка VHDL==
+
== Первичная абстракция языка VHDL ==
===Первичная абстракция языка VHDL===
+
  
 
VHDL является формальной записью, предназначенной для описания цифровой системы. Функция системы определяется как преобразование значений на входах в значения на выходах. Организация системы задается перечнем
 
VHDL является формальной записью, предназначенной для описания цифровой системы. Функция системы определяется как преобразование значений на входах в значения на выходах. Организация системы задается перечнем
 
связанных компонентов.  
 
связанных компонентов.  
  
Объект проекта <code>entity</code> представляет собой описание компонента проекта, имеющего четко заданные входы и выходы и выполняющей четко определенную функцию. Объект проекта может представлять всю проектируемую систему, некоторую подсистему, устройство, узел, стойку, плату, кристалл, макроячейку, логический элемент и т.п.
+
=== Объект проекта ===
  
В описании объекта проекта можно использовать компоненты, которые, в свою очередь, могут быть описаны как самостоятельные объекты проекта более низкого уровня. Совокупность этих связанных объектов проекта называется иерархией проекта <code>design_hierarchy</code>.
+
''Объект проекта'' <code>entity</code> представляет собой описание компонента проекта, имеющего четко заданные входы и выходы и выполняющей четко определенную функцию. Объект проекта может представлять всю проектируемую систему, некоторую подсистему, устройство, узел, стойку, плату, кристалл, макроячейку, логический элемент и т.п.
 +
 
 +
=== Иерархия проекта ===
 +
 
 +
В описании объекта проекта можно использовать компоненты, которые, в свою очередь, могут быть описаны как самостоятельные объекты проекта более низкого уровня. Совокупность этих связанных объектов проекта называется ''иерархией проекта'' <code>design_hierarchy</code>.
 +
 
 +
=== Типы описаний ===
  
 
Каждый объект проекта состоит, как минимум, из двух различных типов описаний: описания интерфейса и одного или более архитектурных тел.
 
Каждый объект проекта состоит, как минимум, из двух различных типов описаний: описания интерфейса и одного или более архитектурных тел.
Строка 35: Строка 40:
 
При описании цифровой системы на языке VHDL, пользователь может использовать пять различных типов описаний:
 
При описании цифровой системы на языке VHDL, пользователь может использовать пять различных типов описаний:
  
*Интерфейс описывается в ''объявлении объекта проекта'' <code>entity_declaration</code> и определяет только входы и выходы объекта проекта.
+
*Интерфейс описывается в '''''объявлении объекта проекта''''' <code>entity_declaration</code> и определяет только входы и выходы объекта проекта.
  
*Для описания поведения объекта или его структуры служит ''архитектурное тело'' <code>architecture_body</code>.
+
*Для описания поведения объекта или его структуры служит '''''архитектурное тело''''' <code>architecture_body</code>.
  
*Чтобы задать, какие объекты проекта использованы для создания полного проекта, используется ''объявление конфигурации'' <code>configuration_declaration</code>.
+
*Чтобы задать, какие объекты проекта использованы для создания полного проекта, используется '''''объявление конфигурации''''' <code>configuration_declaration</code>.
  
*В языке VHDL предусмотрен механизм пакетов для часто используемых описаний, констант, типов, сигналов. Эти описания помещаются в ''объявлении пакета'' <code>package_declaration</code>.
+
*В языке VHDL предусмотрен механизм пакетов для часто используемых описаний, констант, типов, сигналов. Эти описания помещаются в '''''объявлении пакета''''' <code>package_declaration</code>.
  
*Если пользователь использует нестандартные операции или функции, их интерфейсы описываются в объявлении пакета, а тела содержатся в ''теле пакета'' <code>package_body</code>.
+
*Если пользователь использует нестандартные операции или функции, их интерфейсы описываются в объявлении пакета, а тела содержатся в '''''теле пакета''''' <code>package_body</code>.
  
Каждое из описаний является самостоятельной конструкцией языка VHDL, может быть независимо проанализировано анализатором и поэтому получило название ''Модуль проекта'' <code>design_unit</code>. Модули проекта, в свою очередь, можно разбить на две категории:
+
=== Модуль проекта ===
  
 +
Каждое из описаний является самостоятельной конструкцией языка VHDL, может быть независимо проанализировано анализатором и поэтому получило название ''Модуль проекта'' <code>design_unit</code>. Модули проекта, в свою очередь, можно разбить на две категории:
 
*первичные (различного типа объявления)
 
*первичные (различного типа объявления)
 
*вторичные (отдельно анализируемые тела первичных модулей)
 
*вторичные (отдельно анализируемые тела первичных модулей)
  
Один или несколько модулей проекта могут быть помещены в один файл, называемый файлом проекта <code>design_file</code>.
+
Один или несколько модулей проекта могут быть помещены в один файл, называемый '''''файлом проекта''''' <code>design_file</code>.
  
Каждый проанализированный модуль проекта помещается в библиотеку проекта <code>design_library</code> и становится библиотечным модулем <code>library_unit</code>. Данная реализация позволяет создать любое число библиотек проекта. Каждая библиотека проекта в языке VHDL имеет логическое имя (идентификатор). Фактическое имя файла, содержащего эту библиотеку, может совпадать или не совпадать с логическим именем библиотеки проекта. Для ассоциации логического имени библиотеки с соответствующим ей фактическим именем предусмотрен специальный механизм установки внешних ссылок.  
+
Каждый проанализированный модуль проекта помещается в '''''библиотеку проекта''''' <code>design_library</code> и становится '''''библиотечным модулем''''' <code>library_unit</code>. Данная реализация позволяет создать любое число библиотек проекта. Каждая библиотека проекта в языке VHDL имеет логическое имя (идентификатор). Фактическое имя файла, содержащего эту библиотеку, может совпадать или не совпадать с логическим именем библиотеки проекта. Для ассоциации логического имени библиотеки с соответствующим ей фактическим именем предусмотрен специальный механизм установки внешних ссылок.  
  
 
По отношению к сеансу работы VHDL существует два класса библиотек проекта: рабочие библиотеки и библиотеки ресурсов. Рабочая библиотека - это библиотека, с которой в данном сеансе работает пользователь и в которую помещается библиотечный модуль, полученный в результате анализа модуля проекта.  
 
По отношению к сеансу работы VHDL существует два класса библиотек проекта: рабочие библиотеки и библиотеки ресурсов. Рабочая библиотека - это библиотека, с которой в данном сеансе работает пользователь и в которую помещается библиотечный модуль, полученный в результате анализа модуля проекта.  
Строка 61: Строка 67:
  
 
Возможность создания и использования многих библиотек ресурсов позволяет пользователю классифицировать библиотечные модули по различным признакам. Например, в одной библиотеке хранить описания микросхем одной серии, в другой - описания микросхем другой серии и т.д. Или в одной библиотеке хранить описания микросхем с одним типом задержки, в другой - описания микросхем с другим типом задержки и т.д.
 
Возможность создания и использования многих библиотек ресурсов позволяет пользователю классифицировать библиотечные модули по различным признакам. Например, в одной библиотеке хранить описания микросхем одной серии, в другой - описания микросхем другой серии и т.д. Или в одной библиотеке хранить описания микросхем с одним типом задержки, в другой - описания микросхем с другим типом задержки и т.д.
 +
 +
== Лексические элементы ==
 +
 +
Любой машинный язык характеризуется определенным множеством разрешенных лексических элементов. Текст описания на языке VHDL состоит из одного или более файлов проекта. Файл проекта представляет собой последовательность лексических элементов, каждый из которых составлен из символов строго определенного набора символов. Текст каждого модуля проекта является последовательностью отдельных лексических элементов.
 +
 +
=== Ограничитель ===
 +
 +
Ограничителем может быть один из следующих символов (входящих в базовый набор): & ' ( ) * + , - . / : < = > |
 +
 +
Ограничителем может быть также один из составных ограничителей, составленный из стоящих рядом специальных символов:
 +
 +
{| class="wikitable"
 +
|-
 +
! ог. !! имя
 +
|-
 +
|=> || стрелка
 +
|-
 +
|** || двойная звезда, возведение в степень
 +
|-
 +
|:= || присваивание переменной
 +
|-
 +
|/= || не равно
 +
|-
 +
|>= || больше или равно
 +
|-
 +
|<= || меньше или равно, а также назначение сигнала
 +
|-
 +
|<> || блок
 +
|}
 +
 +
=== Идентификатор ===
 +
 +
Идентификаторы используются в качестве имен, а также в качестве зарезервированных слов. Идентификаторы могут содержать латинские буквы в верхнем и нижнем регистре, цифры и символ подчеркивания. Заглавные и строчные буквы в идентификаторах считаются равнозначными. Так как пробел является разделителем, то использование его недопустимо внутри идентификатора.
 +
''Пример:''
 +
COUNT X C_OUT FFT Decoder VHSIC X1 PageCount STORE_NEXT_ITEM
 +
 +
=== Комментарии ===
 +
 +
Комментарий начинается с двух рядом стоящих символов дефиса и ограничен концом строки. Комментарий
 +
может появиться в любой строке VHDL-описания. Наличие или отсутствие комментариев не оказывает влияние
 +
на правильность описания. Более того, комментарии не оказывают влияния на выполнение модуля
 +
моделирования; единственным назначением комментариев является повышение читабельности описания.
 +
Горизонтальная табуляция может быть использована в комментарии после двойного символа дефиса и это
 +
эквивалентно одному или более пробелов.
 +
 +
=== Литералы ===
 +
 +
{| class="wikitable"
 +
|-
 +
! ВИД !! ОПИСАНИЕ !! ПРИМЕРЫ
 +
|-
 +
|Десятичный абстрактный литерал
 +
||Абстрактный литерал, выраженный в десятичной системе счисления. Символ подчеркивания, стоящий между двумя соседними цифрами, не оказывает влияния на значение литерала. Буква Е в выражении экспоненты (если используется) может быть написана в любой регистре. Выражение экспоненты в целом литерале не должно содержать знак минус. В абстрактных литералах допускаются незначащие нули. Так как пробел является разделителем, то он не разрешен в абстрактных литералах, даже между составными частями экспоненты. Значение 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", """"
 +
|-
 +
|Битово-строковый литерал
 +
||Битово-строковые литералы <code>bit-string literal</code> формируются из последовательности расширенных цифр, заключаемой между двумя символами кавычки, используемых как скобки строки битов, и которой предшествует спецификатор базы <code>base specifier</code>. Спецификатор базы может принимать значения В, О, Х. Если спецификатором базы счисления является В, то в качестве расширенных цифр могут выступать только цифры 0 и 1; если O, то цифры от 0 до 7; и если Х, то цифры от 0 до 9 и от А до F. Символ подчеркивания, стоящий между двумя соседними цифрами в битово-строковом литерале, не влияет на значение этого литерала. Буквой, используемой в качестве расширенной цифры, могут быть буквы от А до F, представляющие, соответственно, цифры от 10 до 15. Буква в битово-строковом литерале (расширенная цифра или спецификатор базы) может писаться как в заглавной, так и в строчной форме - значение литерала от этого не меняется.
 +
 +
Битово-строковый литерал имеет значение, представляющее собой последовательность значений предопределенного типа BIT (т.е. последовательность из '0' и '1'). Если указатель базы счисления есть В, то
 +
значение битово-строкового литерала есть сам литерал. Если указатель базы есть O (или Х), то значением литерала является последовательность, полученная замещением каждой расширенной цифры последовательностью из трех (или соответственно четырех) значений предопределенного типа BIT. Длина битово-строкового литерала равна числу значений типа BIT в представленной последовательности.
 +
||X"FFF", 0"777", X"777"
 +
|}
 +
 +
=== Разделители ===
 +
 +
Между любыми двумя соседними лексическими элементами разрешено ставить один или более разделителей, а также перед первым лексическим элементом или после последнего лексического элемента в каждом модуле проекта. По крайней мере, один разделитель необходим между идентификатором или абстрактным литералом и соседним идентификатором, или абстрактным литералом.
 +
 +
Разделителем может быть либо символ пробела, либо символ управления форматом, либо конец строки. Символ пробела не является разделителем внутри комментария, строкового литерала или символьного литерала, включающего этот символ.
 +
 +
=== Зарезервированные слова ===
 +
 +
Идентификаторы, перечисленные ниже, называются зарезервированными словами, они зарезервированы в
 +
языке для специального назначения.
 +
{| class="wikitable" align="right" style="margin-left:1em"
 +
|+ Зарезервированные слова
 +
|-style="vertical-align: top;"
 +
|ABS<br />
 +
ACCESS<br />
 +
AFTER<br />
 +
ALIAS<br />
 +
ALL<br />
 +
AND<br />
 +
ARCHITECTURE<br />
 +
ARRAY<br />
 +
ASSERT<br />
 +
ATTRIBUTE<br />
 +
BEGIN<br />
 +
BLOCK<br />
 +
BODY<br />
 +
BUFFER<br />
 +
BUS<br />
 +
CASE<br />
 +
COMPONENT<br />
 +
CONFIGURATION<br />
 +
CONSTANT<br />
 +
DISCONNECT<br />
 +
DOWNTO
 +
||ELSE<br />
 +
ELSEIF<br />
 +
END<br />
 +
ENTITY<br />
 +
EXIT<br />
 +
FILE<br />
 +
FOR<br />
 +
FUNCTION<br />
 +
GENERATE<br />
 +
GENERIC<br />
 +
GUARDED<br />
 +
IF<br />
 +
IMPORT<br />
 +
IN<br />
 +
INITIALIZE<br />
 +
INOUT<br />
 +
IS<br />
 +
LABEL<br />
 +
LIBRARY<br />
 +
LINKAGE<br />
 +
LOOP<br />
 +
MAP
 +
||MOD<br />
 +
NAND<br />
 +
NEW<br />
 +
NEXT<br />
 +
NOR<br />
 +
NOT<br />
 +
NULL<br />
 +
OF<br />
 +
ON<br />
 +
OPEN<br />
 +
OR<br />
 +
OTHERS<br />
 +
OUT<br />
 +
PACKAGE<br />
 +
PORT<br />
 +
PROCEDURE<br />
 +
PROCESS<br />
 +
RANGE<br />
 +
RECORD<br />
 +
REGISTER<br />
 +
REM<br />
 +
REPORT
 +
||RETURN<br />
 +
SELECT<br />
 +
SEVERITY<br />
 +
SIGNAL<br />
 +
SUBTYPE<br />
 +
THEN<br />
 +
TO<br />
 +
TRANSPORT<br />
 +
TYPE<br />
 +
UNITS<br />
 +
UNTIL<br />
 +
USE<br />
 +
VARIABLE<br />
 +
WAIT<br />
 +
WHEN<br />
 +
WHILE<br />
 +
WITH<br />
 +
XOR
 +
|}
 +
Зарезервированное слово не должно использоваться как объявленный идентификатор. Зарезервированные
 +
слова, различающиеся только в использовании соответствующих заглавных и строчных букв, рассматриваются
 +
как идентичные.
 +
1.2.7. Допустимые замены символов
 +
Для базовых символов "вертикальная черта", "диез", "кавычка" разрешены следующие замены:
 +
1) вертикальная черта (|) может быть заменена восклицательным знаком (!) при использовании в качестве
 +
ограничителя;
 +
2) диез (#) в базированном литерале может быть заменен двоеточием (:), при этом заменить надо оба знака в
 +
этом литерале;
 +
3) кавычки ("), используемые как ограничители в строковом литерале с обеих сторон, могут быть заменены
 +
на проценты (%). При этом необходимо заменить обе строковые скобки, а из последовательности символов
 +
исключить все символы кавычки. Каждый символ процента внутри последовательности символов должен быть
 +
удвоен. Удвоенный символ процента интерпретируется в этом случае как один символ.
 +
Такие замены не изменяют смысл описания.
 +
Правила использования идентификаторов и абстрактных литералов таковы, что строчные и заглавные буквы
 +
могут быть использованы без различия. Эти лексические элементы, таким образом, могут быть написаны с
 +
использованием только базового набора символов.
 +
 +
== Модели данных в VHDL ==
 +
 +
Модели данных позволяют создавать различные типы и объекты данных на основе базовых
 +
предопределенных типов. Любой объект данных характеризуется определенным классом и типом.
 +
Объекты данных (data_object) являются хранилищами для значений определенного типа. Все типы в VHDL
 +
конструируются из элементов, представляющих собой скалярные типы.
 +
 +
=== <big>Скалярные типы</big> ===
 +
 +
Скалярные (scalar) типы - это элементы, из которых конструируются все типы в VHDL. Базовое множество
 +
скалярных типов является предопределенным. По мере необходимости разработчик может создать
 +
дополнительные скалярные типы. В VHDL имеется четыре вида скалярных типов: целый тип, тип с плавающей
 +
точкой, перечислительный тип (enumeration) и физический тип. Разработчик имеет возможность задавать
 +
подтипы скалярных типов.
 +
 +
==== Целый тип ====
 +
 +
Объекты целого типа используются для представления абстрактных числовых значений. Тип integer является
 +
предопределенным. Он охватывает все целые числа, ограниченные разрядностью слова компьютера.
 +
 +
''Добавочные целые'' типы могут быть объявлены явно заданием диапазона значений, допустимых для
 +
объектов данного типа. Рассмотрим несколько примеров объявлений целых типов.
 +
 +
<code>
 +
type Apples is range 0 to 75;<br />
 +
type Oranges is range 0 to 75;<br />
 +
type Word_index is range 31 downto 0;<br />
 +
</code>
 +
 +
Рассмотрим, как объявляются объекты, использующие
 +
эти типы.
 +
 +
<code>
 +
variable Macintosh: Apples;<br />
 +
variable Seville,Valencia,av_oranges:Oranges := 10;<br />
 +
signal  control_selector:Word_Index;<br /></code>
 +
 +
Константе должно быть присвоено значение в момент объявления. Аналогично начальное значение может
 +
быть присвоено переменной.
 +
 +
Все обычные арифметические операторы и операторы отношения являются предопределенными для целого
 +
типа. Тем не менее, оба аргумента оператора должны быть одного типа.
 +
 +
Нельзя сравнивать объекты разных типов.
 +
 +
Тем не менее, все целые типы и типы с плавающей точкой являются тесно связанными типами <code>closely
 +
related types</code> и VHDL обеспечивает для этих типов преобразование <code>conversion</code> между любыми парами. Значение выражения одного типа преобразуется к значению тесно связанного типа указанием перед
 +
выражением, заключенным в скобках, имени типа, к которому преобразуется выражение. При преобразовании
 +
между типом с плавающей точкой и целым типом будет выполняться округление до ближайшего целого.
 +
 +
==== Тип с плавающей точкой ====
 +
 +
Объекты типа с плавающей точкой используются для представления абстрактных числовых значений. Тип
 +
real является предопределенным. Он включает вещественные числа.
 +
Добавочные типы с плавающей точкой могут быть объявлены явно заданием диапазона значений,
 +
допустимых для объектов данного типа. Рассмотрим пример объявлений типа с плавающей точкой.
 +
 +
<code>type Probability is range 0.0 to 1.0;</code>
 +
 +
Диапазоны задаются либо убывающей, либо возрастающей последовательностью значений. Границы
 +
диапазона могут быть произвольными выражениями. Рассмотрим, как объявляются объекты, использующие
 +
эти типы.
 +
 +
<code>
 +
constant alpha_level: Probability:=0.75; <br />
 +
variable beta_level:  Probability;<br /></code>
 +
 +
Константе должно быть присвоено значение в момент объявления. Аналогично начальное значение может
 +
быть присвоено переменной.
 +
Литералы с плавающей точкой представляют значения любого типа с плавающей точкой и всегда содержат
 +
десятичную точку или отрицательную экспоненту: например, 3.14159, -23.0, 1E-2. Запись с экспонентой может
 +
быть использована для любого вида числовых литералов: 9Е − целое, а 0.324Е-3 − с плавающей точкой.
 +
Для формирования выражения может быть использована комбинация имен объектов, литералов и
 +
операторов.
 +
Все обычные арифметические операторы и операторы отношения являются предопределенными для типа с
 +
плавающей точкой. Тем не менее, оба аргумента оператора должны быть одного типа. Предопределенный
 +
оператор ">" не работает с операндами различных типов, даже если они имеют одинаковый диапазон.
 +
Все целые типы и типы с плавающей точкой являются тесно связанными типами <code>closely related types</code> и
 +
VHDL обеспечивает для этих типов преобразование <code>conversion</code> между любыми парами.

Версия 01:05, 12 декабря 2015

VHSIC Hardware Description Language
Семантика:

Язык описания аппаратуры

Появился в:

1983

Автор:

Министерство обороны США

Расширение файлов:

.vhd

Система типов:

строгая

Испытал влияние:

Ada, Pascal

ОС:

Windows, OS X, Linux

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 между любыми парами.