verilog 按键消抖 vs 边沿检测

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog 按键消抖 vs 边沿检测相关的知识,希望对你有一定的参考价值。

//按键消抖部分
always @(posedge clock)
begin
if(div_clk)
begin
dout1 <= key;
dout2 <= dout1;
dout3 <= dout2;
end
end

//按键边沿检测部分
always @(posedge clock)
begin
buff <= dout1 | dout2 | dout3;
end

assign key_edge = ~(dout1 | dout2 | dout3) & buff;
请问我把按键边沿检测改成
assgin buff = dout1 | dout2 | dout3;
assign key_edge = ~(dout1 | dout2 | dout3) & buff;
可以不?

参考技术A 可以,放在always里,是每个上升沿执行,而放在assin里是后面的操作数变化才执行。
要想得到好的消抖效果,采样周期最好大于20ms,也就是说你上面的div_clk很重要。另外一个小的建议,if—else最好都有,负责可能综合时出现锁存器。
以上纯属个人见解,希望能帮到您。追问

thaks all the same。 我试了几遍还是不行,clk改到25ms也不行。 我在控制直流电机,改来改去,就这块不能改。一改就不动了。
对于if-else的else,如果没有else该怎么改呢?

追答

if(~div_clk)
begin
dout1 <= 1'b0;
dout2 <= 1'b0;
dout3 <= 1'b0;
end
else
begin
dout1 <= key;
dout2 <= dout1;
dout3 <= dout2;
end
最好不要让RTL中出现锁存器,除非是为了低功耗。
可以看看这种方式,http://wenku.baidu.com/link?url=AeM7JRIKiJ8L-qlwTRI9sCTsTwk6m51Fy_0Qh3SoO9_sBiqPa9C_w54U_EK0aeUwhhSxmhlqRg5SODmfd3CwZf8qy72oE1C3-YSoX6gQq-y

本回答被提问者采纳

以上是关于verilog 按键消抖 vs 边沿检测的主要内容,如果未能解决你的问题,请参考以下文章

按键消抖

按键信号的边沿检测

关于按键消抖实验

Verilog实现按键消抖

verilog 按键消抖

09A-独立按键消抖实验01——小梅哥FPGA设计思想与验证方法视频教程配套文档