94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			VHDL
		
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			VHDL
		
	
	
	
--
 | 
						|
--  Remove glitches from a digital signal.
 | 
						|
--
 | 
						|
--  Joris van Rantwijk 2024
 | 
						|
--
 | 
						|
 | 
						|
library ieee;
 | 
						|
use ieee.std_logic_1164.all;
 | 
						|
use ieee.numeric_std.all;
 | 
						|
 | 
						|
 | 
						|
entity deglitch is
 | 
						|
 | 
						|
    generic (
 | 
						|
        -- The output follows the input when the input is stable
 | 
						|
        -- for "deglitch_cycles" clock cycles.
 | 
						|
        --
 | 
						|
        -- A glitch-free transition on the input, propagates to the output
 | 
						|
        -- after a delay of "deglitch_cycles" clock cycles.
 | 
						|
        --
 | 
						|
        deglitch_cycles:    integer range 2 to 16 := 4
 | 
						|
    );
 | 
						|
 | 
						|
    port (
 | 
						|
        -- Main clock, active on rising edge.
 | 
						|
        clk:                in  std_logic;
 | 
						|
 | 
						|
        -- Input signal.
 | 
						|
        din:                in  std_logic;
 | 
						|
 | 
						|
        -- Deglitched output signal.
 | 
						|
        dout:               out std_logic
 | 
						|
    );
 | 
						|
 | 
						|
end entity;
 | 
						|
 | 
						|
architecture arch of deglitch is
 | 
						|
 | 
						|
    type regs_type is record
 | 
						|
        cnt:            integer range 0 to deglitch_cycles - 1;
 | 
						|
        dout:           std_logic;
 | 
						|
    end record;
 | 
						|
 | 
						|
    constant regs_init: regs_type := (
 | 
						|
        cnt             => 0,
 | 
						|
        dout            => '0'
 | 
						|
    );
 | 
						|
 | 
						|
    signal r: regs_type := regs_init;
 | 
						|
    signal rnext: regs_type;
 | 
						|
 | 
						|
begin
 | 
						|
 | 
						|
    -- Drive output.
 | 
						|
    dout <= r.dout;
 | 
						|
 | 
						|
    --
 | 
						|
    -- Combinatorial process.
 | 
						|
    --
 | 
						|
    process (all) is
 | 
						|
        variable v: regs_type;
 | 
						|
        variable v_trig: std_logic;
 | 
						|
    begin
 | 
						|
        -- Load current register values.
 | 
						|
        v := r;
 | 
						|
 | 
						|
        if (din xor r.dout) = '1' then
 | 
						|
            if r.cnt = deglitch_cycles - 1 then
 | 
						|
                v.dout := din;
 | 
						|
                v.cnt  := 0;
 | 
						|
            else
 | 
						|
                v.cnt := r.cnt + 1;
 | 
						|
            end if;
 | 
						|
        else
 | 
						|
            v.cnt := 0;
 | 
						|
        end if;
 | 
						|
 | 
						|
        -- Drive new register values to synchronous process.
 | 
						|
        rnext <= v;
 | 
						|
    
 | 
						|
    end process;
 | 
						|
 | 
						|
    --
 | 
						|
    -- Synchronous process.
 | 
						|
    --
 | 
						|
    process (clk) is
 | 
						|
    begin
 | 
						|
        if rising_edge(clk) then
 | 
						|
            r <= rnext;
 | 
						|
        end if;
 | 
						|
    end process;
 | 
						|
 | 
						|
end architecture;
 |