找回密码
 注册
关于网站域名变更的通知
查看: 324|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-29 07:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

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

6 \/ k; k: D' S  ?
  • library ieee;
  • use ieee.std_logic_1164.all;
  • use ieee.std_logic_unsigned.all;
  • entity debounce_FSM is
  •         generic (fclk : integer :=50000000);
  •         port(
  •                 n_rst                : in std_logic;
  •                 clk                        : in std_logic;
  •                 key_in                : in std_logic;                --key is valid by low
  •                 pulse                : out std_logic        --output single pulse
  •                 );
  • end debounce_FSM;
  • architecture rtl of debounce_FSM is
  • type m_state is(
  •                 idle,
  •                 delay,
  •                 output,
  •                 key_up
  •                 );
  • signal cs,ns: m_state;
  • signal key_reg : std_logic;
  • constant n : integer :=fclk/100;        --100Hz,means to delay 10 ms
  • signal delay_cnt : integer range 0 to n-1;
  • begin
  • --three section FSM
  • --timing sequence part of FSM
  •         process(n_rst,clk)
  •         begin
  •         if(n_rst='0')then
  •                 cs<=idle;
  •         elsif(clk'event and clk='1')then               
  •                 cs<=ns;
  •         end if;
  •         end process;
  • --combination part of FSM
  •         process(cs,key_in,delay_cnt)
  •         begin
  •         case (cs) is
  •                 when idle                =>        if(key_in='0')then
  •                                                                 ns<=delay;                --when key is down
  •                                                         else
  •                                                                 ns<=idle;
  •                                                         end if;
  •                 when delay                =>        if(delay_cnt=n-1)then
  •                                                                 ns<=output;
  •                                                         else
  •                                                                 ns<=delay;
  •                                                         end if;
  •                 when output                =>         ns<=key_up;
  •                 when key_up                =>         if(key_in='1')then        --waiting key being up
  •                                                                 ns<=idle;
  •                                                         else
  •                                                                 ns<=key_up;
  •                                                         end if;
  •                 when others                =>        ns<=idle;
  •         end case;
  •         end process;
  •         
  • --register output part of FSM
  •         process(n_rst,clk)
  •         begin
  •         if(n_rst='0')then
  •                 key_reg <='0';
  •                 delay_cnt<=0;
  •         elsif(clk'event and clk='1')then
  •                 case (ns) is
  •                         when idle        =>        key_reg <='0';delay_cnt<=0;
  •                         when delay        =>        key_reg <='0';delay_cnt<=delay_cnt+1;
  •                         when output        =>        if(key_in='0')then
  •                                                                 key_reg <='1';
  •                                                         else
  •                                                                 key_reg <='0';
  •                                                         end if;
  •                                                         delay_cnt<=delay_cnt;
  •                         when key_up        =>        key_reg <='0';delay_cnt<=0;
  •                         when others        =>        key_reg <='0';delay_cnt<=0;
  •                 end case;
  •         end if;
  •         end process;
  •         pulse<=key_reg;
  •         
  • end rtl;* L( c. Y4 d* `6 e

6 E' p5 n7 b' Y8 D

该用户从未签到

2#
发表于 2019-4-29 17:59 | 只看该作者
有源码简直太棒了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-1 16:05 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表