Пример процедуры VHDL: инкремент std_logic_vector
Что такое процедура VHDL?
Процедуры принадлежат к семейству подпрограмм в VHDL. Они инкапсулируют повторно используемую логику, уменьшая дублирование кода и улучшая поддерживаемость. Определив процедуру один раз, вы можете вызывать её из нескольких процессов или архитектур, обеспечивая согласованное поведение.
Пример: инкремент std_logic_vector
Следующий пример демонстрирует процедуру, которая принимает 8-битный std_logic_vector, добавляет единицу и возвращает результат. Процедура также включает 1-нс ожидание для иллюстрации управления временем в тестбенче.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity example_procedure_simple is end example_procedure_simple; architecture behave of ex_procedure_simple is signal r_TEST : std_logic_vector(7 downto 0) := X"42"; -- Purpose: Increments a std_logic_vector by 1 procedure p_INCREMENT_SLV ( signal r_IN : in std_logic_vector(7 downto 0); signal r_OUT : out std_logic_vector(7 downto 0) ) is begin r_OUT <= std_logic_vector(unsigned(r_IN) + 1); wait for 1 ns; -- Wait is OK here. end p_INCREMENT_SLV; begin process is begin wait for 10 ns; p_INCREMENT_SLV(r_TEST, r_TEST); wait for 10 ns; p_INCREMENT_SLV(r_TEST, r_TEST); wait for 10 ns; p_INCREMENT_SLV(r_TEST, r_TEST); wait; end process; end behave;
Зачем включать оператор Wait?
Операторы wait допустимы внутри процедуры, если вызывающий процесс не имеет списка чувствительности. Эта особенность особенно полезна в тестбенчах, где может потребоваться ввести детерминированные задержки без загромождения основного процесса.
Ключевые выводы
- Процедуры могут иметь как IN, так и OUT сигналы.
- Они идеальны для общих операций вроде арифметики над std_logic_vector.
- Использование wait внутри процедуры сохраняет логику тестбенча чистой.
VHDL
- Введение в VHDL: создание вашего первого И-шлюза
- Полное руководство по преобразованию типов в VHDL с Numeric_Std и Std_Logic_Arith
- Использование записей (Records) в VHDL для чистых, повторно используемых интерфейсов FIFO
- Освоение знаковых и беззнаковых типов в VHDL: практические инсайты
- Освоение оператора switch в C#: синтаксис, примеры и лучшие практики
- Оператор break в C#: как и когда использовать
- Оператор continue в C#: как эффективно пропускать итерации циклов
- Создание списков строк в VHDL: лучшие практики и пример
- Оператор switch-case в C++: синтаксис, применение и практические примеры
- Цифровое написание процедур: простое, эффективное и надежное