Выше уже было показано, что модуль на VHDL, описывающий синтезируемое устройство, состоит из разделов entity и architecture. Рассмотрим их более подробно.
В разделе entity («сущность») описывается интерфейс модуля и сопутствующие ему характеристики. Собственноинтерфейсописываетсявподразделе Port.
entitynew_module is
Port( a : in STD_LOGIC;
b : in STD_LOGIC;
c : out STD_LOGIC);
endnew_module;
В разделе Port в показанном примере перечислены входные сигналы a и b, а также выходной сигнал c. Формат объявления интерфейсного сигнала следующий:
<имя> :<спецификатор направления><тип>;
Здесь <имя> - один из разрешенных идентификаторов в VHDL, ограничения на которые подобны ограничениям на имена переменных в языках программирования. Идентификатор может содержать буквы латинского алфавита, цифры и символ подчеркивания, не должен начинаться с цифры, не должен заканчиваться символом подчеркивания или содержать внутри два символа подчеркивания подряд.
<спецификатор направления> может быть следующим:
–in – входной сигнал, только для чтения;
–out – выходной сигнал, только для записи;
–inout – двунаправленный сигнал;
–buffer – выходной (буферный сигнал), значение которого может быть считано модулем.
Типы сигналов будут рассмотрены в следующих разделах.
В разделе architecture описывается внутренняя реализация модуля.
architecture Behavioral ofnew_moduleis
begin
c <= a and b;
endBehavioral;
В показанном примере описывается реализация модуля 2И. Идентификатор Behavioral представляет собой имя архитектуры и не является зарезервированным словом. Присвоение архитектуре идентификатора необходимо потому, что каждому объявлению entity может соответствовать несколько архитектур, различающиеся способом реализации. Например, в показанном выше примере был использован подход, основанный на inference – синтезатор выбрал способ реализации логического выражения, основываясь на его поведенческом описании. Если это по каким-то причинам не устраивает разработчика, он может использовать instantiate-подход, выбрав вентиль 2И из библиотеки стандартных компонентов. Чтобы не править уже готовый вариант архитектуры (тем более что впоследствии может возникнуть желание вернуться к нему), в модуле оформляется еще один раздел architecture, для которого выбирается другой идентификатор.
Выбор идентификаторов для архитектур не имеет официальных ограничений, однако можно порекомендовать общеупотребительные варианты, которые имеют ту же силу, что и названия переменных x, y для координат или i для счетчика цикла.
BEH, Behavioral – для описаний, выполненных в поведенческом стиле.
RTL – для описаний на уровне регистровых передач.
STRUCT, Structural – для структурных описаний.
TEST – для тестов.
В дальнейшем для проекта можно глобально установить использование той или иной архитектуры:
for all : HALF_ADD use entitywork.new_module(RTL);
Эта строка устанавливает использование архитектуры RTL для всех компонентов new_module, используемых в проекте.
Несколько вариантов архитектур и регулярное употребление конфигураций обычно сопутствуют сложным, комплексным проектам, разрабатываемым с учетом необходимости проверки альтернативных конструкторских решений и возможного переноса на другую аппаратную базу. Как правило, такой подход не требуется для большинства проектов, ориентированных на ПЛИС.