欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》
目录
一、理论基础
二、核心程序
三、测试结果
一、理论基础
基于FPGA的4x4矩阵键盘控制器是一种使用FPGA(现场可编程门阵列)来实现对4x4矩阵键盘进行控制的设备。该控制器能够有效地降低硬件资源的使用,提高系统的可靠性和稳定性,是现代电子产品中常用的一种输入设备。
4x4矩阵键盘控制器采用矩阵键盘作为输入设备,通过FPGA对键盘的扫描和识别,实现对键盘输入信号的采集和处理。其基本原理是将4行4列的16个按键排列成一个二维矩阵,其中行线和列线分别连接到FPGA的输入输出端口。在FPGA内部,通过编写程序实现键盘扫描和识别,将采集到的按键信号进行处理并输出到相应的设备中。
在4x4矩阵键盘控制器的实现过程中,需要使用到一些基本的电子电路和数字电路知识。其中,最核心的公式是行列消元法,即通过逐行扫描、逐列消元的方式,将按键信号解码并识别出来。具体实现过程中,可以采用如下公式:
对于第i行第j列的按键:
- 当第i行与第j列为低电平时,该按键未被按下;
- 当第i行与第j列为高电平时,该按键被按下;
- 对于未被按下的按键,其行列电平均为低电平;
- 对于被按下的按键,其所在的行电平为高电平,而其他行的电平为低电平;
- 对于被按下的按键,其所在的列电平为高电平,而其他列的电平为低电平。
通过上述公式的应用,可以在FPGA内部编写程序实现键盘扫描和识别。
基于FPGA的4x4矩阵键盘控制器的实现过程主要包括以下几个步骤:
- 设计矩阵键盘:根据实际需求,设计4x4的矩阵键盘,将16个按键按照规定的行列排列方式连接起来。
- 硬件电路设计:根据矩阵键盘的设计方案,设计相应的硬件电路,包括电源电路、键盘接口电路等。
- FPGA程序设计:在FPGA开发平台上编写程序,实现键盘扫描和识别。具体实现过程中,可以采用Verilog或VHDL等硬件描述语言。
- 程序调试与测试:将编写好的程序下载到FPGA中,对程序进行调试和测试,确保程序能够正确地识别按键信号并输出正确的结果。
- 系统集成:将FPGA与矩阵键盘、相关设备等集成在一起,形成完整的基于FPGA的4x4矩阵键盘控制器。
基于FPGA的4x4矩阵键盘控制器具有以下优点:
- 高可靠性:由于采用FPGA作为核心控制器,具有较强的抗干扰能力和稳定性,能够保证长时间稳定运行。
- 高效率:通过矩阵排列的方式,可以有效地降低硬件资源的使用,提高系统的效率。
- 可扩展性:可以根据实际需求进行扩展和升级,例如增加按键数量、扩展其他外设等。
具体实现过程如下:
这里第一部分的主要目标是设计一个键盘扫描程序,并读取4*4键盘上的键盘,并以0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F在7段数码管上显示出来。这里我们将用到开发板的键盘和数码管。本模块分为键盘扫描和数码管显示两个部分。这两个部分非常的简单,这里我们合在一起设计。键盘扫描的其基本原理如下所示:
通过不断的扫描来完成键盘值的确认。注意这里四行和四列的交界初就是您实际中的16个按键,当您按下其中某个按键的时候,列信号y1,y2,y3,y4就会在对应的位置显示出来,比如你按下了第一列第二个按钮,那么就会在第二列的位置产生一个信号,又由于行信号x是一直在快速的扫描的,如果当第二行正好扫描过的时候,同时检测到列信号,这说明这个按钮按下了。这就是键盘扫描的基本原理。
数码管,这里,是7段数码管,其基本结构如下所示:
其一共有7个LED来表示一个数码管。
二、核心程序
/*
1. Wait buttons and identify key position: according to certain frequency with low level circulation scan lines Y3, Y0 -
Monitor the status, once listed line judge a listed as low means have key is pressed,
Stop scans and maintain the current state of lines, then read column line condition to get the current buttons are key code.
2. Wait buttons pop-up: detection to each column line all become the top flat after restarting the scanning process, waiting for the next buttons
�
*/
module key_scanner(
clk,
rst,
row,
column,
scan_key
);
input clk;
input rst;
input [3:0] column;//Column line
output[3:0] row;//lines
output[3:0] scan_key;
reg[3:0] row;
reg[3:0] scan_key; // scan code registers
reg[31:0] cnt_scan;// scan frequency counter
reg sign; //sign=1:stop scanning
// sign=0:restart scanning*/
reg restart; //
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
row<=4'b1110;
cnt_scan<=0;
end
else begin
if(sign==1'b0)
begin
restart<=0;
cnt_scan<=cnt_scan+1;
//if(cnt_scan==32'h0000ffff)
// begin
row[3:1]<=row[2:0];
row[0]<=row[3]; //4 root lines circulation send out low level
// cnt_scan<=0;
//end
end
else if(sign==1'b1)
begin
row<=row;
if(column==4'b1111)
restart<=1;
//Detect each column is high level
end
end
end
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
scan_key<=0;
end
else begin
if(restart)
begin
sign<=0;
scan_key<=0;
end
else begin
case(row) //This case results testing where key press
4'b1110:
case(column)
4'b1110: begin
sign<=1;
scan_key<=0;
end
4'b1101: begin
sign<=1;
scan_key<=1;
end
4'b1011: begin
sign<=1;
scan_key<=2;
end
4'b0111: begin
sign<=1;
scan_key<=3;
end
endcase
4'b1101:
case(column)
4'b1110: begin
sign<=1;
scan_key<=4;
end
4'b1101: begin
scan_key<=5;
sign<=1;
end
4'b1011: begin
scan_key<=6;
sign<=1;
end
4'b0111: begin
scan_key<=7;
sign<=1;
end
endcase
4'b1011:
case(column)
4'b1110: begin
scan_key<=8;
sign<=1;
end
4'b1101: begin
scan_key<=9;
sign<=1;
end
4'b1011: begin
scan_key<=10;
sign<=1;
end
4'b0111: begin
scan_key<=11;
sign<=1;
end
endcase
4'b0111:
case(column)
4'b1110: begin
scan_key<=12;
sign<=1;
end
4'b1101: begin
scan_key<=13;
sign<=1;
end
4'b1011: begin
scan_key<=14;
sign<=1;
end
4'b0111: begin
scan_key<=15;
sign<=1;
end
endcase
default:
scan_key<=15;
endcase
end
end
end
endmodule
三、测试结果
其仿真结果如下所示:
注意col进行扫描的时候,data分别输出0,1,2,3等键盘值。
Clk |
系统时钟 |
Rst |
系统复位 |
Col |
由键盘输入产生的列扫描信号 |
Data |
键盘值 |
LED_display |
7LED数值显示 |
Rows |
行扫描信号 |
LED_select |
数码管的选择文章来源:https://www.toymoban.com/news/detail-505131.html |
A02-37文章来源地址https://www.toymoban.com/news/detail-505131.html
到了这里,关于基于FPGA的4x4矩阵键盘控制器verilog开发实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!