Проектирование цифровых систем на языках описания аппаратуры/Лекция 6
- Заголовок
- Функции и процедуры
- Автор
- Ланкевич Ю.Ю.
- Нижний колонтитул
- Проектирование цифровых систем на языках описания аппаратуры/Лекция 6
- Дополнительный нижний колонтитул
- Ланкевич Ю.Ю., 02:58, 28 сентября 2020
Содержание |
Слайд:Подпрограммы
Определение.
subprogram_specification ::= procedure designator [ ( formal_parameter_list ) ] | [ pure | impure ] function designator [(formal_parameter_list) ] return type_mark
Подпрограммы имеют две формы – функции и процедуры. Вызов процедуры есть оператор, в то время как вызов функции возвращает значение в выражении. Указателем функции (операторным символом) может быть идентификатор или строковый литерал. Заметим, что строковый литерал не может быть именем процедуры. Подпрограммы могут быть декларированы в тексте пакета, интерфейсе объекта проекта, архитектурном теле, процессе, процедуре или функции. Подпрограммы могут вызывать другие подпрограммы. Примеры подпрограмм уже приводились и будут даны далее.
Слайд:Функции
Общий вид оператора декларации функции
[pure | impure] function имя функции (параметр {, параметр} ) return тип возвращаемого функцией значения is раздел деклараций begin тело функции end [имя функции];
Общий вид оператора вызова функции
имя функции ( фактический параметр {, фактический параметр} );
Функция имеет только входные параметры. Следующий иллюстративный пример показывает (декларирует) функцию BOOL_TO_SL, преобразующую тип BOOLEAN в тип STD_ULOGIC.
Пример.
function BOOL_TO_SL(X : boolean) return std_ulogic is begin if X then return '1'; else return '0'; end if; end BOOL_TO_SL;
Следующий пример показывает функцию преобразования типа bit в тип boolean. Напомним, что данные типы не эквивалентны.
function bit_bool (inp_bit : in bit) return boolean is begin if (inp_bit = '1') then return true; else return false; end if; end bit_bool;
Функция может содержать последовательные операторы, исключая операторы ожидания и назначения сигналов. В теле функции могут декларироваться локальные переменные.
Слайд:Процедуры
Общий вид оператора декларации процедуры
procedure имя процедуры ( параметр {, параметр} ) is раздел деклараций begin тело процедуры end [имя процедуры];
Процедура может иметь входные (in), выходные (out) и вход/выходные (inout) параметры.
Это могут быть сигналы, переменные или константы. По умолчанию входные параметры – константы, выходные и вход/выходные параметры – переменные.
Общий вид оператора вызова процедуры
имя процедуры ( фактический параметр {, фактический параметр} );
Таким образом, вызов процедуры состоит из имени процедуры и списка фактических параметров. Процедуры могут вызываться последовательно или параллельно. При параллельном вызове происходит выполнение процедуры, когда какой-нибудь входной вход/выходной параметр изменился. VHDL-код с текстом подпрограммы, т.е. функции или процедуры может находится в разделе деклараций архитектурного тела, либо в пакете. Если подпрограмма определена в пакете, то текст подпрограммы должен быть в теле пакета. Если подпрограмма находится в пакете, то в этом случае перед текстом entity, где процедура используется (процедуры могут использоваться в архитектурных телах), требуется указание имени библиотеки и имени пакета, в котором содержится текст подпрограммы.
Слайд:Процедуры
Следующий пример процедуры PARITY показывает отличия процедуры от функции: функция имеет только входные параметры, режим (mode) которых не специфицируется, в процедуре могут содержаться операторы назначения сигналов.
procedure PARITY ( signal X : in std_ulogic_vector; signal Y : out std_ulogic) is variable TMP : std_ulogic := '0'; begin for J in X'range loop TMP := TMP xor X(J); end loop; Y <= TMP; -- в процедуре могут быть операторы назначения сигналов end PARITY;
Следующий пример показывает процедуру DISPLAY_MUX и ее вызов в архитектурном теле SUBPROG.
procedure DISPLAY_MUX ( ALARM_TIME, CURRENT_TIME : in digit; SHOW_A : in std_ulogic; signal DISPLAY_TIME : out digit) is begin if (SHOW_A = '1') then DISPLAY_TIME <= ALARM_TIME; else DISPLAY_TIME <= CURRENT_TIME; end if; end DISPLAY_MUX; architecture SUBPROG of DISP_MUX is ... begin -- вызов процедуры DISPLAY_MUX (ALARM_TIME, CURRENT_TIME, SHOW_A, DISPLAY_TIME); end SUBPROG;