Куланов В.А.
[v.kulanov@csn.khai.edu]
Подпрограммы.
Функции в языке VHDL
«Технологии проектирования
компьютерных систем»
Функции
 Не является самодостаточной структурной единицей:
• В отличие от процедур функции возвращают результат,
используемый в выражениях, в состав которых включен
вызов этой функции
• тело функции должно содержать как минимум один
оператор RETURN
 Возвращают только одно единственное значение:
• возможно обойти это ограничение за счет использования
записей (RECORD), т.е. функция может возвращать
запись, поля которой инициализированы
множественными значениями
 Включает две составляющие:
• декларация функции
• вызов функции
Декларация функции в VHDL
[PURE|IMPURE]
FUNCTION name[(parameters_list)] RETURN type_mark IS
{subprogram_declarative_item}
BEGIN
{sequential_statement}
END [FUNCTION] [name];
SIGNAL, FILE, TYPE,
SUBTYPE, PROCEDURE,
FUNCTION, VARIABLE,
CONSTANT, ...-- последовательные операторы
a := 5
FOR … LOOP … END LOOP;
...
IF … THEN … ELSE … END IF;
Формальные
параметры
Можетлифункцияиметь
«побочныйэффект»?
(поумолчанию-PURE)
Тип возвращаемого
значения
Имя функции:
 Идентификатор
 Операторный символ («+», «*»)
project_pkg.vhd
n_reg.vhd
Объявление функций
-- USE work.project_pkg;
ENTITY reg_file IS
GENERIC (...);
PORT (...);
END ENTITY n_reg;
ARCHITECTURE rtl OF reg_file IS
BEGIN
PROCESS(...)
BEGIN
...
END PROCESS;
...
END;
FUNCTION inc(SIGNAL val: INTEGER; step: INTEGER := 1)
RETURN INTEGER IS
BEGIN
RETURN val + step;
END FUNCTION inc;
...
PACKAGE project_pkg IS
...
-- прототип функции
FUNCTION inc(SIGNAL a: INTEGER;
step: INTEGER := 1)
RETURN INTEGER;
...
END PACKAGE project_pkg;
PACKAGE BODY project_pkg IS
END PACKAGE BODY project_pkg;
...
...
Формальные параметры функции
...FUNCTION name[(parameter_list)] RETURN...IS
([CONSTANT|SIGNAL|FILE] identifier {,…}:
type_indication [:= expression] {;…})
Имя/Идентификатор
параметра
Класс параметра,
CONSTANT по умолчанию
(если класс явно не задан)
Тип параметра Значение по умолчанию
FUNCTION inc (a: BIT_VECTOR; step: INTEGER := 1) RETURN BIT_VECTOR;
FUNCTION "*" (a, b: fruits) RETURN fruits;
FUNCTION add_signals (SIGNAL in1, in2: REAL) RETURN REAL;
TYPE int_data IS FILE OF NATURAL;
FUNCTION end_of_file (FILE file_name: int_data) RETURN BOOLEAN;
Вызов функции в VHDL
 Вызов функции в исходном коде всегда является частью
выражения (операции присваивания, условные операторы и
т.д.): ... name[(parameter_list)] ...
Список фактических параметров
([parameter_name =>] expression|identifier|OPEN, {…})
Формальный параметр
Два типа сопоставления:
 Именованное (=>)
 Позиционное
Фактический параметр
 выражение (константное значение)
 имя/идентификатор сигнала, константы, файлового дескриптора
 OPEN – параметр не используется или используется значение по
умолчанию
Формальные параметры функции
 Если используется смешанный тип сопоставления параметров
тогда, именованное сопоставление в списке параметров
должно всегда быть последним:
 Каждый формальный параметр представляет собой
объявление (декларацию) объекта, который является
локальным для функции
 Тип формального параметров должен быть объявлен заранее
 Передаваемые в функцию сигналы-параметры не могут быть
изменены:
• все параметры функции имеют режим направления
передачи параметров вида IN
result = do_smth(good, more => 1, even_more => 2);
result = do_smth(bad, more => 1, 2); -- нарушен порядок
Функции в VHDL
 В качестве формальных параметров функции могут
выступать массивы неограниченной длины:
• при вызове функции массивы должны быть ограничены
заданным диапазоном
 Функции могут быть вложенными
 Функции поддерживают рекурсивный вызов
 Могут быть «перегружены»
 Реализуют исключительно комбинационную логику
 Возможен вызов функции-конвертера при связывании
портов компонентов (оператор PORT MAP)
FUNCTION parity (X: STD_LOGIC_VECTOR) RETURN STD_LOGIC;
VARIABLE reg: STD_LOGIC_VECTOR(0 TO N - 1);
VARIABLE p: STD_LOGIC;
...
p := parity(reg);
Функции в VHDL
 Тело функции должно содержать как минимум один оператор
RETURN:
[label:] RETURN expression;
Метка Возвращаемое значение
 Тело функции НЕ должно содержать оператор присваивания
значения сигналу (<=) и оператор ожидания WAIT
 В теле функции нельзя вызывать процедуру, в теле которой
находится оператор ожидания WAIT
 В декларативной части функции могут быть объявлены
«локальные» переменные (VARIABLE), значение которых
инициализируется заново при каждом новом вызове
функции
Функции в VHDL
ENTITY func_demo IS
PORT(A : IN STD_LOGIC_VECTOR(0 TO 1);
result : OUT STD_LOGIC);
END ENTITY func_demo;
ARCHITECTURE rtl OF func_demo IS
FUNCTION convert (val: STD_LOGIC_VECTOR(0 TO 1))
RETURN STD_LOGIC IS
BEGIN
CASE val IS
WHEN "00" | "11" => RETURN '0';
WHEN OTHERS => RETURN '1';
END CASE;
END convert;
BEGIN
result <= convert(a);
END ARCHITECTURE rtl;
xor_gate
xor_gate
xor_gate
Функции в VHDL
...
data : in std_logic_vector(N-1 downto 0);
p : out std_logic
...
FUNCTION parity(invec : STD_LOGIC_VECTOR)
RETURN STD_LOGIC IS
VARIABLE parity_v : STD_LOGIC := '0';
BEGIN
FOR i IN invec'range LOOP
parity_v := parity_v XOR invec(i);
END LOOP;
RETURN parity_v;
END FUNCTION parity;
N = 4
Функции в VHDL
N = 3
ARCHITECTURE rtl OF reg_n IS
FUNCTION parity(invec : STD_LOGIC_VECTOR)
RETURN STD_LOGIC IS
...
SIGNAL p_en: STD_LOGIC;
BEGIN
p_en <= parity(data);
reg : PROCESS (clk) IS
BEGIN
IF rising_edge(clk) THEN
IF p_en = '1' THEN
q <= data;
END IF;
END IF;
END PROCESS reg;
END ARCHITECTURE rtl;
Функции в VHDL
FUNCTION rising_edge (SIGNAL s : STD_ULOGIC)
RETURN BOOLEAN IS
BEGIN
RETURN (s'EVENT AND (To_X01(s) = '1') AND
(To_X01(s'LAST_VALUE) = '0'));
END;
FUNCTION To_X01 (s : STD_ULOGIC) RETURN X01 IS
BEGIN
RETURN (cvt_to_x01(s));
END;
-- ('X','0','1')
SUBTYPE X01 IS RESOLVED STD_ULOGIC RANGE 'X' TO '1';
TYPE logic_x01_table IS ARRAY
(std_ulogic'LOW TO std_ulogic'HIGH) OF X01;
CONSTANT cvt_to_x01 : logic_x01_table := (
-- 'U' 'X' '0' '1' 'Z' 'W' 'L' 'H' '-'
'X', 'X', '0', '1', 'X', 'X', '0', '1', 'X'
);
Функции-преобразователи
FUNCTION to_bitvector(svalue: STD_LOGIC_VECTOR)
RETURN BIT_VECTOR IS
VARIABLE outvalue: BIT_VECTOR(svalue'length-1 DOWNTO 0);
BEGIN
FOR i IN svalue'range LOOP
CASE svalue(i) IS
WHEN '0' => outvalue(i) := '0';
WHEN '1' => outvalue(i) := '1';
WHEN OTHERS => outvalue(i) := '0';
END CASE;
END LOOP;
RETURN outvalue;
END FUNCTION to_bitvector;
...
VARIABLE reg: STD_LOGIC_VECTOR(15 DOWNTO 0);
...
res <= to_bitvector(reg);
...
Перегрузка операторных символов
TYPE ppap IS (APPLE, PEN, PINEAPPLE, APPLE_PEN,
PINEAPPLE_PEN, PEN_PINEAPPLE_APPLE_PEN, NONE);
FUNCTION "+"(L: ppap; R: ppap) RETURN ppap IS
BEGIN
IF L = APPLE AND R = PEN THEN
RETURN APPLE_PEN;
ELSIF L = PEN AND R = PINEAPPLE THEN
return PINEAPPLE_PEN;
ELSIF L = APPLE_PEN AND R = PINEAPPLE_PEN THEN
RETURN PEN_PINEAPPLE_APPLE_PEN;
ELSE
REPORT "Can't be Uhh...";
RETURN NONE;
END IF;
END;
Перегрузка операторных символов
ppap_proc : PROCESS IS
VARIABLE a, b, c: ppap;
BEGIN
a := APPLE; b := PEN;
c := a + b;
REPORT "c IS " & ppap'image(c);
WAIT FOR 100 ns;
a := PEN; b := PINEAPPLE;
c := a + b;
REPORT "c IS " & ppap'image(c);
WAIT FOR 100 ns;
a := APPLE_PEN;
b := PINEAPPLE_PEN;
c := a + b;
REPORT "c IS " & ppap'image(c);
WAIT FOR 100 ns;
END PROCESS ppap_proc;
+ =
Функции вида PURE|IMPURE
 Функции вида PURE:
• всегда возвращают один и тот же результат, когда
осуществляется их вызов с одними и теми же значениями
параметров
• по умолчанию все функции в VHDL относятся к классу PURE,
если не указано иного с помощью ключевого слова IMPURE
 Функции вида IMPURE:
• могут возвращать разные значения даже если вызов
функции осуществляется с одними и тем же значениями
параметров («побочные эффекты», «side effects»)
• все сигналы (внешние – секция PORT и внутренние –
декларативная часть архитектурного тела SIGNAL),
объявленные в исходном коде файла проекта «видны» в
теле функции
Функции вида IMPURE
demo : PROCESS IS
VARIABLE number : INTEGER := 1;
VARIABLE foo, bar : INTEGER := 0;
IMPURE FUNCTION side_effect(a : INTEGER)
RETURN INTEGER IS
VARIABLE counter : INTEGER;
BEGIN
counter := a * number;
number := number + 1;
RETURN COUNTER;
END side_effect;
BEGIN
foo := 5;
bar := side_effect(foo); -- 5 * 1 = 5
WAIT FOR 100 ns;
number := 5;
bar := side_effect(foo); -- 5 * 5 = 25
WAIT FOR 100 ns;
END PROCESS demo;
Функции разрешения
 Функция разрешения позволяет нескольким источникам
(значениям) управлять одним сигналом одновременно:
• шины , которые соединяют несколько источников данных
 Функция разрешения должна быть вида PURE
 Функция разрешения должна выполнять ассоциативные
операции, чтобы порядок, в котором рассматриваются
драйверы множества сигналов, не влиял на разрешенное
значение сигнала
Функции разрешения
FUNCTION wire_or(sbus: STD_ULOGIC_VECTOR)
RETURN STD_ULOGIC IS
BEGIN
FOR i IN sbus'range LOOP
IF sbus(i) = '1' THEN
RETURN '1';
END IF;
END LOOP;
RETURN '0';
END FUNCTION wire_or;
...
...
SUBTYPE wire_or_logic IS wire_or STD_ULOGIC;
SIGNAL error_bus: wire_or_logic;
...
Функция разрешения
Базовый тип
Функции разрешения
ARCHITECTURE multi_rtl OF multi_chip IS
...
SUBTYPE wire_or_logic IS wire_or STD_ULOGIC;
SIGNAL error_bus: wire_or_logic;
...
BEGIN
chip1 : PROCESS IS
BEGIN
...
error_bus <= '1' AFTER 2 ns;
...
END PROCESS chip1;
chip2 : PROCESS IS
BEGIN
...
error_bus <= '0' AFTER 2 ns;
...
END PROCESS chip2;
END ARCHITECTURE multi_rtl;
Функции разрешения в IEEE 1164
-- декларация перечислимого типа STD_ULOGIC
TYPE STD_ULOGIC IS ( 'U', -- Uninitialized
'X', -- Forcing Unknown
'0', -- Forcing 0
'1', -- Forcing 1
'Z', -- High Impedance
'W', -- Weak Unknown
'L', -- Weak 0
'H', -- Weak 1
'-' -- Don't care);
-- Функция "разрешения" STD_LOGIC
FUNCTION resolved (s: STD_ULOGIC_VECTOR) RETURN STD_ULOGIC;
-- декларация типа (подтипа) STD_LOGIC
-- на основе базового типа STD_ULOGIC
SUBTYPE std_logic IS resolved STD_ULOGIC;
Функции разрешения в IEEE 1164
FUNCTION resolved (s : std_ulogic_vector)
RETURN std_ulogic IS
VARIABLE result: std_ulogic := 'Z'; -- weakest state default
BEGIN
-- the test for a single driver is essential otherwise the
-- loop would return 'X' for a single driver of '-' and that
-- would conflict with the value of a single driver unresolved
-- signal.
IF (s'LENGTH = 1) THEN
RETURN s(s'LOW);
ELSE
FOR i IN s'RANGE LOOP
result := resolution_table(result, s(i));
END LOOP;
END IF;
RETURN result;
END resolved;
Функции разрешения в IEEE 1164
TYPE stdlogic_table IS ARRAY(std_ulogic, std_ulogic) OF std_ulogic;
CONSTANT resolution_table : stdlogic_table := (
-----------------------------------------------------------
--| U X 0 1 Z W L H - | |
-----------------------------------------------------------
( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |
( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |
( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |
( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |
( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- | - |
);
Subprograms in VHDL, Functions in VHDL

Subprograms in VHDL, Functions in VHDL

  • 1.
    Куланов В.А. [v.kulanov@csn.khai.edu] Подпрограммы. Функции вязыке VHDL «Технологии проектирования компьютерных систем»
  • 2.
    Функции  Не являетсясамодостаточной структурной единицей: • В отличие от процедур функции возвращают результат, используемый в выражениях, в состав которых включен вызов этой функции • тело функции должно содержать как минимум один оператор RETURN  Возвращают только одно единственное значение: • возможно обойти это ограничение за счет использования записей (RECORD), т.е. функция может возвращать запись, поля которой инициализированы множественными значениями  Включает две составляющие: • декларация функции • вызов функции
  • 3.
    Декларация функции вVHDL [PURE|IMPURE] FUNCTION name[(parameters_list)] RETURN type_mark IS {subprogram_declarative_item} BEGIN {sequential_statement} END [FUNCTION] [name]; SIGNAL, FILE, TYPE, SUBTYPE, PROCEDURE, FUNCTION, VARIABLE, CONSTANT, ...-- последовательные операторы a := 5 FOR … LOOP … END LOOP; ... IF … THEN … ELSE … END IF; Формальные параметры Можетлифункцияиметь «побочныйэффект»? (поумолчанию-PURE) Тип возвращаемого значения Имя функции:  Идентификатор  Операторный символ («+», «*»)
  • 4.
    project_pkg.vhd n_reg.vhd Объявление функций -- USEwork.project_pkg; ENTITY reg_file IS GENERIC (...); PORT (...); END ENTITY n_reg; ARCHITECTURE rtl OF reg_file IS BEGIN PROCESS(...) BEGIN ... END PROCESS; ... END; FUNCTION inc(SIGNAL val: INTEGER; step: INTEGER := 1) RETURN INTEGER IS BEGIN RETURN val + step; END FUNCTION inc; ... PACKAGE project_pkg IS ... -- прототип функции FUNCTION inc(SIGNAL a: INTEGER; step: INTEGER := 1) RETURN INTEGER; ... END PACKAGE project_pkg; PACKAGE BODY project_pkg IS END PACKAGE BODY project_pkg; ... ...
  • 5.
    Формальные параметры функции ...FUNCTIONname[(parameter_list)] RETURN...IS ([CONSTANT|SIGNAL|FILE] identifier {,…}: type_indication [:= expression] {;…}) Имя/Идентификатор параметра Класс параметра, CONSTANT по умолчанию (если класс явно не задан) Тип параметра Значение по умолчанию FUNCTION inc (a: BIT_VECTOR; step: INTEGER := 1) RETURN BIT_VECTOR; FUNCTION "*" (a, b: fruits) RETURN fruits; FUNCTION add_signals (SIGNAL in1, in2: REAL) RETURN REAL; TYPE int_data IS FILE OF NATURAL; FUNCTION end_of_file (FILE file_name: int_data) RETURN BOOLEAN;
  • 6.
    Вызов функции вVHDL  Вызов функции в исходном коде всегда является частью выражения (операции присваивания, условные операторы и т.д.): ... name[(parameter_list)] ... Список фактических параметров ([parameter_name =>] expression|identifier|OPEN, {…}) Формальный параметр Два типа сопоставления:  Именованное (=>)  Позиционное Фактический параметр  выражение (константное значение)  имя/идентификатор сигнала, константы, файлового дескриптора  OPEN – параметр не используется или используется значение по умолчанию
  • 7.
    Формальные параметры функции Если используется смешанный тип сопоставления параметров тогда, именованное сопоставление в списке параметров должно всегда быть последним:  Каждый формальный параметр представляет собой объявление (декларацию) объекта, который является локальным для функции  Тип формального параметров должен быть объявлен заранее  Передаваемые в функцию сигналы-параметры не могут быть изменены: • все параметры функции имеют режим направления передачи параметров вида IN result = do_smth(good, more => 1, even_more => 2); result = do_smth(bad, more => 1, 2); -- нарушен порядок
  • 8.
    Функции в VHDL В качестве формальных параметров функции могут выступать массивы неограниченной длины: • при вызове функции массивы должны быть ограничены заданным диапазоном  Функции могут быть вложенными  Функции поддерживают рекурсивный вызов  Могут быть «перегружены»  Реализуют исключительно комбинационную логику  Возможен вызов функции-конвертера при связывании портов компонентов (оператор PORT MAP) FUNCTION parity (X: STD_LOGIC_VECTOR) RETURN STD_LOGIC; VARIABLE reg: STD_LOGIC_VECTOR(0 TO N - 1); VARIABLE p: STD_LOGIC; ... p := parity(reg);
  • 9.
    Функции в VHDL Тело функции должно содержать как минимум один оператор RETURN: [label:] RETURN expression; Метка Возвращаемое значение  Тело функции НЕ должно содержать оператор присваивания значения сигналу (<=) и оператор ожидания WAIT  В теле функции нельзя вызывать процедуру, в теле которой находится оператор ожидания WAIT  В декларативной части функции могут быть объявлены «локальные» переменные (VARIABLE), значение которых инициализируется заново при каждом новом вызове функции
  • 10.
    Функции в VHDL ENTITYfunc_demo IS PORT(A : IN STD_LOGIC_VECTOR(0 TO 1); result : OUT STD_LOGIC); END ENTITY func_demo; ARCHITECTURE rtl OF func_demo IS FUNCTION convert (val: STD_LOGIC_VECTOR(0 TO 1)) RETURN STD_LOGIC IS BEGIN CASE val IS WHEN "00" | "11" => RETURN '0'; WHEN OTHERS => RETURN '1'; END CASE; END convert; BEGIN result <= convert(a); END ARCHITECTURE rtl; xor_gate xor_gate xor_gate
  • 11.
    Функции в VHDL ... data: in std_logic_vector(N-1 downto 0); p : out std_logic ... FUNCTION parity(invec : STD_LOGIC_VECTOR) RETURN STD_LOGIC IS VARIABLE parity_v : STD_LOGIC := '0'; BEGIN FOR i IN invec'range LOOP parity_v := parity_v XOR invec(i); END LOOP; RETURN parity_v; END FUNCTION parity; N = 4
  • 12.
    Функции в VHDL N= 3 ARCHITECTURE rtl OF reg_n IS FUNCTION parity(invec : STD_LOGIC_VECTOR) RETURN STD_LOGIC IS ... SIGNAL p_en: STD_LOGIC; BEGIN p_en <= parity(data); reg : PROCESS (clk) IS BEGIN IF rising_edge(clk) THEN IF p_en = '1' THEN q <= data; END IF; END IF; END PROCESS reg; END ARCHITECTURE rtl;
  • 13.
    Функции в VHDL FUNCTIONrising_edge (SIGNAL s : STD_ULOGIC) RETURN BOOLEAN IS BEGIN RETURN (s'EVENT AND (To_X01(s) = '1') AND (To_X01(s'LAST_VALUE) = '0')); END; FUNCTION To_X01 (s : STD_ULOGIC) RETURN X01 IS BEGIN RETURN (cvt_to_x01(s)); END; -- ('X','0','1') SUBTYPE X01 IS RESOLVED STD_ULOGIC RANGE 'X' TO '1'; TYPE logic_x01_table IS ARRAY (std_ulogic'LOW TO std_ulogic'HIGH) OF X01; CONSTANT cvt_to_x01 : logic_x01_table := ( -- 'U' 'X' '0' '1' 'Z' 'W' 'L' 'H' '-' 'X', 'X', '0', '1', 'X', 'X', '0', '1', 'X' );
  • 14.
    Функции-преобразователи FUNCTION to_bitvector(svalue: STD_LOGIC_VECTOR) RETURNBIT_VECTOR IS VARIABLE outvalue: BIT_VECTOR(svalue'length-1 DOWNTO 0); BEGIN FOR i IN svalue'range LOOP CASE svalue(i) IS WHEN '0' => outvalue(i) := '0'; WHEN '1' => outvalue(i) := '1'; WHEN OTHERS => outvalue(i) := '0'; END CASE; END LOOP; RETURN outvalue; END FUNCTION to_bitvector; ... VARIABLE reg: STD_LOGIC_VECTOR(15 DOWNTO 0); ... res <= to_bitvector(reg); ...
  • 15.
    Перегрузка операторных символов TYPEppap IS (APPLE, PEN, PINEAPPLE, APPLE_PEN, PINEAPPLE_PEN, PEN_PINEAPPLE_APPLE_PEN, NONE); FUNCTION "+"(L: ppap; R: ppap) RETURN ppap IS BEGIN IF L = APPLE AND R = PEN THEN RETURN APPLE_PEN; ELSIF L = PEN AND R = PINEAPPLE THEN return PINEAPPLE_PEN; ELSIF L = APPLE_PEN AND R = PINEAPPLE_PEN THEN RETURN PEN_PINEAPPLE_APPLE_PEN; ELSE REPORT "Can't be Uhh..."; RETURN NONE; END IF; END;
  • 16.
    Перегрузка операторных символов ppap_proc: PROCESS IS VARIABLE a, b, c: ppap; BEGIN a := APPLE; b := PEN; c := a + b; REPORT "c IS " & ppap'image(c); WAIT FOR 100 ns; a := PEN; b := PINEAPPLE; c := a + b; REPORT "c IS " & ppap'image(c); WAIT FOR 100 ns; a := APPLE_PEN; b := PINEAPPLE_PEN; c := a + b; REPORT "c IS " & ppap'image(c); WAIT FOR 100 ns; END PROCESS ppap_proc; + =
  • 17.
    Функции вида PURE|IMPURE Функции вида PURE: • всегда возвращают один и тот же результат, когда осуществляется их вызов с одними и теми же значениями параметров • по умолчанию все функции в VHDL относятся к классу PURE, если не указано иного с помощью ключевого слова IMPURE  Функции вида IMPURE: • могут возвращать разные значения даже если вызов функции осуществляется с одними и тем же значениями параметров («побочные эффекты», «side effects») • все сигналы (внешние – секция PORT и внутренние – декларативная часть архитектурного тела SIGNAL), объявленные в исходном коде файла проекта «видны» в теле функции
  • 18.
    Функции вида IMPURE demo: PROCESS IS VARIABLE number : INTEGER := 1; VARIABLE foo, bar : INTEGER := 0; IMPURE FUNCTION side_effect(a : INTEGER) RETURN INTEGER IS VARIABLE counter : INTEGER; BEGIN counter := a * number; number := number + 1; RETURN COUNTER; END side_effect; BEGIN foo := 5; bar := side_effect(foo); -- 5 * 1 = 5 WAIT FOR 100 ns; number := 5; bar := side_effect(foo); -- 5 * 5 = 25 WAIT FOR 100 ns; END PROCESS demo;
  • 19.
    Функции разрешения  Функцияразрешения позволяет нескольким источникам (значениям) управлять одним сигналом одновременно: • шины , которые соединяют несколько источников данных  Функция разрешения должна быть вида PURE  Функция разрешения должна выполнять ассоциативные операции, чтобы порядок, в котором рассматриваются драйверы множества сигналов, не влиял на разрешенное значение сигнала
  • 20.
    Функции разрешения FUNCTION wire_or(sbus:STD_ULOGIC_VECTOR) RETURN STD_ULOGIC IS BEGIN FOR i IN sbus'range LOOP IF sbus(i) = '1' THEN RETURN '1'; END IF; END LOOP; RETURN '0'; END FUNCTION wire_or; ... ... SUBTYPE wire_or_logic IS wire_or STD_ULOGIC; SIGNAL error_bus: wire_or_logic; ... Функция разрешения Базовый тип
  • 21.
    Функции разрешения ARCHITECTURE multi_rtlOF multi_chip IS ... SUBTYPE wire_or_logic IS wire_or STD_ULOGIC; SIGNAL error_bus: wire_or_logic; ... BEGIN chip1 : PROCESS IS BEGIN ... error_bus <= '1' AFTER 2 ns; ... END PROCESS chip1; chip2 : PROCESS IS BEGIN ... error_bus <= '0' AFTER 2 ns; ... END PROCESS chip2; END ARCHITECTURE multi_rtl;
  • 22.
    Функции разрешения вIEEE 1164 -- декларация перечислимого типа STD_ULOGIC TYPE STD_ULOGIC IS ( 'U', -- Uninitialized 'X', -- Forcing Unknown '0', -- Forcing 0 '1', -- Forcing 1 'Z', -- High Impedance 'W', -- Weak Unknown 'L', -- Weak 0 'H', -- Weak 1 '-' -- Don't care); -- Функция "разрешения" STD_LOGIC FUNCTION resolved (s: STD_ULOGIC_VECTOR) RETURN STD_ULOGIC; -- декларация типа (подтипа) STD_LOGIC -- на основе базового типа STD_ULOGIC SUBTYPE std_logic IS resolved STD_ULOGIC;
  • 23.
    Функции разрешения вIEEE 1164 FUNCTION resolved (s : std_ulogic_vector) RETURN std_ulogic IS VARIABLE result: std_ulogic := 'Z'; -- weakest state default BEGIN -- the test for a single driver is essential otherwise the -- loop would return 'X' for a single driver of '-' and that -- would conflict with the value of a single driver unresolved -- signal. IF (s'LENGTH = 1) THEN RETURN s(s'LOW); ELSE FOR i IN s'RANGE LOOP result := resolution_table(result, s(i)); END LOOP; END IF; RETURN result; END resolved;
  • 24.
    Функции разрешения вIEEE 1164 TYPE stdlogic_table IS ARRAY(std_ulogic, std_ulogic) OF std_ulogic; CONSTANT resolution_table : stdlogic_table := ( ----------------------------------------------------------- --| U X 0 1 Z W L H - | | ----------------------------------------------------------- ( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U | ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X | ( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 | ( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 | ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z | ( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W | ( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L | ( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H | ( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- | - | );