[原创] 使用状态机的按键消抖[源码分享]

k331922164   2014-3-18 00:29 楼主
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.std_logic_unsigned.all;

  4. entity debounce_FSM is
  5.         generic (fclk : integer :=50000000);
  6.         port(
  7.                 n_rst                : in std_logic;
  8.                 clk                        : in std_logic;
  9.                 key_in                : in std_logic;                --key is valid by low
  10.                 pulse                : out std_logic        --output single pulse
  11.                 );
  12. end debounce_FSM;

  13. architecture rtl of debounce_FSM is

  14. type m_state is(
  15.                 idle,
  16.                 delay,
  17.                 output,
  18.                 key_up
  19.                 );
  20. signal cs,ns: m_state;

  21. signal key_reg : std_logic;
  22. constant n : integer :=fclk/100;        --100Hz,means to delay 10 ms
  23. signal delay_cnt : integer range 0 to n-1;

  24. begin

  25. --three section FSM
  26. --timing sequence part of FSM
  27.         process(n_rst,clk)
  28.         begin
  29.         if(n_rst='0')then
  30.                 cs<=idle;
  31.         elsif(clk'event and clk='1')then               
  32.                 cs<=ns;
  33.         end if;
  34.         end process;

  35. --combination part of FSM
  36.         process(cs,key_in,delay_cnt)
  37.         begin
  38.         case (cs) is
  39.                 when idle                =>        if(key_in='0')then
  40.                                                                 ns<=delay;                --when key is down
  41.                                                         else
  42.                                                                 ns<=idle;
  43.                                                         end if;
  44.                 when delay                =>        if(delay_cnt=n-1)then
  45.                                                                 ns<=output;
  46.                                                         else
  47.                                                                 ns<=delay;
  48.                                                         end if;
  49.                 when output                =>         ns<=key_up;
  50.                 when key_up                =>         if(key_in='1')then        --waiting key being up
  51.                                                                 ns<=idle;
  52.                                                         else
  53.                                                                 ns<=key_up;
  54.                                                         end if;
  55.                 when others                =>        ns<=idle;
  56.         end case;
  57.         end process;
  58.        
  59. --register output part of FSM
  60.         process(n_rst,clk)
  61.         begin
  62.         if(n_rst='0')then
  63.                 key_reg <='0';
  64.                 delay_cnt<=0;
  65.         elsif(clk'event and clk='1')then
  66.                 case (ns) is
  67.                         when idle        =>        key_reg <='0';delay_cnt<=0;
  68.                         when delay        =>        key_reg <='0';delay_cnt<=delay_cnt+1;
  69.                         when output        =>        if(key_in='0')then
  70.                                                                 key_reg <='1';
  71.                                                         else
  72.                                                                 key_reg <='0';
  73.                                                         end if;
  74.                                                         delay_cnt<=delay_cnt;
  75.                         when key_up        =>        key_reg <='0';delay_cnt<=0;
  76.                         when others        =>        key_reg <='0';delay_cnt<=0;
  77.                 end case;
  78.         end if;
  79.         end process;
  80.         pulse<=key_reg;
  81.        
  82. end rtl;


回复评论 (3)

谢谢楼主分享 。看看

点赞  2014-3-18 11:42
引用: john_wang 发表于 2014-3-18 11:42
谢谢楼主分享 。看看

一起学习,一起分享。
点赞  2014-3-18 13:48
Great! Thank for sharing.
点赞  2014-4-26 14:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复