| 1 |
2 |
droggen |
--------------------------------------------------------------------------------
|
| 2 |
|
|
--
|
| 3 |
|
|
-- FileName: debounce.vhd
|
| 4 |
|
|
-- Dependencies: none
|
| 5 |
|
|
-- Design Software: Quartus II 32-bit Version 11.1 Build 173 SJ Full Version
|
| 6 |
|
|
--
|
| 7 |
|
|
-- HDL CODE IS PROVIDED "AS IS." DIGI-KEY EXPRESSLY DISCLAIMS ANY
|
| 8 |
|
|
-- WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
| 9 |
|
|
-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
| 10 |
|
|
-- PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL DIGI-KEY
|
| 11 |
|
|
-- BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
|
| 12 |
|
|
-- DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF
|
| 13 |
|
|
-- PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
|
| 14 |
|
|
-- BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
|
| 15 |
|
|
-- ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
|
| 16 |
|
|
--
|
| 17 |
|
|
-- Version History
|
| 18 |
|
|
-- Version 1.0 3/26/2012 Scott Larson
|
| 19 |
|
|
-- Initial Public Release
|
| 20 |
|
|
--
|
| 21 |
|
|
--------------------------------------------------------------------------------
|
| 22 |
|
|
|
| 23 |
|
|
LIBRARY ieee;
|
| 24 |
|
|
USE ieee.std_logic_1164.all;
|
| 25 |
|
|
USE ieee.std_logic_unsigned.all;
|
| 26 |
|
|
|
| 27 |
|
|
ENTITY debounce IS
|
| 28 |
|
|
GENERIC(
|
| 29 |
|
|
counter_size : INTEGER := 19); --counter size (19 bits gives 10.5ms with 50MHz clock)
|
| 30 |
|
|
PORT(
|
| 31 |
|
|
clk : IN STD_LOGIC; --input clock
|
| 32 |
|
|
button : IN STD_LOGIC; --input signal to be debounced
|
| 33 |
|
|
result : OUT STD_LOGIC); --debounced signal
|
| 34 |
|
|
END debounce;
|
| 35 |
|
|
|
| 36 |
|
|
ARCHITECTURE logic OF debounce IS
|
| 37 |
|
|
SIGNAL flipflops : STD_LOGIC_VECTOR(1 DOWNTO 0); --input flip flops
|
| 38 |
|
|
SIGNAL counter_set : STD_LOGIC; --sync reset to zero
|
| 39 |
|
|
SIGNAL counter_out : STD_LOGIC_VECTOR(counter_size DOWNTO 0) := (OTHERS => '0'); --counter output
|
| 40 |
|
|
BEGIN
|
| 41 |
|
|
|
| 42 |
|
|
counter_set <= flipflops(0) xor flipflops(1); --determine when to start/reset counter
|
| 43 |
|
|
|
| 44 |
|
|
PROCESS(clk)
|
| 45 |
|
|
BEGIN
|
| 46 |
|
|
IF(clk'EVENT and clk = '1') THEN
|
| 47 |
|
|
flipflops(0) <= button;
|
| 48 |
|
|
flipflops(1) <= flipflops(0);
|
| 49 |
|
|
If(counter_set = '1') THEN --reset counter because input is changing
|
| 50 |
|
|
counter_out <= (OTHERS => '0');
|
| 51 |
|
|
ELSIF(counter_out(counter_size) = '0') THEN --stable input time is not yet met
|
| 52 |
|
|
counter_out <= counter_out + 1;
|
| 53 |
|
|
ELSE --stable input time is met
|
| 54 |
|
|
result <= flipflops(1);
|
| 55 |
|
|
END IF;
|
| 56 |
|
|
END IF;
|
| 57 |
|
|
END PROCESS;
|
| 58 |
|
|
END logic;
|