基于PLD的矩阵键盘状态机控制
时间:02-18
来源:互联网
点击:
讲过了独立按键检测,理所当然应该讲讲FPGA中矩阵键盘的应用了。这个思维和电路在FPGA中有所不同,在此,在此做详细解释,Bingo用自己设计的成熟的代码作为案例,希望对你有用。
一、FPGA矩阵键盘电路图
在FPGA中的电路,与单片机雷同,如下所示:
在上电默认情况下,L[3:0] =4''b1,因为上拉了3.3V,而默认情况下H.[3:0]为低电平;一旦有某一个按键被按下,便是是的该路电路流向该按键的H,是的L检测不到电流。因此可以通过对每一行H输出的控制,来检索是哪一个按键被按下了,这也原理和单片机中一样,只是写法不一样罢了。
二、FPGA矩阵键盘FSM
1. 代码
代码如下所示,采用了三段式状态机来描述矩阵键盘。本模块形式与上一张按键消抖动雷同,方便移植。
/*************************************************
* Module Name : matrix_key_design.v
* Engineer : Crazy Bingo
* Target Device : EP2C8Q208C8
* Tool versions : Quartus II 11.0
* Create Date : 2011-6-26
* Revision : v1.0
* Description :
**************************************************/
module matrix_key_design
(
input clk,
input rst_n,
input [3:0] col_data,
output reg [3:0] row_data,
output key_flag, //the mark of key is pressed
output reg [3:0] key_value
);
//generate for 2ms signal
reg [19:0] cnt; //fffff,≈50Hz 20ms
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt ---0----1----2----3
* | | | |
* R2 >---4----5----6----7
* | | | |
* R1 >---8----9----A----B
* | | | |
* R0 >---C----D----E----F
* | | | |
* C3 C2 C1 C0
*****************************************************/
parameter SCAN_IDLE = 3'b000;
parameter SCAN_JITTER= 3'b001;
parameter SCAN_COL0 = 3'b011;
parameter SCAN_COL1 = 3'b010;
parameter SCAN_COL2 = 3'b110;
parameter SCAN_COL3 = 3'b100;
parameter SCAN_READ = 3'b101;
parameter SCAN_JTTTER2= 3'b111;
reg [2:0] current_state;
reg [2:0] next_state;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
current_state
(2)模块可分为一下几个状态:
一、FPGA矩阵键盘电路图
在FPGA中的电路,与单片机雷同,如下所示:
在上电默认情况下,L[3:0] =4''b1,因为上拉了3.3V,而默认情况下H.[3:0]为低电平;一旦有某一个按键被按下,便是是的该路电路流向该按键的H,是的L检测不到电流。因此可以通过对每一行H输出的控制,来检索是哪一个按键被按下了,这也原理和单片机中一样,只是写法不一样罢了。
二、FPGA矩阵键盘FSM
1. 代码
代码如下所示,采用了三段式状态机来描述矩阵键盘。本模块形式与上一张按键消抖动雷同,方便移植。
/*************************************************
* Module Name : matrix_key_design.v
* Engineer : Crazy Bingo
* Target Device : EP2C8Q208C8
* Tool versions : Quartus II 11.0
* Create Date : 2011-6-26
* Revision : v1.0
* Description :
**************************************************/
module matrix_key_design
(
input clk,
input rst_n,
input [3:0] col_data,
output reg [3:0] row_data,
output key_flag, //the mark of key is pressed
output reg [3:0] key_value
);
//generate for 2ms signal
reg [19:0] cnt; //fffff,≈50Hz 20ms
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt ---0----1----2----3
* | | | |
* R2 >---4----5----6----7
* | | | |
* R1 >---8----9----A----B
* | | | |
* R0 >---C----D----E----F
* | | | |
* C3 C2 C1 C0
*****************************************************/
parameter SCAN_IDLE = 3'b000;
parameter SCAN_JITTER= 3'b001;
parameter SCAN_COL0 = 3'b011;
parameter SCAN_COL1 = 3'b010;
parameter SCAN_COL2 = 3'b110;
parameter SCAN_COL3 = 3'b100;
parameter SCAN_READ = 3'b101;
parameter SCAN_JTTTER2= 3'b111;
reg [2:0] current_state;
reg [2:0] next_state;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
current_state
(2)模块可分为一下几个状态:
FPGA 电路 电路图 单片机 电流 Quartus 相关文章:
- 基于FPGA的片上系统的无线保密通信终端(02-16)
- 基于Virtex-5 FPGA设计Gbps无线通信基站(05-12)
- 基于FPGA的DVI/HDMI接口实现(05-13)
- 基于ARM的嵌入式系统中从串配置FPGA的实现(06-09)
- 采用EEPROM对大容量FPGA芯片数据实现串行加载(03-18)
- 赛灵思:可编程逻辑不仅已是大势所趋,而且势不可挡(07-24)