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

15-触摸按键控制LED灯的更多相关文章

  1. 嵌入式Linux学习入门:控制LED灯

    记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...

  2. arduino 红外遥控器控制LED灯

    /* 日期:2016.9.1 功能:红外遥控器控制LED灯 开,关,闪烁,呼吸 元件: 跳线公公头 * 5 led 220欧电阻 红外接收管,红外遥控 接线: 红外灯面向自己从左到右分别接 IO3 , ...

  3. arduino入门学习实现语音控制LED灯

    需要的准备的硬件arduino+PC+麦克风实现语音命令控制LED灯的亮灭. 首先需要将写好的arduino程序烧录到arduino uno主板中,下面是代码如下: int val;//定义变量val ...

  4. C#与Arduino通过串口通信来控制LED灯的状态

    一.引言 最近摆弄了一段时间的Arduino,发现Arduino做一些电子类项目.监控.机器人.电子玩具比较容易,并且Arduino与.NET程序集成也不难.接下来介绍一个简单的小程序,C#做的一个W ...

  5. BLE 安卓APP控制LED灯的实现(转)

    源:BLE 安卓APP控制LED灯的实现 //注:参考AmoMcu源代码修改. 打开APP,检查蓝牙是否打开 BluetoothAdapter mBluetoothAdapter; final Blu ...

  6. enc28J60 网页控制LED灯

    软件IDE:Arduino 1.6.3 1.库的安装: 从https://github.com/jcw/ethercard 下载源码包,解压,复制ethercard-master文件夹到Arduino ...

  7. 云中树莓派(4):利用声音传感器控制Led灯

    云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感 ...

  8. 树莓派开机运行Python脚本 控制LED灯闪烁

    一.新建一个开机运行文件 在 /home/pi/.config 下创建一个文件夹,名称为 autostart,并在该文件夹下创建一个led.desktop文件(文件名以.desktop结尾) 编辑le ...

  9. Arduino控制LED灯(开关控制)

    问题:当使用"digitalRead(BUT) == 1"控制LED灯时会出现"digitalWrite(LED, ledState);"的值出现跳动. 原因: ...

  10. (三)开关检测来控制LED灯的亮灭

    开关检测案例一: 具体电路图如下: K1--K4闭合,控制 D1—D4 亮灭 产生的问题: 1.关于 R8 R9 R7 R10 的阻值选择问题,倘若太大的话,  比如10K 不管开关断开还是闭合,好像 ...

随机推荐

  1. 2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵。

    2023-12-23:用go语言,一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 现在军队只找到了1只小船,这船最多能同时坐上2个士兵. ...

  2. 华企盾DSC无法从网页下载客户端(无法访问web端)

    解决方法1:服务器安装目录需要安装在英文目录,否则DSCApache.exe会启动不了,导致无法访问5580网页. 解决方法2:5580端口占用也会导致DSCApache.exe启动不了,可打开服务器 ...

  3. ElasticSearch之cat repositories API

    命令样例如下: curl -X GET "https://localhost:9200/_cat/repositories?v=true&pretty" --cacert ...

  4. springboot--ActiveMQ--消息队列

    ActiveMQ远程消息队列 一.我们创建springboot项目工程 二.创建完毕我们简单介绍 activeMQ 1.概述 消息中间件可以理解成就是一个服务软件,保存信息的容器,比如生活中的快递云柜 ...

  5. android学习笔记(1)

    Android 开发框架 android系统是一个开放且体积庞大的系统,从功能上,将android开发分为移植开发移动电话系统,android应用开发和android系统开发三种. 移动移植移动电话系 ...

  6. 扩展中国剩余定理(Excrt)笔记

    扩展中国剩余定理(excrt) 本来应该先学中国剩余定理的.但是有了扩展中国剩余定理,朴素的 CRT 就没用了. 扩展中国剩余定理用来求解如下形式的同余方程组: \[\begin{cases} x \ ...

  7. 2023-05-28:为什么Redis单线程模型效率也能那么高?

    2023-05-28:为什么Redis单线程模型效率也能那么高? 答案2023-05-28: 1.C语言实现,效率高 C语言程序运行速度快,因为其相较于其他高级语言更加接近底层机器.由于C语言直接操作 ...

  8. php +libcurl+nghttp2 实现高性能微服务架构

    1.server端nginx编译时增加参数configure --with-http_v2_module     server {        listen       80 http2;      ...

  9. 实例讲解基于Sermant快速开发服务治理插件

    本文分享自华为云社区<Sermant框架下的服务治理插件快速开发及使用指南>,作者: 华为云开源 . Sermant是基于Java字节码增强技术的云原生无代理服务网格,它具有非侵入.插件化 ...

  10. 详解Native Memory Tracking 追踪区域分析

    摘要:本篇将介绍NMT追踪区域的部分内存类型--Java heap.Class.Thread.Code 以及 GC. 本文分享自华为云社区<Native Memory Tracking 详解(2 ...