| ??? 07/05/06 18:19 Modified: 07/05/06 18:21 Read: times |
#119704 - jezwolds hardware switch debouncer Responding to: ???'s previous message |
---Hardware switch debouncer with tristateable outputs a la Dallas semiconductor
---uses shift registers on the switch inputs to detect when they have been
---in a steady state for 4 clock cycles.NINT goes low for two clock cycles
---when all switch inputs (swin) have been debounced and the new switch
---outputs(swout) are ready.
---each switch input requires 7 registers plus sundry logic for the whole design
---clk should be run at around 100 Hz.Set the value of size to the number of inputs required.
-- Copyright (c) 2006 Jez smith (jez-smith@hotmail.co.uk)
-- All rights reserved
-- All offers of vast amounts of cash to produce your designs should be sent to
-- the above
--
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTOR "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
library ieee;
use ieee.std_logic_1164.all;
ENTITY filter IS
PORT(switch_in : in std_logic;
clk : in std_logic;
rst_n : in std_logic;
ready : out std_logic;
switch_out: out std_logic);
END filter;
--input filter for each switch
ARCHITECTURE rtl OF filter IS
signal sr1 : std_logic_vector(4 downto 0);
BEGIN
process(switch_in,rst_n,clk,sr1)
begin
if (rst_n='0') then
sr1<="00001";
elsif rising_edge(clk) then
sr1<=sr1(2 downto 0) & switch_in;
case sr1 is
when "00000"=> switch_out <='0';
ready<='1';
when "11111"=> switch_out <='1';
ready<='1';
when others=> ready <='0';
end case;
end if;
end process;
END rtl;
library ieee;
use ieee.std_logic_1164.all;
entity debouncer is
--generates the required number of input filters and simple state machine to generate the interupt.
generic(size:positive :=8); -- number of debounced inputs/outputs required
port (clk :in std_logic;
rst_n :in std_logic; --negative reset
oe_n :in std_logic; --negative output enable
swin :in std_logic_vector(size-1 downto 0); --switch inputs
swout :out std_logic_vector(size-1 downto 0); --tristated switch outputs
nint :out std_logic); -- negative going interrupt
end debouncer;
architecture rtl of debouncer is
component filter is
port(switch_in : in std_logic;
clk : in std_logic;
rst_n : in std_logic;
ready : out std_logic;
switch_out: out std_logic);
end component;
signal max_arry, new_sw_state,sw_state,old_sw_state,sw_ready : std_logic_vector(size-1 downto 0);
signal switch_ready :std_logic;
begin
swout<= new_sw_state when (oe_n='0') else (others=>'Z');
switch_ready<= '1' when (max_arry = sw_ready) else '0';
gen_int: process(new_sw_state,sw_state,old_sw_state,switch_ready,clk)
begin
if falling_edge(clk) and switch_ready='1' then
old_sw_state<=sw_state;
sw_state<=new_sw_state;
if old_sw_state/=new_sw_state then
nint<='0';
else
nint<='1';
end if;
end if;
end process;
filters: for i in (size-1) downto 0 generate
filt : filter port map (swin(i),clk,rst_n,sw_ready(i),new_sw_state(i));
max_arry(i)<='1';
end generate;
end rtl;
|



