发 帖  
原厂入驻New
[问答] verilog 按键消抖代码
308 Verilog
分享
下面这段代码中的红框内,两句理解不了。
请大侠帮忙解惑,谢谢!

对于这段代码我的理解是:
复位之后,keyr[3:0]值是1111,
而keyr <= {keyr[2:0],key};后,keyr的值是1-1-1-key.
如果有键按下去,那么keyr的值是1110.
而keyr[2],keyr[3],一直都是1,
所以~keyr[2] & keyr[3]和keyr[2] & ~keyr[3]一直都是0.
key值( keyr[0])的变化对 key_neg和key_pos的值,没有影响。
我不知道,哪里有问题,谢谢

file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\14729019\QQ\WinTemp\RichOle\Z)Y`5F_Z0HJN3I@J8(7$@ST.png
0

QQ图片20200325135316.png (53.26 KB, 下载次数: 3)

QQ图片20200325135316.png
6 天前   评论 分享淘帖 邀请回答 举报
4个回答
平时1,一旦有按键,keyr就会置零,那&的结果就变了,不过写的有点繁琐,我当时看这个程序给简化了,按下和松开好像弄成一个,一年了,我给忘了怎么改的
首先明确一点,在红框代码中取反运算符~的优先级最高。代码里你对移位的理解是正确的。

常态,keyr=1111;此时,key_neg= 0与1 =0,key_pos= 1与0 =0.

按下,keyr=1110/1100/1000/0000;此时,key_neg= 1与1 =1,key_pos= 0与x =0.

松开,keyr=0001/0011/0111/1111;此时,key_neg= 1与0 或者 0与x =0,key_pos= 1与1 =1.
//-------------
至于程序是否要合并,看个人编码习惯。总之,代码越简单越容易理解。
reset 后 keyr=1111

     每个ext_clk_25m的上升沿会进行位移:把keyr低3位和key=1 的值写到 keyr

     key_neg 只要是keyr的最高位是0 就会判断按下
     key_pos 在keyr最高位是0,keyr[2]是1,就会判断释放   

     这样应该不怎么消抖吧    用连续几个位判断会不会好一点

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表腾博会app大厅下载 网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表