给大家分享一些简单的代码。
很多FPGA初学者,不会做按键消抖,可能他们会写出这样的代码
always(*)
if(!key)
begin
//该按键的功能
end
意思是把按键当时钟来用,这样即没有消抖,也没有做同步。
我目前用的这个是计数消抖,设置一个计数器来消抖(消抖时间可任意设定),同时,产生一个跟时钟同步的单脉冲。
用计数器消抖很好理解,但是为什么要产生一个跟时钟同步的单脉冲呢?
这就是FPGA设计原则里面的同步原则,意思是每个模块都用同一个时钟(很多时候这个时钟是由PLL产生的),
这样的话,在按键消抖后面紧跟的模块就可以这样来处理这个单脉冲。
always(posedge clk)//clk是全局时钟,这个时钟跟消抖模块的时钟是相同的。
if(key) //key是消抖后,出来的单脉冲,高电平有效。
begin
//该按键的功能。
end