当前位置: 首页 > 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

http://www.dtcms.com/a/54333.html

相关文章:

  • 信息安全技术、加密、摘要、签名、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对象
  • 亚信安全发布2024威胁年报和2025威胁预测
  • PostgreSQL常用系统表
  • Linux : 进程地址空间
  • RBAC 权限系统管理模型 学习笔记
  • 笔记四:C语言中的文件和文件操作
  • 168. Excel 表列名称
  • vue左侧边框点击后让字体高亮
  • QTS单元测试框架
  • 多线程-CompletableFuture
  • 深度解析:视频软编码与硬编码的优劣对比