FPGA 按键消抖的问题

哪位大神能帮忙解释下下面这段程序?是怎么实现消抖的?为什么是count【17】?//按键消抖处理部分assignkey_done=(dout1|dout2|dout3);... 哪位大神能帮忙解释下下面这段程序?是怎么实现消抖的?为什么是count【17】?
//按键消抖处理部分
assign key_done = (dout1 | dout2 | dout3); //按键消抖输出
always @(posedge count[17])
begin
dout1 <= key_in;
dout2 <= dout1;
dout3 <= dout2;
end
always @(negedge key_done[0])
begin
keyen = ~keyen; //将琴键开关转换为乒乓开关
end

还有下面这段程序
//按键检测并消抖
always @(posedge divclk)
begin
if(!s3) begin
case(count3)
0: count3 <= count3 + 1'b1;
1: s3down <= 1'b1;
endcase
end
else begin
count3 <= 1'b0;
s3down <= 1'b0;
end
end
万分感谢啊
展开
 我来答
leijj06
2012-07-14 · TA获得超过650个赞
知道小有建树答主
回答量:244
采纳率:100%
帮助的人:173万
展开全部

消抖分为硬件消抖和软件消抖:硬件消抖是使用积分器或是低通滤波器等手段滤除按键抖动,而软件消抖是通过编程来解决。以下是按键输出电平示意图:

可以看出,消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。一般来说,软件消抖的方法是不断检测按键值,直到按键值稳定。实现方法:假设未按键时输入1,按键后输入为0,抖动时不定。可以做以下检测:检测到按键输入为0之后,延时20ms,再次检测,如果按键还为0,那么就认为有按键输入。延时的20ms恰好避开了抖动期。

程序中所用的方法是不断检测按键值。每当Count[17]上升沿到来,就进行检测输入信号。其中dout1,dout2,dout3分别为当前、上个Count[17]上升沿、上上个Count[17]上升沿输入数值。正常情况下为1,假如连续三次为0,三个信号相与,使得key_done信号为0,出现下降沿,这样就认为是有按键。

另外,你问为什么是count[17],由于你本身没写清楚count[17]的定义,所以没有确定答案。不过据猜测,count[17]只是一个延时信号而已。很有可能count是一个18位的计数器,每一个时钟周期计数一次,那么他计数262143次为一个周期,出现一次上升沿。如果按照26M时钟计算的话,count[17]出现两个上升沿之间间隔约为10ms,连续检测3次就是在0ms,10ms,20ms处都检测到0,才算是有按键输入。

如果不明白可继续追问。

大陈看教育
2021-03-23 · 用心做教育 教育要用心
大陈看教育
采纳数:19 获赞数:907

向TA提问 私信TA
展开全部

Arduino按钮传感器使用Bounce2库(软件消抖),亲测效果很好,需要库文件请留言。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tigers19890102
2012-07-14 · TA获得超过290个赞
知道小有建树答主
回答量:168
采纳率:0%
帮助的人:100万
展开全部
这个肯定不是职业FPGA设计师写的程序吧?使用count[17]触发,是为了计数2^18才进行一次触发,也就是间隔很长一段时间才进行一次输入检测,换句话就是如果有按键进来之后,会在一段相对较长时间后才对输入进行再次检测, 功能当然就是按键消抖了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hsboyfxj
2012-07-14
知道答主
回答量:44
采纳率:0%
帮助的人:16.7万
展开全部
简单讲消抖就是用比较慢的时钟去采按键输入。 count[17] 相当于时钟的分频。
下面的divclk也是一个分频的时钟吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式