--=====================================================
-- Проект 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;
