Entity call_pro is
port ( Data: in STD_LOGIC_VECTOR(0 to 7); left_bit: out INTEGER); end call_pro;
Architecture rtl of call_pro is
Procedure l_bit (signal DIN: in STD_LOGIC_VECTOR(0 to 7); signal le_bite: out INTEGER) is variable temp: integer; Begin temp:= 0; For i in 0 to 7 loop if (DIN(i) = '1') then temp:= temp + 1; end if; end loop; le_bite <= temp; end l_bit;
signal DIN: STD_LOGIC_VECTOR(0 to 7); signal bite1: integer;
Begin DIN <= Data; l_bit(DIN, bite1); --параллельный вызов процедуры с именем l_bit(…) left_bit <= bite1;
end rtl;
Временная диаграмма работы проекта:
Этот проект реализует подсчет количества единиц содержащихся в слове длиной 1 байт при помощи подпрограммы процедуры l_bit(…..). Определение подпрограммы процедуры l_bit(…..) расположено в разделе объявлений тела архитектуры. В разделе выполняемых операторов используется оператор параллельного вызова определения процедуры. Процедура l_bit(…..) запускается на исполнение при любом изменении значения ее входного формального (фактического) параметра DIN. В конце своей работы процедура l_bit(…..) возвращает значение своего выходного формального параметра le_bite в оператор вызова (в раздел выполняемых операторов) на место фактического параметра bite1. В результате такого возврата значение параметра bite1 становится известным разделу выполняемых операторов тела архитектуры и, следовательно, его можно использовать при формировании других операторов тела архитектуры. Таким образом, оператор параллельного вызова определения процедуры всегдабудет запускать на исполнение определение своей процедуры, как только претерпит изменение любой из ее входных фактических параметров.
Пример оформления оператора последовательного вызова подпрограммы процедуры: library IEEE; use IEEE.STD_LOGIC_1164. all;
Entity call_pro is port ( Data: in STD_LOGIC_VECTOR(7 downto 0); left_bit: out INTEGER); end call_pro;
Architecture rtl of call_pro is
procedure l_bit (signal DIN: in STD_LOGIC_VECTOR(7 downto 0); Signal le_bite: out INTEGER) is
variable temp: integer;
Begin temp:= 0; for i in 0 to 7 loop if (DIN(i) = '1') then temp:= i;
end if; end loop; le_bite <= temp; end l_bit;
signal DIN: STD_LOGIC_VECTOR(7 downto 0); signal bite1: integer;
Begin DIN <= Data; Process (Din) Begin l_bit(DIN, bite1); --последовательный вызов процедуры с именем --l_bit(…) end process;
left_bit <= bite1; end rtl;
Временная диаграмма работы проекта:
Этот проект определяет номер самого старшего разряда содержащего 1 в слове длиной 1 байт при помощи подпрограммы процедуры l_bit(…..). Определение подпрограммы процедуры l_bit(…..) расположено в разделе объявлений тела архитектуры. В разделе выполняемых операторов используется оператор последовательного вызова определения процедуры, так как он расположен в теле оператора process(Din). Определение Процедуры l_bit(…..) запускается на исполнение при любом изменении значения ее входного фактического параметра DIN, который содержится также в списке чувствительности оператора process(Din). Следовательно, определение процедуры l_bit(…..) будет запущено на исполнение только в случае активизации оператора process(Din). В конце своей работы процедура l_bit(…..) возвращает значение своего выходного формального параметра le_bite в оператор вызова (в раздел выполняемых операторов тела оператора process(Din)) на место фактического параметра bite1. В результате такого возврата значение параметра bite1 становится известным разделу выполняемых операторов тела архитектуры и, следовательно, его можно использовать при формировании других операторов тела архитектуры. Таким образом, оператор последовательного вызова определения процедуры всегдабудет запускать на исполнение определение своей процедуры, как только претерпит изменение любой из ее входных сигналов списка чувствительности оператора process(…).
ПЕРЕГРУЖЕННЫЕ ПРОЦЕДУРЫ (OVERLOADED PROCEDURES) Перегружаемые процедуры – это процедуры с тем же самым именем, но с различным количеством или различными типами формальных параметров. Фактические параметры решают, какая перегружаемая процедура, будет вызываться.
Примеры Перегружаемых процедур: Example 1: procedure Calculate (W1,W2: in Real; signal Out1: inout Integer); procedure Calculate (W1,W2: in Integer; signal Out1: inout Real); -- calling of overloaded procedures: Calculate(23.76, 1.632, Sign1); Calculate(23, 826, Sign2);В этом примере показаны вызовы перегружаемой процедуры Calculate - поскольку формальные параметры в заголовках процедур имеют различные типы. Только, когда процедура вызывается, Simulator определяет, какая версия процедуры должна использоваться, в зависимости от фактических параметров. Важные примечания: · Объявление Процедуры факультативно - определение процедуры может существовать без него. Если, однако, объявление процедуры используется, то определение процедуры должно быть ему обязательно сопоставлено. · Подпрограммы (процедуры) могут быть вложены. · Подпрограммы (процедуры) могут вызываться рекурсивно. · Инструментальные средства Синтеза обычно поддерживают процедуры, пока они не содержат оператора wait. · Подпрограммы процедуры в теле своего определения могут содержать простые операторы назначения значения сигналу. Идентификатор сигнала, которому назначается значение должен присутствовать в списке формальных параметров и причем сигнал должен иметь режим out или inout · В разделе объявлений определения подпрограммы процедуры нельзя объявлять новые программные величины типа signal · Объявления и определения подпрограмм процедур можно располагать в пакетах. Для обращения (вызова) к такой подпрограмме процедуре в проекте требуется указывать имя соответствующей библиотеки и пакета. · Идентификаторы формальных параметров подпрограмм процедур специально в разделе объявлений тела архитектуры объявлять не обязательно · Идентификаторы фактических параметров подпрограмм процедур должны быть специально объявлены в разделе объявлений тела архитектуры · Имена формальных и фактических параметров подпрограмм процедур могут совпадать
- - - - - - - - - - - - - --- - - - - - - - - - - --------------------------------------------------------------- В заключение приведем пример VHDL проектов в описании, которых используются подпрограммы процедуры. VHDL проекты дают возможность вычислить номер старшей позиции в слове длиной байт, которая содержит 1.
Вариант 1: (Параллельный вызов подпрограммы процедуры)
library IEEE; use IEEE.STD_LOGIC_1164.all;
|