0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA学习系列:26. 矩阵键盘的设计

FPGA学习交流 2018-08-09 10:47 次阅读

设计背景:

矩阵键盘在工程设计越来越多的被用到,已然成为了我们做开发接触到的不可缺少的小型项目,利于我们理解设计方向的原理为以后的强化学习打好了坚实的基础。

设计原理:

在使用按键的时候,如果按键不多的话,我们可以直接按键与FPGA相连接,但是如果按键比较多的时候,如何还继续使用直接按键与FPGA相连接的话,所会大量增加FPGA端口的消耗,为了减少FPGA端口的消

耗,我们可以把按键设计成矩阵的形式,就如下图所示:

image.png

由上图可以知道,矩阵键盘的行row(行)与col(列)的交点,都是通过一个按键来相连接。传统的一个按键一个端口的方法,若要实现16个按键,则需要16个端口,而现在这个矩阵键盘的设计,16个按键,仅仅需要8个端口,如果使用16个端口来做矩阵键盘的话,可以识别64个按键,端口的利用率远远比传统的设计好的多,所以如果需要的按键少的话,可以选择传统的按键设计,如果需要的按键比较多的话,可以采用这种矩阵键盘的设计。而我们现在就以扫描法为例来介绍矩阵键盘的工作原理

首先col(列)是FPGA给矩阵键盘输出的扫描信号,而row(行)是矩阵键盘反馈给FPGA的输入信号,用于检测哪一个按键被按下来,如下图所示:

image.png

详细如上图所示,FPGA给出扫描信号COL[3:0]COL = 4’b0111,等下一个时钟周期COL = 4’b1011,再等下一个时钟周期COL =4’b1101,再等下一个时钟周期COL = 4’b1110,再等下一个时钟周期COL = 4’b0111COL就是这样不断循环,给矩阵键盘一个低电平有效的扫描信号,当FPGA给矩阵键盘COL扫描信号的同时,FPGA也要在检测矩阵键盘给FPGA的的反馈信号ROW,举个例子,假若矩阵键盘中的9号案件被按下了:

COL = 4’b1101ROW =4’b1011 ;

9号按键被按下的时候,9号按键的电路就会被导通,扫描电路COL开始扫描,当扫描到COL[1]的时候,由于9号按键的电路被导通了,COL[1]的电压等于ROW[2]的电压,所以会出现当COL = 4’b1101的时候ROW = 4’b1011;然后我们就可以利用这一种现象,来设计一个识别按键的电路。

设计架构图:

image.png

设计代码:

设计模块

0modulekey_borad(clk,rst_n,row,col,key_num);

1 inputclk;

2 inputrst_n;

3 input[3:0]row; //输入反馈信号

4

5

6 outputreg[3:0]col; //输出扫描信号

7 outputreg[3:0]key_num; //按键值得输除

8

9 reg[15:0]count;

10

11 parameterT1ms =50000;//扫描的时间间隔 50000 * 20ns

12 //parameter T1ms = 5;

13

14 regflag;

15 always@(posedgeclk ornegedgerst_n)

16 if(!rst_n)

17 begin

18 count <=16'd0;

19 flag <=1'b0;

20 end

21 else

22 begin

23 if(count <T1ms -1)//计数时间

24 begin

25 count <=count +1'b1;

26 flag <=0;

27 end

28 else

29 begin

30 flag <=1'b1;//计数到了就给一个标志位

31 count <=16'b0;

32 end

33 end

34 always@(posedgeclk ornegedgerst_n)

35 if(!rst_n)

36 begin

37 col <=4'b0111;

38 end

39 else

40 begin

41 if(flag)

42 col <={col[2:0],col[3]};//列扫描

43 else

44 col <=col;

45 end

46

47 //键值得翻译模块

48 always@(posedgeclk ornegedgerst_n)

49 if(!rst_n)

50 key_num =4'd0;

51 else

52 case({row,col}) //位拼接行和列的信号,翻译出对应的键值

53 8'b0111_0111:key_num =4'hf;

54 8'b0111_1011:key_num =4'he;

55 8'b0111_1101:key_num =4'hd;

56 8'b0111_1110:key_num =4'hc;

57

58 8'b1011_0111:key_num =4'hb;

59 8'b1011_1011:key_num =4'ha;

60 8'b1011_1101:key_num =4'h9;

61 8'b1011_1110:key_num =4'h8;

62

63 8'b1101_0111:key_num =4'h7;

64 8'b1101_1011:key_num =4'h6;

65 8'b1101_1101:key_num =4'h5;

66 8'b1101_1110:key_num =4'h4;

67

68 8'b1110_0111:key_num =4'h3;

69 8'b1110_1011:key_num =4'h2;

70 8'b1110_1101:key_num =4'h1;

71 8'b1110_1110:key_num =4'h0;

72 default:;

73 endcase

74endmodule

测试模块

0`timescale1ns/1ps

1

2modulekey_borad_tb();

3 regclk;

4 regrst_n;

5 reg[4:0]pressnum;//按键的值

6 wire[3:0]row;

7

8 wire[3:0]col;

9 wire[3:0]key_num;//输出的值

10

11 initialbegin

12 clk =1'b1;

13 rst_n =1'b0;

14 pressnum =5'd16;

15

16 #200.1

17 rst_n =1'b1;

18 #1000

19 pressnum =5'd16;

20

21 #1000

22 pressnum =5'd8;

23

24 #1000

25 pressnum =5'd16;

26

27 #1000

28 pressnum =5'd15;

29 #1000

30 pressnum =5'd16;

31 #1000

32 $stop;

33

34 end

35 always#10clk =~clk;

36 //例化对应的模块

37 key_top borad_dut(

38 .clk(clk),

39 .rst_n(rst_n),

40 .row(row),

41 .col(col),

42 .key_num(key_num)

43 );

44 yingjian yingjian_dut(//硬件检测电路 //此模块自己可以设计

45 .clk(clk),

46 .rst_n(rst_n),

47 .col(col),

48 .row(row),

49 .pressnum(pressnum)

50 );

51endmodule

仿真:

在仿真图中可以清晰的看出当按键按下的时候为8,显示出来的键值也为8,当抬起的时候为16,那么键值就保持不变,在设置的时候我们设置的是按键抬起为16,通过验证我们得到我们的设计是正确的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21307

    浏览量

    593113
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132147
收藏 人收藏

    评论

    相关推荐

    至芯科技昭哥带你学FPGAFPGA_100天之旅_矩阵键盘设计

    本文属于本人原创,和大家一起学习FPGA,交流FPGA,希望大家多多支持。来源:至芯科技昭哥带你学FPGAFPGA_100天之旅_
    发表于 10-17 10:06

    基于FPGA的4x4键盘矩阵

    基于FPGA的4x4键盘矩阵
    发表于 12-14 01:26

    【梦翼师兄今日推荐】 矩阵键盘程序设计讲解

    将和大家一起学习扫描键盘的电路原理以及驱动方式。项目需求设计4*4矩阵键盘按键扫描模块,正确解析按键值。矩阵
    发表于 12-03 21:43

    独立键盘矩阵键盘简析

    小白的学习笔记参上!!点击我的蓝色字体去往我的笔记就行了,我来整合一下目录,方便大家一起交流准备*.1蓝桥杯的板子的初始化和蜂鸣器关闭1.流水灯流水灯学习2.独立键盘矩阵
    发表于 01-17 06:14

    基于FPGA开发板的矩阵键盘实验设计与实现

    1、基于FPGA开发板的矩阵键盘实验设计与实现在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在
    发表于 07-08 17:32

    4*4矩阵键盘设计及源代码

    4*4矩阵键盘设计及源代码 一 实验目的1 学习使用4X4 扫描键盘的设计方法;2 实践对比按键抖动对扫描键盘输出的影响二 实验原理及说明
    发表于 02-08 16:30 472次下载

    单片机入门教程第26课-矩阵键盘接口技术及编程

    单片机入门教程第26课-矩阵键盘接口技术及编程 1、矩阵键盘的结构与工作原理  在键盘中按
    发表于 01-07 15:21 2285次阅读
    单片机入门教程第<b class='flag-5'>26</b>课-<b class='flag-5'>矩阵</b>式<b class='flag-5'>键盘</b>接口技术及编程

    基于FPGA矩阵键盘控制器的设计

    为改变采用CPU 控制矩阵键盘导致CPU 资源利用下降及引脚不足的现状,介绍了一种基于FPGA矩阵键盘控制器的开发。在ISE13.4 开
    发表于 11-18 11:45 4617次阅读

    矩阵键盘有什么用_矩阵键盘有何用途

    本文开始介绍了什么是矩阵键盘矩阵键盘的组成结构,其次详细阐述了矩阵键盘用途,最后介绍了
    发表于 02-24 14:01 1.6w次阅读

    FPGA学习系列26. 计算器的设计

    设计背景:计算器是设计中经常用到的一个操作软件,设计和学习计算器使我们亲密的联系所学的各模块, 对我们的学习有很大的帮助和提升。希望大家来学习 设计原理: 本次的设计主要通过矩阵
    的头像 发表于 08-13 13:45 4034次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>学习</b><b class='flag-5'>系列</b>:<b class='flag-5'>26.</b> 计算器的设计

    矩阵键盘的按键识别方法_矩阵键盘扫描程序

    矩阵键盘的按键识别方法来自简单日记网精选推荐。在学习有关矩阵键盘的时候,往往要学会矩阵
    的头像 发表于 04-20 09:39 3.2w次阅读

    单片机学习(五)LCD1602和矩阵键盘的使用

    单片机学习(五)LCD1602和矩阵键盘的使用
    发表于 12-04 09:06 12次下载
    单片机<b class='flag-5'>学习</b>(五)LCD1602和<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>的使用

    蓝桥杯单片机学习记录4矩阵键盘

    蓝桥杯单片机学习记录4矩阵键盘蓝桥杯的矩阵键盘和一般的51不一样一般的51矩阵
    发表于 12-29 19:20 0次下载
    蓝桥杯单片机<b class='flag-5'>学习</b>记录4<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>

    stm32矩阵键盘学习笔记

    矩阵键盘矩阵键盘简介矩阵键盘扫描原理端口的配置相关函数的编写主函数与其他串口的接线与
    发表于 01-13 16:27 36次下载
    stm32<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b><b class='flag-5'>学习</b>笔记

    基于FPGA的4x4矩阵键盘驱动设计

    本次设计采用FPGA驱动4x4矩阵键盘,这个原理其实很简单,但是我在做的时候曾经理解错了一个地方,导致走了一天的弯路,因为感觉比较有意思,所以想在这分享一下。
    的头像 发表于 07-23 11:41 1987次阅读
    基于<b class='flag-5'>FPGA</b>的4x4<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>驱动设计