Изучение VHDL

       

Вызов функции.


При вызове функции выполняется функция с заданными значениями параметров. Упрощенный синтасис вызова функции:

\вызов функции\::=\имя функции\ ([\имя параметра\ =>] \выражение\

                                   {,[\имя параметра\ => ] \выражение\});

где \имя функции\ - имя функции, определяемой ранее, \имя параметра\ - не обязательный формальный параметр этой функции. Выражение-параметр функции - должно давать результат типа, соответствующий имени параметра. Параметры можно задавать с поименованным или позиционированным связыванием. При позиционированном связывании параметры-выражения подставляются в порядке, определенном порядком следования имен параметров в определении функции. При поименованном связывании каждое имя, параметра связывается с соответствующим параметром с помощью символов "=>", причем порядок следования параметров может быть произвольным.

В отличие от процедуры, вызов функции возвращает только один параметр, зато он может участвовать как операнд в выражениях. В языке VHDL очень мало встроенных функций. Большинство функций реализовано в виде подпрограмм. Для преобразования типов чаще всего используются функции. Например, функция

function BIT_TO_INT(x:bit_vector) return natural is                      

   variable t, j:integer:=0;   

 begin 

    for I in x'reverse_range loop

         if ( x(I)='1') then

              t:=t + 2**j;

         end if;  

              j:=j+1;

         end loop;  

         return t;

       end function BIT_TO_INT;

преобразует вектор битов в целое. При этом атрибут x'reverse_range возвращает диапазон, обратный диапазону представления входного параметра. Например, если входной параметр – bit_vector(7 downto 0), то в оператор цикла подставится диапазон 0 to 7. Таким образом, получается функция, универсальная для множества различных параметров – операндов.

Ключевые слова pure и impure  обозначают идеальную и неидеальную функции. В отличие от идеальной функции, неидеальная функция может возвращать различные результаты для одинаковых наборов  входных параметров. Например, если входной параметр – глобальная переменная, то она может измениться в момент вызова функции и результат будет отличаться от ожидаемого. Поэтому глобальные переменные не могут быть операндами в идеальных функциях. Примером неидеальной функции является функция Now из пакета STANDARD, которая при вызове возвращает переменную предопределенного типа delay_length, равную текущему моменту времени моделирования. Естественно, что при различных вызовах этой функции она возвращает различные значения.



Содержание раздела