SlideShare a Scribd company logo
Куланов В.А.
[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

More Related Content

What's hot

апкс 2011 05_verilog
апкс 2011 05_verilogапкс 2011 05_verilog
апкс 2011 05_verilogIrina Hahanova
 
Операторы в Turbo Pascal
Операторы в Turbo PascalОператоры в Turbo Pascal
Операторы в Turbo PascalOlgaDask
 
практика 4
практика 4практика 4
практика 4student_kai
 
22 pascal urok_6
22 pascal urok_622 pascal urok_6
22 pascal urok_6Ann Eres
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
Система дистанционного обучения MyDLS
 
10 10 pascal_urok_
10 10 pascal_urok_10 10 pascal_urok_
10 10 pascal_urok_Ann Eres
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
Olegmingalev1997
 
подпрограммы в языке программирования паскаль
подпрограммы в языке программирования паскальподпрограммы в языке программирования паскаль
подпрограммы в языке программирования паскаль
Artem German
 
4 4 pascal_urok_1
4 4 pascal_urok_14 4 pascal_urok_1
4 4 pascal_urok_1Ann Eres
 
Подпрограммы
ПодпрограммыПодпрограммы
Подпрограммы
Colegiul de Industrie Usoara
 
Типы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотекиТипы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотеки
Ihor Porotikov
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Denis Tsvettsih
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli typesmcroitor
 
этапы написания программы
этапы написания программыэтапы написания программы
этапы написания программыИрина Чернова
 
апкс 2011 02_verilog
апкс 2011 02_verilogапкс 2011 02_verilog
апкс 2011 02_verilogIrina Hahanova
 
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...
Iosif Itkin
 
апкс 2011 04_verilog
апкс 2011 04_verilogапкс 2011 04_verilog
апкс 2011 04_verilogIrina Hahanova
 
Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Ontico
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
Igor Shkulipa
 

What's hot (20)

апкс 2011 05_verilog
апкс 2011 05_verilogапкс 2011 05_verilog
апкс 2011 05_verilog
 
Операторы в Turbo Pascal
Операторы в Turbo PascalОператоры в Turbo Pascal
Операторы в Turbo Pascal
 
практика 4
практика 4практика 4
практика 4
 
22 pascal urok_6
22 pascal urok_622 pascal urok_6
22 pascal urok_6
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
10 10 pascal_urok_
10 10 pascal_urok_10 10 pascal_urok_
10 10 pascal_urok_
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 
подпрограммы в языке программирования паскаль
подпрограммы в языке программирования паскальподпрограммы в языке программирования паскаль
подпрограммы в языке программирования паскаль
 
4 4 pascal_urok_1
4 4 pascal_urok_14 4 pascal_urok_1
4 4 pascal_urok_1
 
Подпрограммы
ПодпрограммыПодпрограммы
Подпрограммы
 
Типы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотекиТипы данных (продолжение). Операторы. Стандартные библиотеки
Типы данных (продолжение). Операторы. Стандартные библиотеки
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli types
 
этапы написания программы
этапы написания программыэтапы написания программы
этапы написания программы
 
апкс 2011 02_verilog
апкс 2011 02_verilogапкс 2011 02_verilog
апкс 2011 02_verilog
 
лек9 10
лек9 10лек9 10
лек9 10
 
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Ana...
 
апкс 2011 04_verilog
апкс 2011 04_verilogапкс 2011 04_verilog
апкс 2011 04_verilog
 
Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 

Similar to Subprograms in VHDL, Functions in VHDL

Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
OdessaFrontend
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
Yandex
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
Yandex
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
Igor Shkulipa
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
Stfalcon Meetups
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Functional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalFunctional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalAndrei Solntsev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
etyumentcev
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Timur Safin
 
вспомогательные алгоритмы
вспомогательные алгоритмывспомогательные алгоритмы
вспомогательные алгоритмыЕлена Ключева
 
Повышение конверсии через оптимизацию JS
Повышение конверсии через оптимизацию JSПовышение конверсии через оптимизацию JS
Повышение конверсии через оптимизацию JS
Антон Плешивцев
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
mcroitor
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)Mikhail Davydov
 
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей ВасилийSolit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
solit
 

Similar to Subprograms in VHDL, Functions in VHDL (20)

Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
Функциональное программирование с использованием библиотеки fp-ts | Odessa Fr...
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 
Михаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajaxМихаил Давыдов - Транспорт, ajax
Михаил Давыдов - Транспорт, ajax
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
Discovering Lambdas in Java 8
Discovering Lambdas in Java 8Discovering Lambdas in Java 8
Discovering Lambdas in Java 8
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Functional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalFunctional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - final
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
 
вспомогательные алгоритмы
вспомогательные алгоритмывспомогательные алгоритмы
вспомогательные алгоритмы
 
Discovering Lambdas (Speech)
Discovering Lambdas (Speech)Discovering Lambdas (Speech)
Discovering Lambdas (Speech)
 
Повышение конверсии через оптимизацию JS
Повышение конверсии через оптимизацию JSПовышение конверсии через оптимизацию JS
Повышение конверсии через оптимизацию JS
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
 
Scala lecture #4
Scala lecture #4Scala lecture #4
Scala lecture #4
 
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей ВасилийSolit 2014, Минусы ООП на примере языка PHP, Соловей Василий
Solit 2014, Минусы ООП на примере языка PHP, Соловей Василий
 

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 Объявление функций -- 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; ... ...
  • 5. Формальные параметры функции ...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;
  • 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 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
  • 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 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' );
  • 14. Функции-преобразователи 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); ...
  • 15. Перегрузка операторных символов 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;
  • 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_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;
  • 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' ) -- | - | );