AFON // радиотехник affonya@mail.ru
← Проекты на VHDL

Проект 12. Детектор фронта

Из длинного уровня получаем короткий импульс длиной ровно один такт. Без этого приёма невозможны счётчики событий, стробы и однократные запуски.

Задача

Сформировать одиночный импульс в момент изменения сигнала.

Тип схемы: Синхронная схема: один триггер и комбинационная логика.
Модуль: edge_detect. Среда: Quartus, Vivado, ISE или свободный GHDL для моделирования. Теорию по языку смотрите в статье VHDL — язык описания аппаратуры, по самим микросхемам — на странице ПЛИС.

Алгоритм

  1. Запомнить значение сигнала на предыдущем такте.
  2. Сравнить текущее значение с задержанным.
  3. Единица сейчас и ноль раньше — это нарастающий фронт.
  4. Аналогично формируются импульсы по спаду и по любому изменению.

Код на VHDL

Код проверен компилятором GHDL: проходит анализ и элаборацию без ошибок и предупреждений. Скачать: v12.vhd

--=====================================================
-- Проект 12. Детектор фронта
-- Из уровня получаем импульс длиной ровно один такт:
-- по нарастающему фронту, по спаду и по любому изменению.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;

entity edge_detect is
    port (
        clk         : in  std_logic;
        rst         : in  std_logic;
        sig         : in  std_logic;
        rise_pulse  : out std_logic;                    -- импульс по фронту
        fall_pulse  : out std_logic;                    -- импульс по спаду
        any_pulse   : out std_logic                     -- по любому изменению
    );
end entity edge_detect;

architecture rtl of edge_detect is
    signal sig_d : std_logic := '0';                    -- задержка на такт
begin
    process (clk, rst)
    begin
        if rst = '1' then
            sig_d <= '0';
        elsif rising_edge(clk) then
            sig_d <= sig;                               -- запоминаем прошлое значение
        end if;
    end process;

    -- сравнение текущего значения с задержанным
    rise_pulse <= sig and not sig_d;
    fall_pulse <= not sig and sig_d;
    any_pulse  <= sig xor sig_d;
end architecture rtl;

Пояснения

  • Импульс длиной один такт — универсальная «валюта» синхронных схем: он однозначно фиксирует событие и не вызывает повторных срабатываний.
  • Логика предельно дешёвая: один триггер и пара вентилей независимо от разрядности.
  • Если исходный сигнал асинхронный, перед детектором обязателен синхронизатор — иначе импульс может появиться в ложный момент.

Что дальше

Следующие проекты — в разделе проекты на VHDL. Сравнить подход с языком Verilog можно в статье Verilog, а разобраться в устройстве самих кристаллов — в статье ПЛИС: FPGA и CPLD.