Verilog 按键防抖状态机设计:4状态FSM实现20ms稳定检测与计数应用

发布时间:2026/7/10 8:34:50
Verilog 按键防抖状态机设计:4状态FSM实现20ms稳定检测与计数应用 Verilog 按键防抖状态机设计四状态FSM实现20ms稳定检测与工程优化1. 机械按键抖动现象的本质与挑战当我们在FPGA开发板上按下机械按键时理想情况下期望得到一个干净的电平跳变信号。但现实情况是由于金属触点的弹性特性按键在闭合和断开的瞬间会产生持续5-20ms的抖动现象。这种抖动会导致单个物理按键动作被误识别为多次触发严重影响数字系统的可靠性。典型的按键抖动波形呈现以下特征前沿抖动按键按下瞬间产生的10-15次电平振荡后沿抖动按键释放瞬间产生的类似振荡稳定期按键保持按下或释放状态的稳定电平// 未消抖的按键信号采样示例 always (posedge clk) begin if(key_raw ! key_stable) counter counter 1; // 抖动会导致计数器异常增加 end传统单片机常用的延时消抖方法在FPGA设计中存在明显缺陷阻塞式延时浪费逻辑资源无法精确捕捉边沿事件难以区分有效按键和噪声2. 有限状态机(FSM)的防抖解决方案2.1 四状态FSM设计原理我们采用Moore型状态机设计定义四个关键状态状态编码状态名称电平特征持续时间S1松开稳定持续高电平无限期S2按下抖动高低电平交替20msS3按下稳定持续低电平用户定义S4松开抖动高低电平交替20ms状态转移条件S1→S2检测到下降沿nedgeS2→S3持续低电平超过20msS3→S4检测到上升沿pedgeS4→S1持续高电平超过20msparameter S1 2b00, S2 2b01, S3 2b10, S4 2b11; reg [1:0] current_state, next_state; always (posedge clk or negedge rst_n) begin if(!rst_n) current_state S1; else current_state next_state; end2.2 20ms计时器实现要点对于50MHz时钟的系统20ms对应的计数周期计算如下20ms 0.02s 50MHz周期 20ns 计数次数 0.02s / 20ns 1,000,000次优化后的计数器设计reg [19:0] debounce_cnt; // 20位计数器(最大计数1,048,575) wire cnt_full (debounce_cnt 20d999_999); always (posedge clk or negedge rst_n) begin if(!rst_n) debounce_cnt 0; else if(en_counter) debounce_cnt (cnt_full) ? 0 : debounce_cnt 1; else debounce_cnt 0; end3. 完整可综合Verilog实现3.1 边沿检测模块// 两级寄存器消除亚稳态 reg key_tmp0, key_tmp1; always (posedge clk or negedge rst_n) begin if(!rst_n) {key_tmp1, key_tmp0} 2b11; else {key_tmp1, key_tmp0} {key_tmp0, key_in}; end // 边沿检测 wire pedge key_tmp0 ~key_tmp1; // 上升沿 wire nedge ~key_tmp0 key_tmp1; // 下降沿3.2 状态机核心逻辑always (*) begin case(current_state) S1: begin // 松开稳定 next_state nedge ? S2 : S1; key_flag 1b0; key_state 1b1; en_counter 1b0; end S2: begin // 按下抖动 if(cnt_full) next_state S3; else if(pedge) next_state S1; else next_state S2; key_flag cnt_full; key_state cnt_full ? 1b0 : 1b1; en_counter ~cnt_full; end S3: begin // 按下稳定 next_state pedge ? S4 : S3; key_flag 1b0; key_state 1b0; en_counter 1b0; end S4: begin // 松开抖动 if(cnt_full) next_state S1; else if(nedge) next_state S3; else next_state S4; key_flag 1b0; key_state 1b1; en_counter ~cnt_full; end default: next_state S1; endcase end3.3 按键应用示例 - 计数器控制// 利用消抖后的key_flag实现可靠计数 reg [3:0] count; always (posedge key_flag or negedge rst_n) begin if(!rst_n) count 0; else count (count 4d9) ? 0 : count 1; end4. 工程实践中的关键优化4.1 拨动开关与按钮开关的适配不同开关类型需要调整状态输出逻辑开关类型有效电平状态机调整位置按钮开关低电平S2状态key_flag1b1拨动开关高电平S1状态key_flag1b1// 可配置的开关类型适配 parameter SW_TYPE 0; // 0:按钮开关 1:拨动开关 always (*) begin case(current_state) S1: key_flag (SW_TYPE) ? 1b1 : 1b0; S2: key_flag (SW_TYPE) ? 1b0 : cnt_full; // ...其他状态保持不变 endcase end4.2 亚稳态处理增强// 三级寄存器链消除亚稳态 reg [2:0] key_sync; always (posedge clk or negedge rst_n) begin if(!rst_n) key_sync 3b111; else key_sync {key_sync[1:0], key_in}; end // 使用同步后的信号 wire sync_key key_sync[2];4.3 参数化设计module debounce_fsm #( parameter CLK_FREQ 50_000_000, // 50MHz parameter DEBOUNCE_MS 20 // 20ms消抖时间 ) ( // 端口声明 ); localparam CNT_MAX (CLK_FREQ / 1000) * DEBOUNCE_MS - 1; // ...其余代码使用CNT_MAX作为计数上限 endmodule5. ModelSim功能仿真验证5.1 测试激励生成initial begin // 初始状态 key_in 1b1; rst_n 1b0; #200 rst_n 1b1; // 模拟按键抖动 #100 key_in 1b0; // 按下抖动开始 #1 key_in 1b1; // 模拟抖动 #2 key_in 1b0; // ...更多抖动信号 #20 key_in 1b0; // 稳定按下 #500 key_in 1b1; // 释放抖动开始 // ...类似抖动模式 #20 key_in 1b1; // 稳定释放 end5.2 波形分析要点前沿抖动期观察S2状态是否有效过滤抖动稳定按下期验证S3状态的持续时间后沿抖动期检查S4状态的转换条件key_flag脉冲确认每次有效按键只产生单周期脉冲提示在仿真时可适当缩短DEBOUNCE_MS参数值如改为2ms以加速仿真过程6. 实际应用场景扩展6.1 多按键消抖方案genvar i; generate for(i0; i4; ii1) begin: KEY_DEBOUNCE debounce_fsm u_debounce( .clk(clk), .rst_n(rst_n), .key_in(key_row[i]), .key_flag(key_flag[i]), .key_state(key_state[i]) ); end endgenerate6.2 组合按键检测// 检测两个按键同时按下 wire combo_key key_flag[0] key_flag[1] (key_state[0] 0) (key_state[1] 0); // 检测按键序列 reg [1:0] key_sequence; always (posedge clk) begin if(key_flag[0]) key_sequence {key_sequence[0], 1b1}; else if(key_flag[1]) key_sequence {key_sequence[0], 1b0}; end6.3 长按与短按识别reg [23:0] press_timer; always (posedge clk) begin if(key_state) press_timer 0; else press_timer press_timer 1; end wire long_press (press_timer 24d2_500_000); // 约50ms长按

相关新闻

15MB轻量级电视直播神器:让老旧电视焕发新生的完整指南

15MB轻量级电视直播神器:让老旧电视焕发新生的完整指南

15MB轻量级电视直播神器:让老旧电视焕发新生的完整指南 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android MyTV-Android是一款专为老旧安卓设备优化的开源电视直播软件&#xff0…

发布时间:2026/7/10 8:34:37
Unity 2D粒子特效素材自制:用PS与Aseprite打造专属风雪、涟漪与血迹

Unity 2D粒子特效素材自制:用PS与Aseprite打造专属风雪、涟漪与血迹

1. 项目概述:从“拿来主义”到“自给自足”的2D特效创作如果你在Unity里做2D游戏,是不是也经历过这样的场景:想给角色加个受伤溅血的效果,或者给场景来点风雪氛围,第一反应就是去Asset Store找免费的粒子特效包&#x…

发布时间:2026/7/10 8:34:37
别被忽悠:新手老板怎么跟网站建设公司谈才不吃亏

别被忽悠:新手老板怎么跟网站建设公司谈才不吃亏

上周我去见了一家做网站的公司。对方西装革履,满嘴术语。什么响应式布局,什么SEO优化。听得我云里雾里。但我心里其实慌得很。怕花了几万块,最后拿到个垃圾。后来我想通了。跟他们谈,不能听他们说什么。要看他们做什么。今天就把我踩过的坑,写下来。希望能帮到正在纠结的你…

发布时间:2026/7/10 8:33:55
如何用HTMLMinifier重构现代前端构建流程:架构设计与性能调优实战

如何用HTMLMinifier重构现代前端构建流程:架构设计与性能调优实战

如何用HTMLMinifier重构现代前端构建流程:架构设计与性能调优实战 【免费下载链接】html-minifier Javascript-based HTML compressor/minifier (with Node.js support) 项目地址: https://gitcode.com/gh_mirrors/ht/html-minifier 引言:当HTML压…

发布时间:2026/7/10 9:23:44
别瞎折腾了,个人网站建设yxhuying才是普通人搞副业的最优解

别瞎折腾了,个人网站建设yxhuying才是普通人搞副业的最优解

说实话,以前我也觉得搞个自己的网站那是大牛才干的事儿。满脑子都是代码、服务器、域名解析。听得脑壳疼,直接劝退。直到去年,我有个做设计的朋友老张,偷偷摸摸搞了个个人网站建设yxhuying。刚开始我没当回事,以为又是那种花里胡哨的模板站。结果你猜怎么着?上个月他跟我…

发布时间:2026/7/10 9:22:56
别信那些吹上天的电子商务网站建设视频教学,看完这几点能省大几万

别信那些吹上天的电子商务网站建设视频教学,看完这几点能省大几万

昨天半夜两点,我还在改一个客户的商城后台,咖啡都凉透了。这哥们儿之前信了网上那些“三天学会建站”的鬼话,花两千块买了套所谓的“全套电子商务网站建设视频教学”,结果呢?页面加载慢得像蜗牛,支付接口对接不上,后台还经常崩。他哭着问我咋办,我叹了口气,说这钱就当…

发布时间:2026/7/10 9:22:13
STM32 HAL SPI DMA 驱动 WS2812B:3种编码方案对比与 8bit 方案实测

STM32 HAL SPI DMA 驱动 WS2812B:3种编码方案对比与 8bit 方案实测

STM32 HAL SPI DMA 驱动 WS2812B:3种编码方案对比与 8bit 方案实测在嵌入式开发中,WS2812B LED灯带因其单线控制、色彩丰富等特点广受欢迎。传统上,开发者多采用GPIO位操作(bit-banging)方式驱动,但这种方式…

发布时间:2026/7/10 9:22:10
别瞎折腾了,网站建设 通讯员 才是企业官网的救命稻草

别瞎折腾了,网站建设 通讯员 才是企业官网的救命稻草

昨天半夜两点,我还在改一个客户的官网。 真的,累得想砸键盘。 这哥们儿是个做传统机械加工的老板。 手里有厂,有设备,就是不懂互联网。 他觉得,只要把产品图片放上去,再写几段高大上的介绍,客户就会找上门。 天真。 太天真了。我跟他讲,现在的互联网,早就不是那个“酒…

发布时间:2026/7/10 9:18:52
老干部局网站建设怎么搞?别整虚的,这才是懂行的做法

老干部局网站建设怎么搞?别整虚的,这才是懂行的做法

前几天跟一位在老干部局干了十几年的老张喝茶,他跟我吐槽,说现在局里搞信息化,让做个网站,结果外包公司交上来的东西,字小得跟蚂蚁似的,颜色还搞得花里胡哨的,问他们能不能用,大爷们直摇头:“这哪是上网,这是给眼睛找罪受。”这话听着扎心,但确实是实情。很多单位在…

发布时间:2026/7/10 9:17:57
老板们别被忽悠了,企业网站建设费用摊销到底怎么算才不亏?

老板们别被忽悠了,企业网站建设费用摊销到底怎么算才不亏?

说实话,每次听到老板们拍着桌子问“做个网站要多少钱”,我心里就直犯嘀咕。你们关心的根本不是网站好不好用,而是这钱花得值不值,能不能立马变出利润来。我见过太多公司,花个三五万做个花里胡哨的首页,结果后台乱成一锅粥,SEO标签全没填,上线半年连个蜘蛛都不爬。这种钱…

发布时间:2026/7/10 0:00:19
网站搜索建设怎么做?新手避坑指南与实战心得

网站搜索建设怎么做?新手避坑指南与实战心得

很多老板做网站,花大价钱搞设计,最后发现用户根本找不到内容,搜索功能形同虚设。这篇干货不讲虚的,直接告诉你怎么搭建一个真正好用的站内搜索,解决用户找不到东西、跳出率高的问题。上周我去了一家做高端家具的电商网站。页面确实漂亮,极简风,高级感拉满。但是,我想找…

发布时间:2026/7/10 0:00:33
北京市建设工程质量监督网站查询实操指南与避坑实录

北京市建设工程质量监督网站查询实操指南与避坑实录

做工程最怕什么?怕验收不过,怕资料补不齐,怕最后拿着钱还背一身债。这篇不整虚的,直接告诉你怎么通过北京市建设工程质量监督网站搞定验收流程,以及那些没人愿意告诉你的隐形坑。先说个真事儿。上个月有个做装修的朋友,急着拿竣工验收备案表,结果在北京市建设工程质量监…

发布时间:2026/7/10 0:00:37
做个人信息管理网站建设,这3个坑我踩了七年,你千万别再跳

做个人信息管理网站建设,这3个坑我踩了七年,你千万别再跳

做了七年建站,见过太多老板花大钱买模板,最后发现根本没法用。特别是现在大家都讲究数据隐私,想搞个个人信息管理网站建设,结果越搞越乱。这篇文不整虚的,直接说怎么把这套系统落地,让你自己的数据真正听话。先说个真事儿。去年有个做自由职业的朋友找我,他说想建个网站…

发布时间:2026/7/9 15:43:56
杨凌规划建设局网站怎么查最新规划?老杨说点大实话

杨凌规划建设局网站怎么查最新规划?老杨说点大实话

杨凌规划建设局网站你是不是也遇到过这种情况?想看看自家旁边要修路,还是建公园。翻遍了手机,搜出来的全是几年前的旧闻。或者好不容易找到个入口,页面加载慢得像蜗牛。心里那个急啊,真的,懂的人都懂。我是老杨,在杨凌混了十几年,跟这行打交道不少。今天不跟你扯那些虚…

发布时间:2026/7/9 15:43:42
杭州网站建设 seo 避坑指南:别被那些只会套模板的忽悠了

杭州网站建设 seo 避坑指南:别被那些只会套模板的忽悠了

昨天半夜两点,我还在改一个客户的后台,咖啡都凉透了。这哥们儿是做机械配件的,在余杭那边,找的前一家公司花了八千块做了个站,结果上线一个月,百度连个影子都没有。他急得给我打电话,说是不是被黑了。我让他把链接发过来,打开一看,好家伙,那代码乱得跟刚被猫抓过的毛…

发布时间:2026/7/9 16:54:10
建站7年才悟出的网站建设思路,别再花冤枉钱了

建站7年才悟出的网站建设思路,别再花冤枉钱了

做建站这行整整7年了。 见过太多老板花几万块, 最后做出来的网站像个垃圾场。 今天不整那些虚头巴脑的术语。 就聊聊我踩过的坑, 和真正能落地的网站建设思路。很多老板一上来就问: “多少钱能做个高大上的?” 我通常直接劝退。 因为方向错了, 你给再多钱也是打水漂。 真正…

发布时间:2026/7/9 15:45:02
合肥的网站建设避坑指南:别被低价忽悠,这3个细节决定生死

合肥的网站建设避坑指南:别被低价忽悠,这3个细节决定生死

做企业官网最怕什么?不是技术难,是交钱后没人管,或者上线一个月连个访客都没有。这篇东西不扯虚的,直接告诉你怎么在合肥找个靠谱的团队,或者自己怎么避坑。先说个大实话,我在合肥混这行五年多,见过太多老板因为贪便宜吃大亏。你去百度搜“合肥的网站建设”,出来一堆报…

发布时间:2026/7/9 15:44:20
别被忽悠了!德州网站建设那些坑,我拿真金白银换来的教训

别被忽悠了!德州网站建设那些坑,我拿真金白银换来的教训

做这行久了,心里就憋着一股火。每次看到客户拿着网上抄来的模板,问我能不能做成“苹果官网”那种效果。我就想笑。真的,太想笑了。今天咱不整那些虚头巴脑的专业术语。就聊聊德州网站建设里,那些让人头秃的真实事儿。我有个客户,老张。他是做德州本地建材的,实在人。当初…

发布时间:2026/7/9 15:45:20