FPGA中用VHDL语句编写带有延时消抖的键盘扫描程序

FPGA中用VHDL语句编写带有延时消抖的键盘扫描程序,第1张

我用过两种方法消抖,都还不错,给你消空告参考:

一、移位消抖: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的变化了.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12356817.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存