首页 > 其他分享 >15-触摸按键控制LED灯

15-触摸按键控制LED灯

时间:2023-06-03 16:37:11浏览次数:43  
标签:LED 电容 触摸 sys key 按键 touch 15

1.触摸按键

触摸按键可分为四大类:电阻式,电容式,红外感应式和表面声波式

  • 电阻式触摸按键使用人体破压电阻,改变电阻,实现开关效果,耐用性差,很少使用
  • 红外感应式是通过红外扫描的方式,一般使用在比较恶劣的环境当中
  • 表面声波式主要通过声波扫描的方式进行识别按键是否被按下,主要用于公共场合中
    电容式触摸按键主要由按键IC部分和电容部分构成;按键IC用于将电容的变化转变为电信号;电容部分指的是由电容极板,地,隔离区等组成触摸按键的电容环境
  • 电容式触摸按键是利用人体感应电容来检测按键是否按下,当按键没有被按下的时候是左边的情况,按键与地之间存在一定的静态电容,当按键被按下之后是右边的情况,此时,人体的电容会耦合到静态电容上,按键的电容变大,按键IC会将按键电容的变化转变为电信号,电信号的变化超过阈值就会判定为按键按下

2.FPGA设计

  • 使用触摸按键控制LED灯,按下点亮,再按一次熄灭

2.1 模块框图及波形图绘制


没有触摸按键的时候是高电平,触摸按键的时候是低电平,低电平的维持时间是和触摸时间是一致的,松开之后又会回到高电平

采用touch_key信号控制按键,按键点亮需要一直按在按键上,如何实现按一次点亮,再按一次熄灭?采用touch_key的下降沿控制输出信号进行取反,触摸按键没有按下的时候,输出信号保持原来的值,检测到下降沿的时候进行取反,等到下一个下降沿的时候再次进行取反,就可以实现

如何采集下降沿,使用寄存器?

  • 在时钟的上升沿,将key_touch赋值给寄存器1(touch_key_1),将触摸按键和时钟进行同步
  • 再声明一个寄存器变量(touch_key_2),在时钟上升沿将寄存器1的值给寄存器2,这样就实现了一个信号打拍的效果
  • 使用touch_key_1和touch_key_2提取输入触摸按键的下降沿,再声明一个变量touch_flag,初始值为低电平,touch_key_1为高电平,touch_key_2为低电平,产生一个周期的高脉冲
  • 用key_flag信号产生led的输出信号

    边沿检测电路:一个信号经过打拍,用上一时刻的信号与这一时刻的信号进行异或操作,相同为0,不同为1,可以检测到边沿发生变化,将产生的异或信号再与打拍之后的信号进行与操作可以得到脉冲信号

2.2 RTL

module touch_ctrl_led(
  input wire sys_clk,
  input wire sys_rst_n,
  input wire touch_key,

  output reg led
  
);

  // 声明三个变量
  reg touch_key_1;
  reg touch_key_2;
  wire touch_flag;

 always @ (posedge sys_clk or negedge sys_rst_n)
  if(!sys_rst_n)
    begin
      touch_key_1 <= 1'b1;
      touch_key_2 <= 1'b0;
    end
  else
    begin
      touch_key_1 <= touch_key;
      touch_key_2 <= touch_key_1;
    end
  
  assign touch_flag = (touch_key_1 && touch_key_2) ? 1'b1 : 1'b0;
  
 // 输出信号
  always @ (posedge sys_clk or negedge sys_rst_n)
    if(!sys_rst_n)
      led <= 1'b1;
    else if(touch_flag)
      led <= ~led;
    else
      led <= led;
  
endmodule

2.3 边沿检测

  • 边沿检测主要的作用是能够准确的识别出单bit信号的上升沿或者是下降沿,我们希望当上升沿或者下降沿来的时候能够产生一个脉冲标志信号,告诉我们上升沿或者下降沿到来了,可以将脉冲标志信号作为后续功能电路的启动条件
  • 边沿检测就需要对输入的单bit信号进行打拍,使用两个变量,进行打拍(一个进行同步,一个进行打拍)
  • 使用组合逻辑对于边沿检测没有延迟一拍的效果,使用时序逻辑会有延迟一拍的效果
// 时序逻辑采样,上升沿
always @ (posedge sys_clk or negedge sys_rst_n)
  if(!sys_rst_n)
    podge <= 1'b0;
  else if((touch_key_1 == 1'b1) && (touch_key_2 == 1'b0))
    podge <= 1'b1;
  else
    podge <= 1'b0;

 
always @ (posedge sys_clk or negedge sys_rst_n)
  if(!sys_rst_n)
    podge <= 1'b0;
  else if((touch_key_1 == 1'b0) || (touch_key_2 == 1'b1))
    podge <= 1'b0;
  else
    podge <= 1'b1;

// 时序逻辑采样,下升沿
always @ (posedge sys_clk or negedge sys_rst_n)
  if(!sys_rst_n)
    nedge <= 1'b0;
  else if((touch_key_1 == 1'b0) && (touch_key_2 == 1'b1))
    nedge <= 1'b1;
  else
    nedge <= 1'b0;

 
always @ (posedge sys_clk or negedge sys_rst_n)
  if(!sys_rst_n)
    nedge <= 1'b0;
  else if((touch_key_1 == 1'b1) || (touch_key_2 == 1'b0))
    nedge <= 1'b0;
  else
    nedge <= 1'b1;

2.4 Testbench

`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

标签:LED,电容,触摸,sys,key,按键,touch,15
From: https://www.cnblogs.com/Icer-newer/p/17453767.html

相关文章

  • 无法删除索引 1553 - Cannot drop index ‘fk_pptn_r_emtc‘: needed in a foreign ke
    标题标题:解决问题:1553-无法删除索引‘fk_pptn_r_emtc’:外键约束需要引言:在数据库管理中,经常会遇到各种问题和错误。其中之一是"1553-无法删除索引‘fk_pptn_r_emtc’:外键约束需要"错误。这个错误可能会导致数据库操作受阻,影响系统的正常运行。在本篇博客中,我们将深入探讨这......
  • LED定制模组行业市场调研分析与未来发展前景报告2023-2029
    2023-2029全球LED定制模组行业调研及趋势分析报告2022年全球LED定制模组市场规模约亿元,2018-2022年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2029年市场规模将接近亿元,未来六年CAGR为%。从核心市场看,中国LED定制模组市场占据全球约%的市场份额,为全球最主要的......
  • LED点阵显示器行业市场调研分析与未来发展前景报告2023-2029
    2023-2029全球LED点阵显示器行业调研及趋势分析报告内容摘要2022年全球LED点阵显示器市场规模约亿元,2018-2022年年复合增长率CAGR约为%,预计未来将持续保持平稳增长的态势,到2029年市场规模将接近亿元,未来六年CAGR为%。从核心市场看,中国LED点阵显示器市场占据全球约%的市场份......
  • P1545 [USACO04DEC] Dividing the Path G 题解
    丢一发好理解又好写的线段树优化dp。题目传送门简要题意给定一个长为\(l\)的线段,求出尽量少的不相交区间覆盖整段线段,要求题目给的所有子区间只被\(1\)个区间覆盖。分析显然题目给的子区间\([s,e]\)中只有\(s\)和\(e\)端点能作为线段端点,所以我们应该给\([s+1,......
  • Debian11安装GNOME-TWEAKS报错WARNING : Shell not installed or running
    先写结论:打开方式是按下Alt+F2弹出命令窗输入gnome-tweaks,就会弹出优化界面,点击扩展就可以按需开启扩展插件。还有一种方法,如果你在安装debian11系统时安装完了GNOME,那么你可以在显示应用程序内找到一个叫工具的软件合集,内有名叫优化的程序。闲聊:不过其实一开始我就注意到了有这......
  • Vue进阶(幺零八):npm run build 错误 (node:7852) UnhandledPromiseRejectionWarning: Cs
    (文章目录)一、前言在项目打包过程中,突然报如下错误:Vuenpmrunbuild错误(node:7852)UnhandledPromiseRejectionWarning:CssSyntaxError:xxxx.但是在执行npmrundev过程中,并未错误或告警信息。二、解决方案打开webpack.prod.conf.js,注释掉以下配置代码newOptimiz......
  • 读书笔记: Psychological Power between knowledge and practice; Inverted Totalitar
    JohnDeweyonceremarkedthatequalitybecomesdangerouswhenitiswidelypraisedbutemptyinpractice. Howtogeneratesuchkindofpsychologicalandsocialpower?Thepropagandaorganizationsadminidtratemassivemedia. Perhapsthemostcrucialel......
  • 2015.4.22.20.46_ecilipse_8.30_Eclipse 10个最有用的快捷键_0.01
    Eclipse中10个最有用的快捷键组合一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合。通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升。1.ctrl+shift+r:打开资源这可能是所有快捷键组合中最省时间的了。这组快捷键可以让你打开你的......
  • 2015.4.24.17.36_pencil_2015.4.24_Pencil教程=自定义组件安装_0.01
    在前面《原型工具Pencil使用介绍》中有说到Pencil支持自定义组件安装,也简易的介绍了安装使用方法,这里再详细的介绍一下如何安装自定义组件。在最新版本的Pencil1.3中,自带的组件库是比较少的,只有三个,但在Pencil1.2版本中自带的组件库有七个,而且1.3个人感觉只是界面布局上的更新,操......
  • 2015.4.24.17.23_界面_2015.4.24__Android界面设计工具_0.01
    iOS,Android原型图设计软件–>AxureRP,UIDesigner,Pencil,iPhoneMockup,Justinmind<–#AxureRPAxureRP-快速原型制作软件–线框图,原型,规格文档,由美国AxureSoftwareSolutions,Inc.公司开发。AxureRP也分商业版和免费版,英文官方:http://www.axure.com/download中文网站:h......