Создание тактированного процесса в VHDL: практическое руководство
Большинство VHDL-дизайнов используют тактированную логику — обычно называемую синхронной или последовательной логикой. Тактированный процесс активируется исключительно по фронту мастер-тактового сигнала, независимо от изменений в других входных сигналах.
Фундаментальным элементом тактированной логики является триггер (flip-flop). В этом уроке мы фокусируемся на триггере с положительным фронтом и отрицательным сбросом. См. схему ниже:
Как устройство выборки и удержания, триггер захватывает входное значение на фронте нарастающего тактового сигнала и удерживает это значение до следующего фронта нарастающего сигнала или до утверждения сигнала сброса.
Примечание: Эта статья является частью серии Базовые уроки VHDL.
Все тактированные процессы срабатывают в унисон и одновременно забирают свои входы. Тактовый сигнал устанавливает дискретные временные шаги, позволяя дизайнерам разделять сложную логику на четкие цикл-за-циклом события.
Триггеры, или массивы из них, также называются регистрами.
Список чувствительности тактированного процесса обычно содержит только тактовый сигнал, потому что процесс пробуждается исключительно по фронту тактового сигнала. Дополнительные входы игнорируются для целей триггера.
Ниже приведен повторно используемый шаблон для тактированного процесса с синхронным сбросом:
process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then <reset all output signals here> else <main logic here> end if; end if; end process;
Упражнение
В сопровождающем видео-уроке мы проходим через создание тактированного процесса в VHDL.
Код тестбенча
Итоговый тестбенч для триггера:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T17_ClockedProcessTb is end entity; architecture sim of T17_ClockedProcessTb is constant ClockFrequency : integer := 100e6; -- 100 MHz constant ClockPeriod : time := 1000 ms / ClockFrequency; signal Clk : std_logic := '1'; signal nRst : std_logic := '0'; signal Input : std_logic := '0'; signal Output : std_logic; begin -- The Device Under Test (DUT) i_FlipFlop : entity work.T17_FlipFlop(rtl) port map( Clk => Clk, nRst => nRst, Input => Input, Output => Output); -- Clock generation Clk <= not Clk after ClockPeriod / 2; -- Testbench sequence process is begin -- Release the DUT from reset nRst <= '1'; wait for 20 ns; Input <= '1'; wait for 22 ns; Input <= '0'; wait for 6 ns; Input <= '1'; wait for 20 ns; -- Apply reset nRst <= '0'; wait; end process; end architecture;
Модуль триггера
Реализация триггера с положительным фронтом и отрицательным сбросом:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T17_FlipFlop is port( Clk : in std_logic; nRst : in std_logic; -- Negative reset Input : in std_logic; Output : out std_logic); end entity; architecture rtl of T17_FlipFlop is begin -- Flip‑flop with synchronized reset process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then Output <= '0'; else Output <= Input; end if; end if; end process; end architecture;
Наблюдение волновой формы
После запуска симуляции в ModelSim и увеличения временной шкалы, волновая форма четко показывает выход, обновляющийся только по фронтам нарастающего тактового сигнала:

Анализ
Выход меняется исключительно по фронтам нарастающего тактового сигнала. Любой переход входа, происходящий между двумя фронтами нарастающего сигнала — такой как отрицательный провал, начинающийся примерно в 45 нс — не захватывается, потому что триггер забирает только по фронту.
Ниже приведена анимация, визуализирующая соотношение между входом, тактовым сигналом и выходом:

Ключевые наблюдения:
- Импульс входа длиной в один тактовый период в 20 нс синхронен тактовому сигналу и производит задержанный отклик в выходе.
- Во время симуляции события происходят в нулевых временных шагах (дельта-циклы). Поскольку триггер читает вход и обновляет выход в том же дельта-цикле, он захватывает значение входа до фронта.
На практике триггеру требуется стабильный вход в течение короткого периода до и после фронта тактового сигнала — известного как время установки (setup) и время удержания (hold). Эти ограничения автоматически обрабатываются инструментами синтеза при преобразовании VHDL в нетлист.
Для более глубокого погружения в шаги симуляционного времени см. Дельта-циклы объяснены.
Выводы
- Тактированные процессы с синхронным сбросом включают только тактовый сигнал в список чувствительности.
- Использование
if rising_edge(Clk)гарантирует активацию строго по фронту нарастающего тактового сигнала. - В синхронном дизайне все изменения состояния происходят на активном фронте тактового сигнала.
Готовы проверить свои знания? Пройдите базовый тест VHDL — часть 3 или переходите к следующему уроку.
VHDL
- Создание списков строк в VHDL: лучшие практики и пример
- Создание Tcl-управляемого тестбенча для VHDL-модуля кодового замка
- Корректное завершение симуляции VHDL-тестбенча
- Реализация PWM-контроллера в VHDL: проектирование, симуляция и FPGA-демо
- Генерация случайных чисел в VHDL: от Uniform к OSVVM
- Проектирование надежного кольцевого буфера FIFO на VHDL в блочной ОЗУ
- Как создать самопроверяющийся тестбенч в VHDL — практическое руководство
- Реализация динамического связного списка в VHDL с защищенными типами и указателями доступа
- Использование внутрипроцессных процедур для более чистого проектирования FSM на VHDL
- Освоение функций VHDL: практическое руководство по эффективному дизайну