洗子の小窝 但行己路 无问山海
歌曲封面 未知作品
  • 歌曲封面大人中卢广仲
  • 歌曲封面听见了吗卢广仲
  • 歌曲封面帰ろう藤井風
  • 歌曲封面きらり藤井風
Title

【FPGA】触摸按键控制LED灯

洗子

·

Article
⚠️ 本文最后更新于2024年06月07日,已经过了129天没有更新,若内容或图片失效,请留言反馈
本节的实验任务是使用触摸按键控制LED灯的亮灭,开发板上电后LED为点亮状态,手指触摸后LED熄灭;当再次触摸时,LED点亮。

一、项目总体思路的构建

触摸按键可以通过轻触的形式,实现传统意义机械式按键的功能。电容式触摸按键的原理:手是自带电容的,当手按下触摸按键时,电容的容值提高;当手离开触摸按键时,电容的容值降低。

Clip_2024-03-24_17-51-47

以下是本开发板的触摸按键模块电路设计图。采用的是AR101触摸IC。端口3为触摸按键的输入端口,1K的电阻起保护作用,C16电容起到改变触发的灵敏度。初始的输出量为低电平。当手触摸按键时,端口3收集到信号后由AR101触摸IC转变为高电平传输到端口1输出。

Clip_2024-03-24_00-16-00

下图为正点原子启明星开发板上的触摸按键模块:

Clip_2024-03-23_20-29-37

了解完所有开发的模块后,我们构建一个思维导图来确定我们的实验流程:

触摸按键控制LED灯模块

我们根据上述的思路绘制图像来模拟触摸按键控制LED灯功能的实现,架构的设计图如下:

触摸按键控制LED灯演示图

波形图如下:

touch_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代码正确。

Clip_2024-03-24_00-10-17

四、上板验证

查询开发板资料,设置好IO口,并烧录,最终结果如下:

现在已有 2 条评论,0 人点赞
Comment
发表
  1. 头像
    @
    🐈️ 二猫
    会技术就是不一样欸🥳
    · Chrome

    👍

    💖

    💯

    💦

    😄

    🪙

    👍 0 💖 0 💯 0 💦 0 😄 0 🪙 0
    1. 头像
      @
      哈哈哈哈自己瞎玩的😄
      · Chrome

      👍

      💖

      💯

      💦

      😄

      🪙

      👍 0 💖 0 💯 0 💦 0 😄 0 🪙 0
搜 索 消 息 足 迹
你还不曾留言过..
你还不曾留下足迹..
博主 欢迎访问洗子的小站,常来访哦! 不再显示
博主