Вызов процедуры.
Вызов процедуры также представляет собой последовательный оператор. Его упрощенный синтаксис:
\вызов процедуры\::=\имя процедуры\[([\имя параметра =>\] \выражение\
{,[\имя параметра\ => ] \выражение\})];
Здесь \имя процедуры\ - имя ранее определенной процедуры. Связывание формальных и фактических параметров выполняется аналогично как в вызове функции. Выражение - параметр функции - должно давать результат типа, соответствующего имени параметра \имя параметра\. Параметры можно задавать с поименованным или позиционным связыванием. При позиционном связывании параметры-выражения подставляются в порядке, определенном порядком следования имен параметров в определении функции. При поименованном связывании каждое имя, параметра связывается с соответствующим параметром с помощью символов "=>", причем порядок следования параметров может быть произвольным.
В пакете IEEE.Math_Real определена процедура генерации случайных чисел:
procedure UNIFORM(variable SEED1,SEED2:inout POSITIVE; variable X:out real);
Она может быть вызвана со связыванием параметров:
variable s1,s2:natural:=12345;
variable Random:real;
…
UNIFORM(X=> Random, SEED1=>s1,SEED2=>s2);
или без связывания параметров:
UNIFORM(s1,s2, Random);
Вызов процедуры без параметров – это просто написанное ее имя.
Входные параметры сигналов представляются как ссылки на сигналы. Параметру сигнала нельзя присваивать начальное значение, так как источник этого сигнала недоступен. Поэтому нельзя также использовать такие атрибуты сигнала, как 'delayed, 'stable, 'quiet или 'transaction. Выходной параметр сигнала передается в процедуру вместе с источником сигнала, в котором происходит присваивание сигналу. Это эквивалентно тому, что цепочка последовательных операторов тела процедуры копируется в процесс на место вызова процедуры с соответствующей подстановкой параметров. В отличие от вызова процедуры в обычных алгоритмических языках, в которых используется одно тело процедуры, в VHDL каждый вычислительный процесс, вызывающий процедуру, использует свой собственный экземпляр тела процедуры.
Параллельный вызов процедуры имеет такой же синтаксис, как у последовательного вызова процедуры. Он исполняется точно так же, как процесс, который имеет в своей исполнительной части такой же вызов процедуры с такими же параметрами и оператор wait ожидания прихода сигналов - входных параметров. Поэтому каждый параллельный вызов процедуры соответствует некоторому виртуальному процессорному элементу, исполняющему алгоритм этой процедуры.
Если программа предназначена для синтеза, то процедура, вызываемая параллельно, не должна иметь операторов wait. Такая процедура отображается в комбинационную схему или комбинацию шин, т.е. некоторый специализированный процессорный элемент.