Процедурные блоки предназначены в основном для моделирования цифровых устройств на VHDL. Однако блоки process могут быть также и синтезируемыми, и предназначены для описания синхронных (тактируемых) схем. Блок process имеет следующий синтаксис:
process (<список чувствительности>)
begin
<операторы>
endprocess;
Список чувствительности («sensitivitylist») представляет собой список сигналов, изменение которых должно приводить к выполнению операторов, перечисленных внутри «операторных скобок» begin/endprocess.
Можно, например, реализовать с помощью блока process обычное комбинаторное выражение.
process(a, b)
begin
q <= a and b;
endprocess;
Такая запись эквивалентна выражению непрерывного присваивания
q<= aandb;
С точки зрения моделирования, различие состоит в том, что для оператора присваивания повторный расчет выражения производится при изменениях любого из сигналов, участвующих в выражении, а для блока process – только для сигналов, перечисленных в списке чувствительности. Для приведенных выше примеров результат будет одинаковым, однако возможны ситуации, когда сокращение списка чувствительности до необходимого минимума способен ускорить процесс моделирования за счет отказа от повторного перерасчета выражений, которые в конечном итоге не влияют на работу схемы. С другой стороны, рассмотрим запись
process(a)
begin
q<= aandb;
endprocess;
Несмотря на то, что будет синтезирован вентиль 2И, при его моделировании значение выхода не будет рассчитываться при изменениях сигнала b, поскольку его нет в списке чувствительности. Следовательно, результаты моделирования не будут соответствовать реальному поведению такого устройства.
Основное использование блока process в синтезируемых схемах – реализация синхронных схем, простейшим примером которых является D-триггер (D-flip-flop). Это устройство, имеющее вход данных d и выход данных q, а также тактовый вход clk. По фронту тактового сигнала выход принимает значение, равное действующему в этот момент на входе. D-триггер, таким образом, является простейшим элементом памяти.
Описание D-триггера на VHDL с помощью процедурного блока process приведено ниже.
entitydff is
Port (clk : in STD_LOGIC;
d : in STD_LOGIC;
q : out STD_LOGIC);
enddff;
architecture Behavioral of dff is
begin
process(clk)
begin
ifclk’event and clk = ‘1’ then
q <= d;
end if;
end process;
endBehavioral;
Ключевое слово ‘event, появившееся внутри процедурного блока, является атрибутом сигнала, и в данном случае представляет собой условие «произошло событие», т.е. изменение состояния сигнала. Таким образом, условие в целом можно трактовать как «произошло изменение сигнала clk (clk’event), и его значение стало равно ‘1’ (andclk = ‘1’)». Следовательно, строки внутри оператора if/end if будут выполняться каждый раз в момент положительного перепада (фронта) сигнала clk.
Внутри процедурного блока находится единственный оператор q<= d; При его выполнении выход q будет принимать значение, равное d. Поскольку выполнение этого оператора будет привязано к моментам положительных перепадов тактового сигнала, итогом синтеза для такого выражения будет D-триггер.
= Перейти к содержанию =