一、移位消抖:process(clk,key_in)
variable filter:std_logic_vector(2 downto 0)
begin
if clk'event and clk = '0'亏拍 then
filter(2 downto 1) := filter(1 downto 0)
filter(0) := key_in
if filter = "000" then key_out <='0'
else key_out <= '1'
end if
end if
end process
二、延时消抖:把按键信号跟一个200HZ左右的时钟信号通过一个二输入与门输出
不拿明懂的可以跟我交流
reg [2:0] low_sw_r //将low_sw信号锁存一个时钟周期,延时不是真的“锁存”always @ ( posedge clk or negedge rst_n )
if (!rst_n)
low_sw_r <= 3'b111
else
low_sw_r <= low_sw
wire [2:0] led_ctrl = low_sw_r[2:0] &( ~low_sw[2:0])
就是这一段消抖的,考虑键没有按下的和碧岁情况,low_sw_r应该是高电平,low_sw一样,这样led_ctrl是0,如果有键按下,low_sw先变成0,而low_sw_r要等到20ms后才置0,因此在这个时间段里led_ctrl就变成1, 因此就检测到了按键的下降沿变化.
同样的,下面这段
always @ (posedge clk or negedge rst_n)
if (!rst_n)
begin
d1 <= 1'b0
d2 <= 1'b0
d3 <= 1'b0
end
else
begin
if ( led_ctrl[0] ) d1 <= ~d1
if ( led_ctrl[1] ) d2 <唤睁= ~d2
if ( led_ctrl[2] ) d3 <= ~d3
end
也是20ms采样一次led_ctrl的结果,如果毛刺小慧启于20ms,那么led_ctrl置0的时间同样也会小于20ms,那么这段程序就检测不到led_ctrl的变化了.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)