感谢锆石科技。
学了一下锆石科技的按键消抖,真的是突然豁然开朗,收益匪浅。锆石科技代码风格就是将时序逻辑和组合逻辑分开,用类似于状态机的方式赋值,这样真的,让我思路很清晰,逻辑条理也很好,不容易因为赋值问题出现bug。可能是我太菜了呜呜呜。
我就写一下这个计数20ms的按键消抖程序吧。
首先是变量定义,因为要分开时序和组合来写,因此要定义的变量有点多,且都是经过了一个D触发器的:
input clk;
input rst_n;
input key;
output led; //输出led,信号与key_out连接,组合逻辑
reg [20:0] time_cnt; //20ms计数器,时序逻辑
reg [20:0] time_cnt_next; //计数器下一个状态值,组合逻辑
reg key_in_r; //按键输入寄存,时序逻辑
reg key_out; //消抖后的按键输出,时序
reg key_out_next; //按键输出的下一个状态,组合
wire key_press; //检测按键按下,组合
parameter SET_TIME_20MS = 21'd1_000_000; //20ms的计数值
通过RTL可以发现,时序逻辑要用的当前状态都是由next状态经过D触发器所得