时序图
代码
key_filter.v文件
module key_filter
(
input wire sys_clk ,
input wire sys_rst_n ,
input wire key_in ,
output reg key_flag
);
reg [19:0] cnt;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 20'd0;
else if(key_in == 1'b1)
cnt <= 20'd0;
else if(cnt == 20'd999_999) //key_in处于低电平的情况
cnt <= 20'd999_999;
else
cnt <= cnt + 20'd1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
key_flag <= 1'b0;
else if(cnt == 20'd999_998) //当计数器计数到999_998时即20ms,key_flag产生一个脉冲信号
key_flag <= 1'b1;
else
key_flag <= 1'b0;
endmodule
tb_key_filter.v文件
`timescale 1ns/1ns
module tb_key_filter();
//声明变量
reg sys_clk;
reg sys_rst_n;
reg key_in;
wire key_flag;
reg [27:0] tb_cnt;
//初始化变量
initial
begin
sys_clk = 1'b0;
sys_rst_n <= 1'b0;
#20
sys_rst_n <= 1'b1;
end
//系统时钟初始化,周期为20ns
always #10 sys_clk = ~sys_clk;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
tb_cnt <= 28'd0;
else if(tb_cnt == 28'd2_500_000)
tb_cnt <= 28'd0;
else
tb_cnt <= tb_cnt + 28'd1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
key_in <= 1'b1;
else if((tb_cnt > 28'd250_000) && (tb_cnt < 28'd500_000))
key_in <= {$random} % 2;
else if((tb_cnt > 28'd500_000) && (tb_cnt < 28'd1_750_000))
key_in <= 1'b0;
else if((tb_cnt > 28'd1_750_000) && (tb_cnt < 28'd2_000_000))
key_in <= {$random} % 2;
else
key_in <= 1'b1;
//实例化
key_filter key_filter_inst
(
.sys_clk (sys_clk) ,
.sys_rst_n (sys_rst_n) ,
.key_in (key_in) ,
.key_flag (key_flag)
);
endmodule