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