首页 > 其他分享 >按键检测

按键检测

时间:2023-09-14 22:33:34浏览次数:22  
标签:cnt 检测 低电平 key 按键 rst reg

注:key_in 默认为高电平,按键按下为低电平

其实只要检测到20ms内有持续为低电平,就可以认为按键有被按下,如下时序图

在抖动阶段,有检测到高电平的,计数器停止计数add_cnt = 0,计数器cnt清0 ,便于下一次重新计时。

 

module key_module(
    clk    ,
    rst_n  ,
    key_in ,
    key_vld 
);
parameter                      DATA_W       = 20          ;
parameter                      KEY_W       = 4           ;
parameter                   TIME_20MS = 500_000     ;

input                        clk                     ;
input                       rst_n                   ;
input                       key_in                  ;
output                      key_vld                 ;
reg                         key_vld                 ;
reg        [DATA_W-1:0]     cnt                     ;
wire                           add_cnt                 ;
wire                           end_cnt                 ;
reg                            flag                    ;
reg                         key_in_ff1              ;
reg                         key_in_ff0              ;

//检测20ms内持续为低电平,就被认为有按键被按下
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        cnt <= 20'b0;
    end
    else if(add_cnt)begin
        if(end_cnt)
            cnt <= 20'b0;
        else
            cnt <= cnt + 1'b1;
    end
    else begin
        cnt <= 0;
    end
end

assign add_cnt = flag==1'b0 && (key_in_ff1 != 1'b1);    //检测到有抖动,也就是检测有高的脉冲,计数器停止,cnt清0,便于下次重新计数
assign end_cnt = add_cnt && cnt == TIME_20MS - 1;

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        flag <= 1'b0;
    end
    else if(end_cnt)begin   //能够完整的计数到20ms结束, 说明已经检测到了按键有被按下
        flag <= 1'b1;
    end
    else if(key_in_ff1 == 1'b1)begin    //按键释放后,flag 置0 ,方便下次检测
        flag <= 1'b0;
    end
end


//打两拍,消除亚稳态
always  @(posedge clk)begin
    if(rst_n==1'b0)begin
        key_in_ff0 <= 0;
        key_in_ff1 <= 0;
    end
    else begin
        key_in_ff0 <= key_in    ;
        key_in_ff1 <= key_in_ff0;
    end
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        key_vld <= 0;
    end
    else if(end_cnt)begin
        key_vld <= ~key_in_ff1;
    end
    else begin
        key_vld <= 0;
    end
end
endmodule
View Code

 

标签:cnt,检测,低电平,key,按键,rst,reg
From: https://www.cnblogs.com/wen2376/p/17703703.html

相关文章

  • 缺陷检测常见的工业层架构
    百度智能云缺陷检测工业产线架构机械系统,包括供料收料装置、上料周转和下料分拣装置、姿态变换机构、光学检测机构、机架,起到功能支撑的作用;电气系统,包括动力元件、控制元件、控制器件、人机交互、光学元件和子系统和电柜,起到控制支撑作用;软件系统,包括总控制软件、子系统软件、人机......
  • Yolov5——训练目标检测模型详解(含完整源码)
    项目的克隆打开yolov5官网(官网地址),下载yolov5的项目:环境的安装(免额外安装CUDA和cudnn)打开anaconda的终端,创建新的名为yolov5的环境(python选择3.8版本):condacreate-nyolov5python=3.8执行如下命令,激活这个环境:condaactivateyolov5打开pytorch的官网,选择自己显卡......
  • Lnton羚通视频分析算法平台人员闯入算法检测告警详细介绍
    Lnton羚通的算法算力云平台有以下显著特点:高性能、高可靠性、高可扩展性和低成本。用户可以通过该云平台获取高效、强大的算法计算服务,快速而灵活地运行各种复杂的计算模型和算法。该平台广泛涵盖机器学习、人工智能、大数据分析和图像识别等领域。此外,云平台还提供丰富的算法库和......
  • 【代码分享】PHP对接网易易盾活体检测代码风险,简单粗暴实现
    在一些日常应用中,有些敏感数据或者功能,需要用到对应真实本人进行业务操作,所以我们就会用到活体实人认证的功能,在对接过程中,发现网易易盾的较为好用,现在把实现代码贴出来,本案例仅提供数据端,前端模板大家可以自行设置接入步骤第一步注册网易易盾账号,进行业务申请获取参数所需......
  • 儿童坐便器亚马逊爆品需要做的检测认证?CPC认证
    儿童座便器,是为儿童量身定制的。最初为了培养宝宝自己坐便的习惯,座便器会设计的很人性化。适宜儿童心理和生理。比如坐便器的内圈大小,适合宝宝小屁屁。座便器一改成人马桶的死气沉沉,有一些小动物图案,吸引宝宝去完成坐,并逐渐养成习惯,那么和将来宝宝上幼儿园就接轨了。但是生产就离......
  • 基于开源模型搭建实时人脸识别系统(二):人脸检测概览与模型选型
    续基于开源模型的实时人脸识别系统进行人脸识别首要的任务就是要定位出画面中的人脸,这个任务就是人脸检测。人脸检测总体上算是目标检测的一个特殊情况,但也有自身的特点,比如角度多变,表情多变,可能存在各类遮挡。早期传统的方法有HaarCascade、HOG等,基本做法就是特征描述子+滑窗+......
  • 你的GB7000.202嵌入式灯检测报告
    灯具第2-2部分:特殊要求嵌入式灯具GB7000.202-200852021-04-121标志灯具第2-2部分:特殊要求嵌入式灯具IEC60598-2-2:2011EN60598-2-2:2012,BSEN60598-2-2:2012,AS/NZS60598.2.2:20162.62021-04-12灯具第2-2部分:特殊要求嵌入式灯具GB7000.202-200......
  • Lnton羚通算法算力云平台工服识别算法、工装穿戴检测系统着装合规检测识别系统实际应
    Lnton羚通的算法算力云平台是一款出色的解决方案,具备突出的特点。该平台提供高性能、高可靠性、高可扩展性和低成本的功能,使用户能够高效地执行各种复杂的计算任务。此外,平台还提供了丰富的算法库和工具,支持用户上传和部署自定义算法,提高了平台的灵活性和个性化能力。工服识别检测......
  • 上架亚马逊儿童折叠式和非折叠式椅子和凳子的检测认证?CPC认证
    本政策适用的儿童折叠式和非折叠式椅子和凳子儿童折叠式和非折叠式椅子和凳子是带有刚性框架的座椅家具,用于支撑儿童的身体,使其能够以直立或倾斜的姿势坐立或休息。本政策适用的折叠椅和折叠凳的座部高度不超过15英寸,可能带或不带摇摆底座,儿童可在无人帮助的情况下坐上去或下来。......
  • Unity射线检测
    Unity射线检测Unity2d射线检测Unity3d射线检测 将射线显示出来Debug.DrawRay(transform.position,Vector2.down*0.11f,Color.red);RaycastHit2Dhit=Physics2D.Raycast(transform.position,Vector2.down,0.15f,1<<8);......