FPGA|CPLD|ASIC论坛
直播中

郝会轩

10年用户 144经验值
擅长:嵌入式技术
私信 关注
[资料]

【锆石A4 FPGA试用体验】触摸按键

本帖最后由 hhxdianzi 于 2016-9-5 09:47 编辑

    今天看了一下板子触摸按键部分,触摸按键的原理是手指触碰PCB导致寄生电容变化,从而引起充电时间的变化,这个相信很多小伙伴都有了解。锆石A4 FPGA开发板上面的触摸按键是通过触摸芯片TTP226 检测。TTP226可选直连、矩阵和串行这三种模式,直连可输入8路Pad触摸按键,开发板采用的便是此模式,不过开发板只用了4路。另外此芯片可选择64阶灵敏度、可选输出类型、可选输出的有效电平,刷新速率约50Hz,而且带自校准,详细参数详见。但是开发板上貌似采用默认模式,裁剪了很多功能,不能使用FPGA的管脚去配置TTP226。
以下是锆石A4 FPGA开发板触摸按键部分电路
1.png 2.png
没连接的配置接口默认电平如下:
3.png
以下是TTP226datasheet里面的典型电路:
4.png
特别需要注意的是:在上电之后有一段稳定时间,在此期间不要触摸键区(key-pad),且功能无
效,TTP226 的是0.8~1.0秒。
由于手册自动去抖动这里介绍不是很详细,因此自己写了一个触摸按键的驱动,兼容机械按键。以下是锆石A4的按键驱动:
  1. //---------------------------------------------------------------------------
  2. //--        逻辑功能实现        
  3. //---------------------------------------------------------------------------
  4. //时序电路,用来key_in_r寄存器赋值
  5. always @ (posedge CLK_50M, negedge RST_N)
  6. begin
  7.         if(!RST_N)                                                                //判断复位
  8.                 key_in_r <= 8'h00;                                //初始化key_in_r值
  9.         else
  10.                 key_in_r <= KEY;                                        //将按键的值赋值给key_in_r
  11. end

  12. assign key_press = key_in_r ^ KEY;        //检测按键有没有变化

  13. //时序电路,用来给time_cnt寄存器赋值
  14. always @ (posedge CLK_50M, negedge RST_N)
  15. begin
  16.         if(!RST_N)                                                                //判断复位
  17.                 time_cnt <= 21'h0;                                //初始化time_cnt值
  18.         else
  19.                 time_cnt <= time_cnt_n;                        //用来给time_cnt赋值
  20. end

  21. //组合电路,实现20ms的定时计数器
  22. always @ (*)
  23. begin
  24.         if(time_cnt == SET_TIME_20MS || key_press) //判断按键有没有变化、时间有没有到
  25.                 time_cnt_n = 21'h0;                                //如果到达20ms或者按键有了变化,那么定时计数器将会被清零
  26.         else
  27.                 time_cnt_n = time_cnt + 1'b1; //如果未到20ms或者按键没有变化,那么定时计数器将会继续累加
  28. end

  29. //时序电路,用来key_out寄存器赋值
  30. always @ (posedge CLK_50M, negedge RST_N)
  31. begin
  32.         if(!RST_N)                                                                //判断复位
  33.                 key_out <= 8'h00;                                        //初始化key_out值
  34.         else
  35.                 key_out <= key_out_n;                        //用来给key_out赋值
  36. end

  37. //组合电路,每20ms接收一次按键的值
  38. always @ (*)
  39. begin
  40.         if(time_cnt == SET_TIME_20MS)                //判断20ms时间
  41.                 key_out_n = key_in_r;                        //如果到达20ms,接收一次按键的值
  42.         else
  43.                 key_out_n = key_out;                                //如果未到20ms,保持原状态不变
  44. end

  45. assign LED = key_out;                                        //将消抖的按键值赋值给LED
如果多个按键同时按下可能会导致去抖动的延时出问题,也没有加以验证。自己写的有些复杂了,使用了状态机,参考了之前看过的小梅哥的按键的视频,利用两个寄存器判断上升沿和下降沿,先熟悉一下,在后续信号输入检测环节中会用到。以下是按键检测模块代码:
  1. module KEY
  2. (
  3.         Clk,
  4.         Rst_n,
  5.         Key_In,
  6.         Key_Value,
  7.         Key_Flag
  8. );

  9. input Clk,Rst_n;
  10. input Key_In;
  11. output reg Key_Value;
  12. output reg Key_Flag;


  13. reg Key_Last;
  14. reg Key_Now;
  15. wire Pedge;
  16. wire Nedge;
  17. always@(posedge Clk or negedge Rst_n)
  18. if(!Rst_n)
  19.         begin
  20.                 Key_Last <= 1'b0;   //下拉的按键,默认低电平
  21.                 Key_Now <= 1'b0;
  22.         end
  23. else
  24.         begin
  25.                 Key_Now <= Key_In;
  26.                 Key_Last <= Key_Now;
  27.         end
  28.         
  29. assign Pedge = Key_Now & (!Key_Last);
  30. assign Nedge = (!Key_Now) & Key_Last;


  31. reg Fil_Start;
  32. reg [22:0]Fil_Cnt;
  33. always@(posedge Clk or negedge Rst_n)
  34. if(!Rst_n)
  35.         Fil_Cnt <= 23'd0;
  36. else if(Fil_Start == 1)
  37.         Fil_Cnt <= Fil_Cnt + 1'b1;
  38. else
  39.         Fil_Cnt <= 1'b0;

  40. parameter Fil_Tim = 23'd1_000_000;//默认20ms,最大值8388607        
  41. reg Fil_Over;
  42. always@(posedge Clk or negedge Rst_n)
  43. if(!Rst_n)
  44.         Fil_Over <= 1'b0;
  45. else if(Fil_Cnt == Fil_Tim)
  46.         Fil_Over <= 1'b1;
  47. else
  48.         Fil_Over <= 1'b0;
  49.         
  50. localparam Wait_Down = 2'd0,
  51.            Down_Fil         = 2'd1,
  52.                           Wait_Up         = 2'd2,
  53.                           Up_Fil         = 2'd3;
  54. reg [1:0]Key_State;
  55. always@(posedge Clk or negedge Rst_n)
  56. if(!Rst_n)        
  57.         begin                        
  58.                 Key_State <= Wait_Down;
  59.                 Fil_Start <= 1'b0;
  60.                 Key_Value <= 1'b0;
  61.                 Key_Flag <= 1'b0;
  62.         end
  63. else
  64.         case(Key_State)
  65.                 Wait_Down:
  66.                         if(Pedge)
  67.                                 begin
  68.                                         Key_State <= Down_Fil;
  69.                                         Fil_Start <= 1'b1;        
  70.                                         Key_Value <= 1'b0;
  71.                                 end
  72.                         else
  73.                                 begin
  74.                                         Key_State <= Wait_Down;
  75.                                         Key_Value <= 1'b0;
  76.                                 end
  77.                                 
  78.                 Down_Fil:
  79.                         if(Fil_Over == 1)
  80.                                 begin
  81.                                         Key_State <= Wait_Up;
  82.                                         Fil_Start <= 1'b0;
  83.                                         Key_Flag <= 1'b1;
  84.                                 end
  85.                         else if(Nedge)
  86.                                 begin
  87.                                         Key_State <= Wait_Down;
  88.                                         Fil_Start <= 1'b0;
  89.                                 end        
  90.                         else
  91.                                 Key_State <= Down_Fil;
  92.                         
  93.                 Wait_Up:
  94.                         if(Nedge)
  95.                                 begin
  96.                                         Fil_Start <= 1'b1;
  97.                                         Key_State <= Up_Fil;
  98.                                 end
  99.                         else
  100.                                 Key_State <= Wait_Up;
  101.                                 
  102.                 Up_Fil:
  103.                         if(Fil_Over == 1)
  104.                                 begin         
  105.                                         Key_State <= Wait_Down;
  106.                                         Fil_Start <= 1'b0;
  107.                                         Key_Value <= 1'b1;
  108.                                         Key_Flag <= 1'b0;
  109.                                 end
  110.                         else if(Pedge)
  111.                                 begin
  112.                                         Key_State <= Wait_Up;
  113.                                         Fil_Start <= 1'b0;
  114.                                 end
  115.                         else
  116.                                 Key_State <= Up_Fil;
  117.         endcase        
  118.                                                         
  119. endmodule
代码传进来之后格式就变了,大家凑活看吧,如果有问题或者有多余的地方,请指出。
以下是仿真结果:
5.png
我在Top实例化了4个按键,支持多个按键同时按下,这也得益于FPGA的并行的特点,由于个人习惯,现在按键不支持连按事件,每次抬起才算一次按键事件,效果图如下:
5.jpg
Quartus II 15的安装和破解相对简单一些,需要的小伙伴请留意一下,安装Quartus II 15的时候选择安装Modelsim Altera Starter 10.3d这个是免费的,不需要破解,也不用单独安装,用着暂时没有问题。https://yunpan.cn/cMDaWi8u99bub  访问密码 5b31
最后感谢电子发烧友和锆石的资源,菜鸟学习中,如果大家有更好的方案也欢迎指导!


回帖(4)

郝会轩

2016-9-4 23:25:30
沙发自己坐、如有修改内容见此层、、、
举报

jinyi7016

2016-9-5 09:47:53
15 的64位可以和谐成功么?13.1的64位和谐不成功。
举报

郝会轩

2016-9-5 09:59:05
本帖最后由 hhxdianzi 于 2016-9-5 10:00 编辑
引用: jinyi7016 发表于 2016-9-5 09:47
15 的64位可以和谐成功么?13.1的64位和谐不成功。

我电脑64位WIN7,可以的,用着暂时没问题。14之后的版本都不支持32位系统了,都是64位的。具体还能安装到什么系统也没有测试,请参考安装包里的破解文件,这里放两张图仅供参考。
QuartusII 15安装包.png

QuartusII 15破解.png

举报

agdhun

2016-9-5 11:25:09
本帖最后由 agdhun 于 2016-9-5 11:27 编辑

芯片内不弱上拉
举报

更多回帖

发帖
×
20
完善资料,
赚取积分