«Работать добросовестно — значит: работать, повышая свою квалификацию, проявляя инициативу в совершенствовании продукции, технологий, организации работ, оказывая не предусмотренную должностными инструкциями помощь другим сотрудникам (включая и руководителей) в общей им всем работе.

Проектирование цифровых систем на языках описания аппаратуры/Лекция 6

Материал из Wiki
Перейти к: навигация, поиск
Лекции ПЦСЯОА

Лекции

Практические

Доп. материалы

Заголовок
Функции и процедуры
Автор
Ланкевич Ю.Ю.
Нижний колонтитул
Проектирование цифровых систем на языках описания аппаратуры/Лекция 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;