Проект и структура описания объектов в VHDL
1. Структура проекта
Проект в VHDL определяется как совокупность связанных проектных пакетов. Проектными пакетами (design unit) называются независимые (external) фрагменты описаний, которые можно независимо анализировать компилятором и помещать в рабочую библиотеку проекта (Work).
Проектными пакетами могут быть:
• объявление интерфейса объекта проекта (entity);
• объявление архитектуры (architecture);
• объявление конфигурации (configuration);
• объявление интерфейса пакета (package);
• объявление тела пакета (package body).
Можно выделить две категории модулей проекта: первичные и вторичные. К первичным относятся объявления пакета, объекта проекта, конфигурации, к вторичным — объявление архитектуры, тела пакета. Файл, в котором размещаются один или несколько модулей проекта, называется файлом проекта (design file).
Все проанализированные модули помещаются в библиотеку проекта (design library) и становятся библиотечными модулями (library unit). Существует два класса библиотек проекта: рабочие библиотеки и библиотеки ресурсов. Рабочая библиотека — это библиотека Work, с которой в данном сеансе работает пользователь и в которую помещается пакет, полученный в результате анализа пакета проекта. Библиотека ресурсов — это библиотека, содержащая библиотечные модули, используемые в анализируемом модуле проекта. В каждый момент времени пользователь работает с одной рабочей библиотекой и произвольным количеством библиотек ресурсов.
2. Описание объектов проекта
Полное описание модели объекта проекта состоит из следующих частей:
а) описание интерфейса объекта проекта (entity), включающее:
— Port (списки входных и выходных сигналов);
— Generic (настраиваемые параметры модели);
б) описание архитектуры объекта проекта (ARCHITECTURE), включающее:
— объявление переменных и дополнительных (внутренних) сигналов;
— операторную часть, представляющую собой описание объекта проекта на структурном или поведенческом уровне;
в) (только для структурной формы описания) описание конфигурации (configuration), задающей подключение библиотеки моделей элементов и выборку их в качестве компонентов структуры.
Интерфейс объектов проекта описывается при помощи ключевого слова entity:
entity entity_name is
[generic (generic_list);]
port (port_list);]
[begin
passive_statements;
…]
end entity entity_name;
Объявление интерфейса может содержать необязательное тело, следующее за ключевым словом begin, в котором могут применяться только пассивные (т.е. не изменяющие значение сигналов) выражения и операторы. Пример описания интерфейса объекта проекта:
entity AND2_Checked is
port (
X1: in BIT;
X2: in BIT;
Y: out BIT;
)
begin
assert (X1 = ‘1’ and X2 = ‘1’)
report «X1 and X2 active» severity note;
…
end entity AND2_Checked;
В VHDL существуют два основных уровня описания архитектуры объектов — поведенческий и структурный.
Поведенческий уровень
На поведенческом уровне описание объектов проекта представляется в VHDL в виде набора параллельных процессов. Организация процессов обеспечивается введением оператора процесса и оператора параллельного присваивания сигналов, также представляющего процессы. Это определяет две формы описания объектов на поведенческом уровне — потоковую и процессную.
Потоковая форма
В потоковой форме описания объекта проекта его архитектура представлена в виде множества параллельных операций. Для сигналов вводятся специальные операторы параллельного присваивания "<=", являющиеся эквивалентами операторов присваивания ":=" для простых переменных, но имитирующие параллельные процессы с сигналами. Это реализуется искусственным приемом выполнения этих операторов на каждом шаге моделирования с бесконечно малой дельта-задержкой. Например, при выполнении операторов
Y <= X1 and X2; (1) Z <= not (X3 and Y); (2)
в правой части оператора (2) будет использоваться не полученное в операторе (1), а старое значение Y, определенное на предыдущем шаге моделирования.
Параллельное присваивание определено в трех различных формах:
• безусловное параллельное присваивание:
signal_name <= expression
• условное параллельное присваивание:
signal_name <= expression1 when boolean_expression1 else expression2 when boolean_expression2 ... else expressionN when boolean_expressionN else expression
• параллельное присваивание по выбору:
with expression select
signal_name <= signal_value1 when choices1, signal_value2 when choices2, ... signal_valueN when choicesN;
Примеры различных форм параллельного присваивания приведены ниже:
signal A: BIT_VECTOR (3 downto 0);
signal F1, F2, F3: BIT— безусловное присваивание:
F1 <= (A(1) and not A(0)) or (not A(1) and A(2) and not A(3)); -- условное параллельное присваивание F2 <= '1' when A = "0000" or A = "0010" or A = "0100" or A = "0110" or A = "1010" or A = "1100" or A = "1110" else '0'; -- параллельное присваивание по выбору with A select F3 <= '1' when "0000" | "0010" | "0100" | "0110" | "1010" | "1100" | "1110", '0' when others;
Условное параллельное присваивание удобно использовать при реализации различных схем выбора, например мультиплексоров:
— тип std_logic_vector определен в пакете std.logic
entity mux is port (
a, b, c, d: in std_logic_vector (3 downto 0);
s: in std_logic_vector (1 downto 0);
x: out std_logic_vector (3 downto 0)
);
end mux;architecture archmux1 of mux is
begin
x <= a when (s = "00") else b when (s = "01") else c when (s = "10") else d; end archmux1; architecture archmux2 of mux is begin with s select x <= a when "00", b when "01", c when "10", d when "11", (others => ‘X’) when others;
end archmux2;
Процессная форма
В процессной форме описание объекта производится при помощи процессов. Процесс в VHDL определяет независимую повторяющуюся последовательность операторов и представляет поведение некоторой части проекта. После того, как последний оператор последовательности выполнен, выполнение начинается с первого оператора процесса. Для определения процесса используется оператор process , который состоит из объявлений (после ключевого слова process) и операторной части, которая начинается после слова begin. В объявлении процесса допускается создавать переменные, в то время как объявлять сигналы в этой части нельзя.
Предложения в операторной части выполняются строго последовательно (в отличие от параллельного назначения потоковой формы описания и конкретизации компонентов в структурном стиле) и включают, подобно языкам высокого уровня, операторы присваивания, условные операторы и операторы циклов. Оператор "<=" здесь используется как оператор назначения сигнала (в отличие от потоковой формы, где он используется как оператор параллельного присваивания) и также выполняется последовательно. Оператор процесса в VHDL существует в двух вариантах, которые определяют способ активации процесса (запуска на выполнение): • вариант А — с помощью сигналов активизации:
PROCESS (X1, X2) — запускается только при изменении
— хотя бы одного из сигналов X1, X2
BEGIN
Y <= not X1 and X2; Z <= Y or X3; END PROCESS;
• вариант Б — с помощью оператора WAIT задержки процесса, который может располагаться в любом месте операторной части процесса:
PROCESS (X1, X2)
BEGIN
Y <= not X1 and X2; Z <= Y or X3; WAIT ON X1, X2; END PROCESS; --или PROCESS (X1, X2) BEGIN WAIT ON X1, X2; Y <= not X1 and X2; Z <= Y or X3; END PROCESS;
Оператор WAIT в варианте Б позволяет задавать достаточно сложные условия активизации процессов:
WAIT ON <список сигналов> UNTIL <условие> FOR <время>
Например, для задания условий срабатывания схемы по фронту или по срезу сигнала С с задержкой на 10 ns или на t ns можно записать следующим образом:
WAIT ON C UNTIL C=’1′ for 10 ns; — значение t предварительно
— присваивается, например, t:=12 ns; или задается в GENERIC
WAIT ON C UNTIL C=’0′ for t ns;
Процессы в VHDL могут быть вложенными; также существует понятие пассивного процесса — процесса, в котором (явно или опосредовано) не производится назначение сигнала ни в одном из его операторов.
Поведенческий уровень описания объектов проекта является базовым, поскольку любые схемы, по крайней мере на самом нижнем уровне, представлены элементами, реализация которых выполнена на уровне поведения.
Структурный уровень описания объектов проекта. На структурном уровне объект представлен в виде иерархии связанных компонентов, на низшем уровне компоненты реализуются при помощи поведенческого описания. В структурном описании после объявления архитектуры следуют объявления компонентов, используемых в архитектуре. В теле описания архитектуры для создания экземпляров компонентов используются предложения конкретизации компонентов. Предложение конкретизации компонента начинается с метки, за которой следует имя компонента, а затем, если это необходимо, операторы назначения карты параметров (generic map) и карты портов (port map):
entity andnot2 — декларация имени объекта проекта
port (x1, x2: in BIT; — декларация входных портов
y: out BIT);— декларация выходного порта
end andnot2;architecture functional of andnot2 is — декларация архитектуры
begin
y <= not (x1 and x2) -- описание функции объекта end functional; entity example is port (x1, x2, x3: in BIT; y: out BIT); end example; architecture structure of example is component andnot2 is port (x1, x2: in BIT; y: out BIT); end component; signal y1: BIT; begin P1: andnot2 port map (x1, x2, y1); P2: andnot2 port map (y1, x3, y); end structure;
Каждый экземпляр компонента должен быть сопоставлен с парой объект—архитектура. По умолчанию осуществляется поиск объекта с совпадающим с компонентом именем, списком портов и параметров, однако данное поведение можно изменить при помощи описания конфигурации.
Помимо конкретизации каждого компонента отдельно, существует возможность множественной конкретизации компонента при помощи оператора generic:
gen: for I in 1 to N generate
P1: andnot2 port map (in1 (I), in2 (I), out (I));
end generic;
В одном архитектурном теле допускается смешанное (mixed) описание, т.е. возможно одновременное использование процессной, потоковой и структурной форм, что в некоторых случаях значительно упрощает реализацию объекта.