原理图
波形图
理解:
1.电容按键本身具有消抖的作用
2.两个flag为了找出key的下降沿
3.是的都是延时到下一个上升沿不过2相对1明显一些
trl(边沿检测下降沿)
module touch_ctrl_led
(
input wire sys_clk,
input wire sys_rst_n,
input wire touch_key,
output reg led
);
wire touch_flag;
reg touch_key1;
reg touch_key2;
//边沿检测
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
begin
touch_key1<=1'b1;
touch_key2<=1'b1;
end
else
begin
touch_key1<=touch_key;
touch_key2<=touch_key1;
end
assign touch_flag=((touch_key1==1'b0)&&(touch_key2==1'b1));
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
led<=1'b0;
else if (touch_flag==1'b1)
led<= ~led;
else
led<=led;
endmodule
sim
`timescale 1ns/1ns
module tb_touch_ctrl_led();
reg sys_clk;
reg sys_rst_n;
reg touch_key;
wire led;
initial
begin
sys_clk=1'b1;
sys_rst_n <= 1'b0;
touch_key <= 1'b1;
#20
sys_rst_n <= 1'b1;
#200
touch_key <= 1'b0;
#2000
touch_key <= 1'b1;
#1000
touch_key <= 1'b0;
#3000
touch_key <= 1'b1;
end
always #10 sys_clk= ~sys_clk;
touch_ctrl_led touch_ctrl_led_inst
(
.sys_clk (sys_clk) ,
.sys_rst_n (sys_rst_n) ,
.touch_key (touch_key) ,
.led (led)
);
endmodule