Задача
Сформировать одиночный импульс в момент изменения сигнала.
Тип схемы: Синхронная схема: один триггер и комбинационная логика.
Модуль: edge_detect. Среда: Quartus, Vivado, ISE или свободный GHDL для моделирования.
Теорию по языку смотрите в статье VHDL — язык описания аппаратуры,
по самим микросхемам — на странице ПЛИС.
Алгоритм
- Запомнить значение сигнала на предыдущем такте.
- Сравнить текущее значение с задержанным.
- Единица сейчас и ноль раньше — это нарастающий фронт.
- Аналогично формируются импульсы по спаду и по любому изменению.
Код на 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.