在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → 按键消抖(Key_debounce_nb.v)

按键消抖(Key_debounce_nb.v)

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:3.55KB
  • 下载次数:6
  • 浏览次数:80
  • 发布时间:2020-11-11
  • 实例类别:一般编程问题
  • 发 布 人:626lzr
  • 文件格式:.v
  • 所需积分:2
 相关标签: 按键消抖

实例介绍

按键消抖

//---------------------------------------------------------------------------
//-- 文件名 : Key_debounce_nb.v
//--  作者 : LZH
//-- 描述 : n位输入去抖电路
//-- 修订历史 : 2020-07-17
//---------------------------------------------------------------------------
`define K_BIT           1             //输入按键位宽
`define CLK_TIME        26'd250000 //200Hz,  50M/200Hz = 250000

module Key_debounce_nb
(
//Input
CLK_50M,RST_N,KEY_IN,
//Output
KEY_OUTH,KEY_OUTL
);
//---------------------------------------------------------------------------
//-- 外部端口声明
//---------------------------------------------------------------------------
input CLK_50M; //时钟的端口,开发板用的50M晶振
input RST_N; //复位的端口,低电平复位
input             KEY_IN;           //n位输入按键
output KEY_OUTH; //n位去抖输出(高电平有效)
output KEY_OUTL; //n位去抖输出(低电平有效)

//---------------------------------------------------------------------------
//-- 内部端口声明
//---------------------------------------------------------------------------
reg [25:0] time_cnt; //用于记录一个时钟所用时间的定时器
reg [25:0] time_cnt_n; //time_cnt的下一个状态
wire     [`K_BIT-1:0] KEY_IN;     //n位输入按键
wire     [`K_BIT-1:0] KEY_OUTH; //n位去抖输出(高电平有效)
wire     [`K_BIT-1:0] KEY_OUTL; //n位去抖输出(低电平有效)
reg      [`K_BIT-1:0] key_in1; //按键的第1次采样值
reg      [`K_BIT-1:0] key_in1_n; //key_in1的下一个状态
reg      [`K_BIT-1:0] key_in2; //按键的第2次采样值
reg      [`K_BIT-1:0] key_in2_n; //key_in2的下一个状态

//---------------------------------------------------------------------------
//-- 逻辑功能实现
//---------------------------------------------------------------------------
//时序电路,用来给time_cnt寄存器赋值
always @ (posedge CLK_50M or negedge RST_N)
begin
if(!RST_N) //判断复位
time_cnt <= 26'h0; //初始化time_cnt值
else
time_cnt <= time_cnt_n; //用来给time_cnt赋值
end

//组合电路,实现nHz的定时计数器
always @ (*)
begin
if(time_cnt == `CLK_TIME - 26'd1)//判断nHz时间
time_cnt_n = 26'h0; //如果到达nHz,定时器清零
else
time_cnt_n = time_cnt 26'd1;//如果未到,定时器继续加1
end

//时序电路,用来给key_in1寄存器赋值
always @ (posedge CLK_50M or negedge RST_N)
begin
if(!RST_N) //判断复位
key_in1 <= `K_BIT'h0; //初始化key_in1值
else
key_in1 <= key_in1_n; //用来给key_in1赋值
end

//组合电路,实现key_in1_n的结果
always @ (*)
begin
if(time_cnt == `CLK_TIME - 26'd1)//判断定时时间
key_in1_n = KEY_IN; //如果到达定时时间,输入键值
else
key_in1_n = key_in1;          //如果未到,保持键值
end

//时序电路,用来给key_in2寄存器赋值
always @ (posedge CLK_50M or negedge RST_N)
begin
if(!RST_N) //判断复位
key_in2 <= `K_BIT'h0; //初始化key_in2值
else
key_in2 <= key_in2_n; //用来给key_in2赋值
end

//组合电路,实现key_in2_n的结果
always @ (*)
begin
if(time_cnt == `CLK_TIME - 26'd1)//判断定时时间
key_in2_n = key_in1; //如果到达定时时间,输入键值
else
key_in2_n = key_in2;          //如果未到,保持键值
end

assign KEY_OUTH = key_in1 && key_in2;//连续2次采样为高电平
assign KEY_OUTL = key_in1 || key_in2;//连续2次采样为低电平

endmodule


标签: 按键消抖

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警