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

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.kler.cn/a/574444.html

相关文章:

  • 青训营:简易分布式爬虫
  • 171. Excel 表列序号
  • 【消费主义与性别角色重构】
  • 【Java线程基础操作详解】
  • 如果希望将docs文件夹完全切换为master分支,即删除master分支不存在的文件,增加master分支才有的文件,应该怎么做
  • 【数据挖掘】Pandas之DataFrame
  • SparseMoE-2
  • 数一考研复习之拉格朗日中值定理在求解函数极限中的应用,
  • 贪心算法二
  • DAIR-V2X-R数据集服务器下载
  • 社区智慧养老标准规范全解析
  • 电力杆塔倾斜监测装置:守护电网安全的智能卫士
  • 算法-回溯篇07-复原 IP 地址
  • 基于Spring Boot的健美操评分管理系统设计与实现(LW+源码+讲解)
  • DeepSeek + 沉浸式翻译 打造智能翻译助手
  • ctf网络安全比赛有一张图片怎么查看
  • 在Blender中给SP分ID通道图
  • [Python入门学习记录(小甲鱼)]第4章 分支与循环
  • Python学习第十天
  • 【搜索】P3654 First Step (ファーストステップ)