如何做网站网站的教程,网站开发的技术意义,会员卡管理系统软件,免费申请httq//网站?目录 1.原理
2.代码
2.1 key_filter.v
2.2 tb_key_filter.v 1.原理 按键分为自锁式按键和机械按键#xff0c;图左边为自锁式按键 上图为RS触发器硬件消抖#xff0c;当按键的个数比较多时常常使用软件消抖。硬件消抖会使用额外的器件占用电路板上的空间。
思路就是使用延…目录 1.原理
2.代码
2.1 key_filter.v
2.2 tb_key_filter.v 1.原理 按键分为自锁式按键和机械按键图左边为自锁式按键 上图为RS触发器硬件消抖当按键的个数比较多时常常使用软件消抖。硬件消抖会使用额外的器件占用电路板上的空间。
思路就是使用延时程序去掉抖动的部分抖动就是不规则的高低电平变化。 只要在20ms之内没有抖动的产生就可以认为按键的可用的。计数器的作用就是当检测道低电平时就开始计数当检测到高电平时就清零。
因为50MHZ的时钟周期为20ns要计满20ms20ms20000_000ns则计数器要计数20000_000/201000_000个时钟周期所以计数器的值是从0-999_999。 出现了一个问题若稳定的时间足够长在稳定期间就会出现多次清零多个最大值多个脉冲信号这不是我们想要的结果。为此对波形图做修改。 此时的原理就是当计数道最大值时计数器不清零直到下一个按键输入检测到为高电平再清零。
但此时输出信号就不再是一个脉冲信号了而是一个长长的高电平。因此再次对波形图做修改。 当计数到999_999-1时就把输出拉高一个时钟周期然后清零。 以上这张图的tb_cnt是为了仿真的。19-49前抖动149-199赋值随机数模拟抖动后抖动0-19199-249赋值为高电平模仿按键未被按下其余时间赋值为0模仿按键按下。
2.代码
2.1 key_filter.v
module key_filter
#(parameter CNT_MAX20d999_999
)
(input wire sys_clk ,input wire sys_rst_n ,input wire key_in ,output reg key_flag
);reg [19:0] cnt_20ms ;always (posedge sys_clk or negedge sys_rst_n)if (sys_rst_n1b0)cnt_20ms20d0;else if(key_in1b1)cnt_20ms20d0;else if(cnt_20msCNT_MAX)cnt_20msCNT_MAX;elsecnt_20mscnt_20ms20d1;always (posedge sys_clk or negedge sys_rst_n)if (sys_rst_n1b0)key_flag1b0;else if(cnt_20msCNT_MAX-20d1)key_flag1b1;elsekey_flag1b0;endmodule
2.2 tb_key_filter.v
timescale 1ns/1ns
module tb_key_filter();reg sys_clk ;
reg sys_rst_n;
reg key_in ;
reg [7:0] tb_cnt ;//使用计数器进行一个周期的计数模拟一次按键按下计数的最大值暂定为250次8位wire key_flag ;initialbeginsys_clk1b1;sys_rst_n1b0;#20sys_rst_n1b1;endalways #10 sys_clk~sys_clk;always(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n1b0)tb_cnt8d0;else if(tb_cnt8d249)tb_cnt8d0;elsetb_cnttb_cnt8d1;//模拟按键过程,检测到低电平开始计数检测到高电平清0
always(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n1b0)key_in1b1;else if(((tb_cnt8d19)(tb_cnt8d49))||((tb_cnt8d149)(tb_cnt8d199))) //模仿抖动key_in{$random}%2;else if((tb_cnt8d19)||(tb_cnt8d199))//模仿按键未被按下key_in1b1;else key_in1b0; //模仿稳定时候key_filter
#(.CNT_MAX(20d24) //相当于计数25
)
tb_key_filter
(. sys_clk (sys_clk),. sys_rst_n (sys_rst_n),. key_in (key_in) ,. key_flag (key_flag)
);endmodule 计数器最大计数到249共计数250正确。 0-19 key_in是高电平 计数器计数19-49模拟抖动 49-149模拟按键按下稳定状态 观察标志信号确在计数稳定25次之后也就是计数第24的时候拉高标志信号一个时钟周期