请关注微信公众号“FPGA科技室“

本文讲解利用***verilog实现矩阵键盘的驱动设计***
,在此之前,想必学过单片机的小伙伴应该很熟悉矩阵键盘,单片机用c语言实现了矩阵键盘驱动的设计(行扫描)…本文是基于FPGA来设计矩阵键盘驱动(4 * 4),且使用LED灯状态来表示所按下的键值。

由于最早的MCU的IO口相对很少,且如果在比较大的系统中,需要扩大人机交互,就要很多的按键,结果就是系统最终占用大量的IO。所以,矩阵键盘可以在一定程度上解决IO占用过多而浪费的现象。

在矩阵键盘中,每条行线和列线在交叉处都不是简单的直接连同,而是通过一个按键相连,通过这样的结构,一个4*4的具有16个按键的矩阵键盘就只需要8根控制线来控制。

**

简述原理

:**

由上图发现,共8根信号线,其中COL(列控制线)将每一列的四个按键的一端连接在一起,而ROW(行控制线)将每一行的4个按键一端连接在一起,那么由8根信号线构成的4行4列结构可以管理16个按键,只用了少量的IO口接收按键的输入。

利用列扫描法,4根行控制线被上面的上拉电阻拉至高电平,因此,在没有按键按下的情况下,使用FPGA的IO得到ROW信号上的电平应该是默认的高电平。
如何检测呢:
例如,我们使COL0=0,然后去读取ROW的值,若4个ROW信号电平全部为高,则表示当前列没有按键按下,就切换扫描后面一列,再去读取4个ROW信号电平;当扫描到第三列时,即COL=4’b1011时,检测到ROW=4’b1011,则说明A按键被按下。


本次设计依旧用到状态机,那么描述状态转移条件就显得格外重要:
IDLE:用来检测是否有按键被按下,无按键按下时,行控制线KEY-board-row-i 等于4’b1111=15,当有按键按下时,KEY-board-row-i 不等于15,则进入下一个状态P_FILTER状态。

P_FILTER:进行按键消抖的检测,判断是否是按键按下,若的确是按键按下,则进入下一个状态read_row_p获取行状态的值。

READ_ROW_P: 读取行状态并将存入到寄存器中,并将第0列拉低,进入下一个状态SCAN_C0进行行扫描。

SCAN_C0:进行列扫描,判断该列是否有按键按下,判断行输入是否等于1111=15,若不等15则说明该列有按键按下,反之,将第一列拉低,状态进入下一个SCAN_C1.

SCAN_C1:进行列扫描,判断该列是否有按键按下,判断行输入是否等于1111=15,若不等15则说明该列有按键按下,反之,将第二列拉低,状态进入下一个SCAN_C2.

SCAN_C2:进行列扫描,判断该列是否有按键按下,判断行输入是否等于1111=15,若不等15则说明该列有按键按下,反之,将第三列拉低,状态进入下一个SCAN_C3.

SCAN_C3:进行列扫描,判断该列是否有按键按下,判断行输入是否等于1111=15,若不等15则说明该列有按键按下,反之,状态跳转到PRESS_RESULT输出结果.

PRESS_RESULT:输出扫描结果。

WAIT_R: 等待按键释放,若KEY-board-row-i =15 ,说明按键被释放,状态回到释放消抖状态R_FILTER.

R_FILTER:检测按键是否完全被释放,则跳转到READ_ROW_R状态读取按键行输入状态。

READ_ROW_R:读取按键行输入状态。

画出状态转移图后,就可以“看图说话”了。

状态编码(独热码)

延时计数器(计数来延时20ms,用于消抖部分)

产生延时完成信号(20ms结束)

矩阵键盘扫描状态机





将扫描结果译码输出

仿真验证:利用testbench+仿真模型方式进行仿真。
仿真模型:
`timescale 1ns/1ns

module Key_Board_model(Key_Col,Key_Row);

input [3:0] Key_Col; //矩阵键盘列输入
output reg [3:0]Key_Row; //行输出

reg [15:0] myrand;
reg [3:0] Key_Row_r; //行寄存器
reg key_row_sel; //行选通
reg [1:0]now_col,now_row; //当前行列

initial begin
now_col = 0;
now_row = 0;
key_row_sel = 0;
myrand = 0;
end

initial begin
Key_Row_r = 4’b1111;
#50000000;
press_key(0,0);
press_key(0,1);
press_key(0,2);
press_key(0,3);

press_key(1,0);
press_key(1,1);
press_key(1,2);
press_key(1,3);press_key(2,0);
press_key(2,1);
press_key(2,2);
press_key(2,3);press_key(3,0);
press_key(3,1);
press_key(3,2);
press_key(3,3);
$stop;

end

task press_key;
input [1:0]row,col;
begin
key_row_sel = 0;
Key_Row_r = 4’b1111;
Key_Row_r[row] = 0;
now_row = row;
repeat(20)begin //随机产生按下时20个不同状态
myrand = {KaTeX parse error: Expected 'EOF', got '}' at position 7: random}̲ % 65536; …random} % 65536;
#myrand Key_Row_r[row] = ~Key_Row_r[row];
end
Key_Row_r = 4’b1111;
#22000000;
end
endtask

always@(*)
if(key_row_sel)
case(now_row)
2’d0:Key_Row = {1’b1,1’b1,1’b1,Key_Col[now_col]};
2’d1:Key_Row = {1’b1,1’b1,Key_Col[now_col],1’b1};
2’d2:Key_Row = {1’b1,Key_Col[now_col],1’b1,1’b1};
2’d3:Key_Row = {Key_Col[now_col],1’b1,1’b1,1’b1};
endcase

else
Key_Row = Key_Row_r;
endmodule

最后编写整个仿真的测试顶层代码。

观察波形,看出当按键检测完成信号key_flag有效时,key_board_row_r寄存器中行值为1110,此时的列值col_tmp为0001,检测结果key_VALUE_tmp=1110_0001,所以经过译码,得到key_value为第一行第一列,键值为0000.

更多内容请关注微信公众号“FPGA科技室“

FPGA矩阵键盘的驱动设计与验证相关推荐

  1. FPGA—HDMI 显示器驱动设计与验证(附代码)

    目录 1.理论 2.实操 2.1 顶层模块 2.2 时钟生成模块 2.3 HDMI 驱动控制模块 2.3.1 编码模块 2.3.2 并行转串行模块 2.4 顶层仿真验证 3.总结 1.理论 HDMI简 ...

  2. VGA显示器驱动设计与验证

    VGA显示器驱动设计与验证 1.VGA显示原理 VGA显示器显示图像,并不是直接让图像在显示器上显示出来,而是采用扫描的方式,将构成图像的像素点,在行同步信号和场同步信号的同步下,按照从上到下.由左到 ...

  3. TFT_LCD液晶屏驱动设计与验证

    TFT_LCD液晶屏驱动设计与验证 注:在本实验工程中,输出信号中包含 HV 同步模式下需要的行.场同步信号(hsync. vsync)和 DE 同步模式下的 tft_de 信号,各信号正确输出.读者 ...

  4. HDMI显示器驱动设计与验证

    HDMI显示器驱动设计与验证 HDMI组成 HMDI数据传输图 TMDS信号连接图 HDMI彩条显示实验整体框图

  5. TFT显示屏驱动设计与验证

    TFT显示屏驱动设计与验证 RGB 接口的 TFT 屏扫描方式和 VGA (Video Graphics Array)标准类似,也是使用行列扫描的方式.在介绍 TFT 屏扫描原理之前,先来介绍下 VG ...

  6. 线性序列机与串行接口ADC驱动设计与验证

    线性序列机与串行接口ADC驱动设计与验证 ADC128S022 型 ADC 内部工作原理 在 AC620 开发板上使用的模数转换器为逐次逼近型的低功耗芯片 ADC128S022,其具有 8 通道以及 ...

  7. 线性序列机与串口接口DAC驱动设计与验证

    线性序列机与串口接口DAC驱动设计与验证 TLV5618 型 DAC 内部工作原理 TLV5618 是一个基于电压输出型的双通道 12 位单电源数模转换器,其由串行接口.一个速度和电源控制器. 电阻网 ...

  8. Ti AM335X工控模块矩阵键盘电路的设计与驱动移植

    本内容的验证使用的盈鹏飞嵌入式CoM-335x核心模块及评估板EAC-335X,简要介绍如下: 前言 与按键相比,矩阵按键(键盘)使用更少的GPIO实现更多按键接口.以下,基于COM-335x核心模块 ...

  9. 矩阵键盘简易计算机设计报告,矩阵键盘设计实验报告.doc

    南 京 林 业 大 学 实验报告 基于AT89C51 单片机4x4矩阵键盘接口电路设计 课 程 机电一体化设计基础 院 系 机械电子工程学院 班 级 学 号 姓 名 指导老师 杨雨图 201 南京林业 ...

最新文章

  1. 重磅直播|基于激光雷达的感知、定位导航应用
  2. java spring 传大数据类型_Spring MVC前后端数据交互总结
  3. jquery selector 基础
  4. LevelDB (1)概述
  5. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)
  6. 什么是python的第三方库_python学习(十九)常见的第三方库
  7. C语言中,scanf与scanf_s的简单区别
  8. SpringBoot工程发布
  9. B00016 交换变量a和b的值
  10. web程序设计基础——学习通选择判断复习(1)
  11. Java FX小项目国际象棋
  12. STM32Cube IDE环境安装
  13. [BZOJ]4453: cys就是要拿英魂!
  14. mmClassification学习笔记
  15. python爬取其他人微信朋友圈_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈...
  16. Application.streamingAssetsPath在android和ios和pc上的读取
  17. python——常见运算符号
  18. c++plus_6th_第4章
  19. 【天眼数聚】微信小程序 活体识别提示“照片质量低”
  20. 关于有向图强连通分量 和 无向图双联通分量的理解

热门文章

  1. windows基于face_recognition实现人脸识别
  2. wh计算公式_100wh等于多少毫安
  3. 【【51单片机红外遥控小风车】】
  4. nrf52832 DUF功能加看门狗
  5. G711编码原理及代码
  6. jquery flot详解
  7. html怎么切换下一页,css-上下页切换
  8. SP91 PMIC AuxADC待机唤醒现象
  9. [LOJ572]Misaka Network 与求和
  10. 2012美国大选献金项目(最详细解释)