当前位置: 首页 > news >正文

FPGA-按键消抖

按键消抖

1. 原理

在这里插入图片描述

2. 关键程序实现
always @(posedge clk or negedge rst) begin
    if(!rst)begin
        cnt_wait <= 26'd0;
    end else if(flag_nege || flag_pose)begin
        cnt_wait <= 26'd1;
    end else if(cnt_wait == MAX_CNT) begin
        cnt_wait <= 26'd0;
    end else if(cnt_wait > 26'd0 && cnt_wait < MAX_CNT)begin
        cnt_wait <= cnt_wait + 26'd1;
    end
end

always @(posedge clk or negedge rst) begin
    if(!rst)begin
        key_scan1 <= 4'b1111;
        key_scan2 <= 4'b1111;
    end else if(cnt_wait == MAX_CNT)begin
        key_scan1 <= key_in;
        key_scan2 <= key_scan1;
    end else begin
        key_scan2 <= key_scan1;
    end
end
3. 仿真波形

在这里插入图片描述

4. 源代码
module key(
    input                               clk                        ,
    input                               rst                        ,
    input              [   3:0]         key_in                     ,
    output             [   3:0]         key_out_down               ,           
    output             [   3:0]         key_out_up                     
);

wire                                    key_tmp = &key_in          ;

reg                    key_in_r2                  ;
reg                    key_in_r1                  ;

always @(posedge clk or negedge rst)begin
    if(!rst)begin
        key_in_r1 <= 1'b1;
        key_in_r2 <= 1'b1;
    end else begin
        key_in_r1 <= key_tmp;
        key_in_r2 <= key_in_r1;
    end
end

wire                                    flag_nege = key_in_r2 & !key_in_r1;//
wire                                    flag_pose = !key_in_r2 & key_in_r1;//


reg                    [  25:0]         cnt_wait                   ;
// localparam  MAX_CNT = 50_000_000/50;
localparam                              MAX_CNT = 1_000_000 - 1    ;
always @(posedge clk or negedge rst) begin
    if(!rst)begin
        cnt_wait <= 26'd0;
    end else if(flag_nege || flag_pose)begin
        cnt_wait <= 26'd1;
    end else if(cnt_wait == MAX_CNT) begin
        cnt_wait <= 26'd0;
    end else if(cnt_wait > 26'd0 && cnt_wait < MAX_CNT)begin
        cnt_wait <= cnt_wait + 26'd1;
    end
end

reg                    [   3:0]         key_scan1                  ;
reg                    [   3:0]         key_scan2                  ;
always @(posedge clk or negedge rst) begin
    if(!rst)begin
        key_scan1 <= 4'b1111;
        key_scan2 <= 4'b1111;
    end else if(cnt_wait == MAX_CNT)begin
        key_scan1 <= key_in;
        key_scan2 <= key_scan1;
    end else begin
        key_scan2 <= key_scan1;
    end
end

// wire                   [   3:0]         kay_val = !key_scan1 & key_scan2;  !不行   !的优先级低
wire                   [   3:0]         kay_val_down = ~key_scan1 & key_scan2;//
wire                   [   3:0]         kay_val_up = key_scan1 & ~key_scan2;//

assign key_out_down = kay_val_down;
assign key_out_up = kay_val_up;



endmodule

相关文章:

  • 信息安全技术、加密、摘要、签名、PKI(高软41)
  • Java数组详解/从JVM理解数组/数组反转/随机排名/数组在计算机如何存储
  • 【DeepSeek】Ubuntu快速部署DeepSeek(Ollama方式)
  • 2024华为OD机试真题-字符串加密算法(C++)-E卷-100分
  • 机器学习-GBDT算法
  • 数字组合(信息学奥赛一本通-1291)
  • 《深度学习进阶》第7集:深度实战 通过训练一个智能体玩游戏 来洞察 强化学习(RL)与决策系统
  • 全新方案80M/S,告别限速!
  • 阿里云云监控资源告警常用模板
  • 软考架构师笔记-计算机网络
  • Pytest测试用例执行跳过的3种方式
  • 浅论数据库聚合:合理使用LambdaQueryWrapper和XML
  • [数据可视化的python脚本实现]关于餐厅消费的不同维度分析
  • 【MySQL】事务(隔离性、MVCC)
  • 2025-03-06 ffmpeg提取SPS/PPS/SEI ( extradata )
  • 【国产Linux | 银河麒麟】麒麟化龙——KylinOS下载到安装一条龙服务,起飞!
  • DeepSeek接入chatDev实现 智能编程
  • STM32-USART串口数据包
  • 策略模式
  • OpenBMC:BmcWeb构造connect对象
  • 兖州网站建设推广/百度搜索网址
  • 什么样算网站需要备案/seo关键词排行优化教程
  • 小说阅读网站开发论文/网络推广违法吗
  • 卡盟怎么网站怎么做/广告推广怎么做最有效
  • 网站设计模板简约/百度知道登录入口
  • 谷歌网站推广排名工具/梧州网站seo