debounce_fsm_orig_unsigned.vhd


1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4
5
entity debounce_fsm is
6
    generic(    bitdepth : natural := 22);
7
    port(   clk, rst, taster : in std_logic;
8
            debounced : out std_logic);
9
end entity debounce_fsm;
10
11
architecture behavorial of debounce_fsm is
12
13
    type state is (IDLE, WAITING);
14
    signal current_state : state;
15
16
    signal counting, endCount : std_logic;
17
18
    signal countval : unsigned (bitdepth-1 downto 0);
19
    
20
    signal MAX_CNT : unsigned (bitdepth-1 downto 0) := to_unsigned(40, bitdepth);
21
22
begin
23
    
24
    counter : process (clk, rst)
25
    begin
26
        if rst = '0' then
27
            countval <= to_unsigned(0, bitdepth);
28
            endCount <= '0';
29
        elsif rising_edge(clk) then
30
            if countval = MAX_CNT then
31
                countval <= to_unsigned(0, bitdepth);
32
                endCount <= '1';
33
            else
34
                endCount <= '0';
35
                if counting = '1' then
36
                    countval <= countval + 1;
37
                end if;
38
            end if;
39
        end if;
40
    end process counter;
41
42
    
43
    transfer_function : process (clk, rst)
44
    begin
45
        if rst = '0' then        
46
            current_state <= IDLE;
47
        elsif rising_edge(clk) then
48
            case current_state is
49
                when IDLE =>
50
                    if taster = '0' then
51
                        current_state <= WAITING;
52
                    else
53
                        current_state <= IDLE;
54
                    end if;
55
                when WAITING =>
56
                    if endCount = '1' then
57
                        if taster = '1' then
58
                            current_state <= IDLE;
59
                        else
60
                            current_state <= WAITING;
61
                        end if;
62
                    end if;
63
            end case;
64
        end if;
65
    end process transfer_function;
66
    
67
    
68
    output_function : process (current_state)
69
    begin
70
        case current_state is
71
            when IDLE =>
72
                counting <= '0';
73
                debounced <= '1';
74
            when WAITING =>
75
                counting <= '1';
76
                debounced <= '0';
77
        end case;
78
    end process output_function;
79
80
end behavorial;