本节的实验任务是使用触摸按键控制LED灯的亮灭,开发板上电后LED为点亮状态,手指触摸后LED熄灭;当再次触摸时,LED点亮。
一、项目总体思路的构建
触摸按键可以通过轻触的形式,实现传统意义机械式按键的功能。电容式触摸按键的原理:手是自带电容的,当手按下触摸按键时,电容的容值提高;当手离开触摸按键时,电容的容值降低。
以下是本开发板的触摸按键模块电路设计图。采用的是AR101触摸IC。端口3为触摸按键的输入端口,1K的电阻起保护作用,C16电容起到改变触发的灵敏度。初始的输出量为低电平。当手触摸按键时,端口3收集到信号后由AR101触摸IC转变为高电平传输到端口1输出。
下图为正点原子启明星开发板上的触摸按键模块:
了解完所有开发的模块后,我们构建一个思维导图来确定我们的实验流程:
我们根据上述的思路绘制图像来模拟触摸按键控制LED灯功能的实现,架构的设计图如下:
波形图如下:
二、编写代码
进入rtl文件夹,在此文件夹内建立touch_led.v文件开始编写程序。当机械按键按下时就会有高电平信号,而触摸按键的信号需要有一个识别的过程,我们需要使用打两拍的方法来采集上升沿信号。RTL代码如下:
♾️ verilog 代码:module touch_led(
input sys_clk,
input sys_rst_n,
input touch_key,
output reg led
);
reg touch_key_d0;
reg touch_key_d1;
wire pos_touch_key;
assign pos_touch_key = ~touch_key_d1 & touch_key_d0; //采集上升沿
//打两拍
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
touch_key_d0 <= 1'b0;
touch_key_d1 <= 1'b0;
end
else begin
touch_key_d0 <= touch_key;
touch_key_d1 <= touch_key_d0;
end
end
//LED信号翻转
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
led <= 1'b1;
else if(pos_touch_key)
led <= ~led;
else
led <= led;
end
endmodule
三、验证仿真
在sim文件夹建立tb_touch_led.v文件,用来编辑仿真文件。仿真代码与前两次相似,这里就不过多赘述。tb代码如下:
♾️ verilog 代码:`timescale 1ns/1ns //仿真单位/仿真精度
module tb_touch_led();
parameter CLK_PERIOD = 20;
reg sys_clk;
reg sys_rst_n;
reg touch_key;
wire led;
initial begin
sys_clk <= 1'b0;
sys_rst_n <= 1'b0;
touch_key <= 1'b0;
#200
sys_rst_n <= 1'b1;
#1000
touch_key <= 1'b1; //按键被按下
#1000
touch_key <= 1'b0; //按键被释放
#1000
touch_key <= 1'b1; //按键被按下
#1000
touch_key <= 1'b0; //按键被释放
end
always #(CLK_PERIOD/2) sys_clk =~ sys_clk;
touch_led u_touch_led(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.touch_key (touch_key ),
.led (led )
);
endmodule
仿真图像如下,由仿真图像我们可以看出touch_key_d0与touch_key_d1取反相与就可以得到一个时钟信号长度的上升沿信号。上升沿信号结束后led信号取反,由此可以看出仿真与我们的实验目的相符合,RTL代码正确。
四、上板验证
查询开发板资料,设置好IO口,并烧录,最终结果如下:
👍
💖
💯
💦
😄
🪙
👍
💖
💯
💦
😄
🪙