- •Введение
- •Классы и объекты
- •Constant - константа.
- •Variable - переменная;
- •Signal - сигнал;
- •Комментарии
- •Типы данных
- •Подробно о std_logic
- •Операции в языке vhdl
- •О массивах в языке vhdl
- •Операторы vhdl
- •Интерфейс
- •Inout - двунаправленный порт (чтение и запись);
- •Архитектура
- •Часть, содержащую описания (декларации);
- •Часть, содержащую исполняемые операторы.
- •Процессы
- •Атрибуты
- •Подпрограммы vhdl
- •Библиотеки vhdl
- •Тестирование
- •Im_cpu(res, '0', ale, wr, oe, cs, X"0000", addr, X"00", data); -- Вызываем имитатор
- •Im_cpu(res, '0', ale, wr, oe, cs, X"0021", addr, X"3", data); -- Разрешаем индикацию
- •Заключение
- •Приложение а
Операторы vhdl
- а кто такие опсосы? - это операторы сотовой связи.
Как и данные, операторы в языке VHDL могут быть синтезируемыми и нет. Кроме того, операторы принято делить на последовательные и параллельные, простые и составные. Как говорилось выше, мы не пытаемся написать учебник по VHDL и не будем подробно рассматривать каждый оператор. Приведем только несколько примеров.
Последовательные операторы в VHDL (не надо путать с последовательной логикой) определяют алгоритмы выполнения подпрограмм и процессов. Они выполняются в том порядке, в каком расположены в VHDL-коде, отсюда и название такое. Одно важное замечание: все последовательные операторы могут использоваться только в теле процесса, функции или процедуры. К последовательным операторам языка VHDL относятся следующие операторы:
assert (последовательный);
case;
exit;
if;
loop;
next;
null;
report;
return;
wait;
последовательные операторы присваивания.
Примеры использования последовательных операторов:
-- Использование операторов loop, next, exit, if, присваивание
-- Несинтезируемый фрагмент VHDL-кода подсчитывает кол-во несовпадающих бит в двух массивах
neq := 0;
L1 : for i in 0 to 31 loop
next L1 when mem1(i) = mem2(i);
for j in 7 downto 0 loop
crash := 1;
exit L1 when (mem1(i)(j) = 'X' or mem2(i)(j) = 'X');
crash := 0;
if (mem1(i)(j) /= mem2(i)(j)) then neq := neq+1;
end loop;
end loop L1;
-- Использование операторов wait, case, if
-- Синтезируемый фрагмент VHDL-кода управляет состояниями сфетофора
process begin
wait until clk;
if (trig = '1') then
case state is
when red => state <= green;
when green => state <= yellow;
when yellow => state <= red;
end case;
end if;
end process;
Параллельные операторы в VHDL используются для определения блоков и процессов, которые описывают общее поведение или структуру проекта. Параллельные операторы VHDL, как следует из названия, выполняются (или не выполняются) параллельно друг другу и независимо от расположения в VHDL-коде. К таким операторам относятся:
assert (параллельный);
block;
generate;
process;
применение компонентов (port map ...);
параллельные операторы присваивания.
Примеры использования оператора block:
-- Пример защелки с использованием охранного выражения
L1: block (LE = '1')
begin
Q <= guarded D; -- Выполнится только при LE = '1'
end block L1;
-- Пример простых блоков
BLOCK1: block
signal Q : std_logic;-- Этот сигнал Q виден только в BLOCK1
begin
Q <= A and B;
end block BLOCK1;
-----------------------------------
BLOCK2: block
signal Q : std_logic;-- Этот сигнал Q виден только в BLOCK2
begin
Q <= C and D;
end block BLOCK2;
-- Пример вложенных блоков
BLOCK1: block
signal Q : std_logic;-- Этот сигнал Q виден в BLOCK1 и в BLOCK2
begin
Q <= A and B;
-----------------------------------
BLOCK2: block
signal Q1 : std_logic;-- Этот сигнал Q1 виден только в BLOCK2
begin
Q1 <= Q and C;
end block BLOCK2;
-----------------------------------
end block BLOCK1;
Следует отметить, что охранные блоки не синтезируются ни одним из известных автору синтезатором. Другие виды блоков нормально синтезируются, но и без них можно вполне обходиться. Во всяком случае, автор, кроме как в примерах, больше нигде не встречал применение блоков. Хотя на вкус и цвет...
Остальные параллельные операторы языка VHDL встретятся в последующих разделах, и мы не будем рассматривать их в этом разделе.
