FPGA触摸按键控制LED灯
一、原理:
电容触摸按键主要由按键 IC 部分和电容部分构成。按键 IC 部分主要由元器件供应商提供,用于将电容的变化转换为电信号。电容部分指的是由电容极板,地,隔离区等组成触摸按键的电容环境。任何两个导电的物体之间都存在着感应电容,在周围环境不变的情况下,该感应电容值是固定不变的。如下图1所示,手指接触到触摸按键时,按键和手指之间产生寄生电容,使按键的总容值增加。
触摸按键按下前后,电容的变化如图 2所示。电容式触摸按键 IC 在检测到按键的感应电容值改变,并超过一定的阈值后,将输出有效信号表示按键被按下。
二、实现功能:
使用触摸按键控制 LED 灯亮灭,开发板上电后 LED 为点亮状态,手指触摸后 LED 熄灭,再次触摸,LED 点亮。
三、功能模块结构:
四、功能代码:
1.逻辑代码:
module touch_led(
input clk ,
input rst_n ,
input touch_key,
output reg led
);
//参数定义
reg touch_key_r0; //同步触摸按键状态
reg touch_key_r1; //打拍触摸按键状态
wire touch_en ; //检测状态上升沿,即触摸按键有效使能
//对触摸按键数据进行同步、打拍
always @(posedge clk or negedge rst_n) begin
if(!rst_n)begin
touch_key_r0 <= 1'b0;
touch_key_r1 <= 1'b0;
end
else begin
touch_key_r0 <= touch_key ;
touch_key_r1 <= touch_key_r0;
end
end
//检测电平的上升沿,因触摸按键按下时电平会升高
assign touch_en = (~touch_key_r1) & touch_key_r0;
//当检测到上升沿时,让LED的状态反转
always @(posedge clk or negedge rst_n) begin
if(!rst_n)begin
led <= 1'b1; //led默认状态点亮
end
else if(touch_en)begin
led <= ~led;
end
end
endmodule
2.仿真代码:
`timescale 1ns/1ps
module tb_touch_led();
reg tb_clk ;
reg tb_rst_n ;
reg tb_touch_key;
wire tb_led ;
always #10 tb_clk = ~tb_clk;
initial begin
tb_clk <= 1'b0;
tb_rst_n <= 1'b0;
tb_touch_key <= 1'b0;
#20 tb_rst_n <= 1'b1;
#10 tb_touch_key <=1'b1;
#30 tb_touch_key <=1'b0;
#20 tb_touch_key <=1'b1;
#10 tb_touch_key <=1'b0;
end
touch_led u_touch_led(
.clk (tb_clk ),
.rst_n (tb_rst_n ),
.touch_key (tb_touch_key),
.led (tb_led )
);
endmodule