标题:
基于FPGA的键盘扫描模块的设计
[打印本页]
作者:
pengpengpang
时间:
2015-6-28 21:01
标题:
基于FPGA的键盘扫描模块的设计
引言
在现代的个人计算机系统中,一般都采用通用的标准键盘
(
如
:
标准
101/102
键盘或
Microsoft
自然
PS/2
键盘
)
来实现人与计算机之间的接口交互,从而将需要的各种数据和指令等信息都通过键盘来输人计算机川。
但是,各种嵌人式系统
(
如
:
手机、微波炉、电风扇等
)
所需的键盘的按键个数非常有限,通常为几个到十几个不等‘而标准键盘通常为二百多个按键
)
,并且每个按键所代表的功能含义也各不相同。所以,每一种嵌人式系统都应对键盘
(
包括键盘扫描模块和相关控制信号等
)
进行专门设计,以便结合工程实际情况充分利用该系统已有的各种资源,使所设计的键盘很好地融合到嵌人式系统中。
键盘扫描的基本知识
1.
编码键盘和扫描键盘
在数字电路中,可以利用编码器实现按键键值的直接编码,以将每个按键的输出信号对应连接到编码器的每一个输人端。这样,通过编码逻辑就可以在编码器的输出端得到对应于每个按键的码值,早期称这种键盘为编码键盘。但是当按键较多时,数码逻辑的成本就较高,并且直接编码的方法也不够灵活,而且一旦编码逻辑固定就难于更改。
当通用键盘上或按键数量较多时,普遍采用扫描方式产生键值。因此,可将按键连接成矩阵,每个按键位于某行、某列的交点上位口图
1
所示
)
,先通过扫描方式确定按下键的行列位置,称为位置码或扫描码。再查表将位置码转换为按键码值或者直接使用扫描码,有些参考书称此为“非编码键盘”。但这种名称容易让人误解为没有对应的键值,因此又称为扫描式键盘。
@5xe" coordsize="21600,21600" o:spt="75" o:preferrelative="t" filled="f" stroked="f">
图
1
行列式扫描健盘示意图
2.
硬件扫描键盘与软件扫描键盘
如果执行扫描的过程由硬件逻辑实现,则将这种键盘称为硬件扫描键盘或电子扫描式编码键盘。在执行键盘扫描时应注意一个问题,即键在闭合过程中往往存在一些难以避免的机械性抖动,使输出信号也发生抖动,通常达
10
一
20
毫秒宽。若不避开抖动区,则可能误认为多次按键。因此应该设置硬件延时电路,延迟数十毫秒后再读取键值,这种电路称为去抖电路〕还应注意一个问题,即当前一个键值还未送出,而又有按键按下时,后边的键值将覆盖前边的键值,造成键值丢失问题。通常可以设置一控制信号
.
仅当前一键值送出后才允许产生后一键值,或者设置一组寄存器来保存前边若十个键值,等待系统逐个按顺序处理。
硬件扫描键盘的优点是不需要主机担负扫描任务,仪当产生键值后才向主机发出中断请求,
CPU
以相应中断方式接收按键键值,或者
CPU
定时从某个地址获取按键键值。该方式大大减轻了
CPU
的运行负荷,使其能以更多的时间去运行其它程序。
当然也可以执行键盘扫描程序,由
CPU
通过软件方法对键盘进行扫描。图
2
便是一种键盘扫描程序的流程图,这种键盘称为软件扫描键盘。按键时,键盘向主机提出中断请求。由软件扫描键盘来获得按键键值;或者由
CPU
定期执行键盘扫描程序,从而获得按键键值。即在扫描方法称为逐行扫描法,当有键按下时,首先获得此键的列值,然后逐行扫描就可以判断出按键所在的行值。这样,由行列值就可以通过转换得到按键键值。当然,要在执行键盘扫描过程中加人一定的延时,以去除抖动影响。
圈
2
一种盘妇描租序流程圈
如果系统对
CPU
的运行速度要求较高,并且
CPU
的负荷较重、系统资源比较紧张,则可以在键盘中设置一个单片机,由它负责执行键盘扫描程序,然后向
CPU
申请中断并送出扫描码或者按键键值。现代计算机的通用键盘
.
大多采用这样的键盘扫描方法。
基于
FPGA
的设计方法
1.
实现方法分析
根据项目的实际需要
.
拟实现的键盘扫描模块应具有如下特点
:
I)
该模块应能实时地将扫描所得的键值信息写人存储器指定地址,其中键值信息包括同一按键的重复次数和键值,系统软件则应能定时从该地址读取键值信息以执行相应的操作
2)
键盘去抖动所采用的方法是多次扫描法,当连续几次扫描到同一键值时就认为此键被按下了,这样就完成了去抖动操作。
3)
由于本项目不需要
AS(:I I
字符编码按键,故应将按键值设计为
1
一
20
直接送出。
4)
为了能表示长时间按键的操作,当确定某一按键按下时
.
以后梅隔一定时间才扫描一次,若获得同一键值,则将按键重复次数加一同时将重复次数和键值组合成键值信急送出
;
并在延迟一定时间后再次扫描……
2.
基于
FPGA
的具体实现
本文拟采用四个模块来实现键盘扫描功能,分别是即时扫描模块、扫描控制模块、扫描脉冲模块和键值传送模块。图
3
是其模块工作流程。
圈
3
实现健盘扫描的模块结构
(1)
即时扫描模块
输人信号
:
CLKSMHZ
:时钟信号,用于产生时序;
KB_IN[3:0]
:由键盘矩阵送来的检测信号
;
SCAN
:扫描指示信号,每一个正脉冲到来时执行一次键盘扫描
输出信号:
KB
一
OU T[4:O]
:输出到键盘的控制信号,以便从键盘矩阵取得相应的信
号并进行检测
;
VALUE[7:0]
:扫描所得的即时键值输出到扫描控制模块,以便进行抖动。
模块功能描述
:
本模块用于完成键盘即时扫描功能当检测到
SCAN
信号有一个窄脉冲到来时,模块内部将产生一组相应的
KB_ OUT
信号并输出到键盘矩阵,然后再对
KB_ IN
输人信号进行检测,以判断有无键被按下以及哪个键被按下,同时送出相应的即时键值
VALUE。
(2)
扫描控制模块
输人信号
:
CLKSOHZ
:时钟信一号,用于产生时序
;
V ALUE[7:0]
:由即时扫描模块送来的即时键值
;
CNT[4:0]
:来自扫描脉冲模块的计数器值,用于对扫描进行延时。
输出信号:
KEYVALUES[15:0]
:此值为去抖动后的键值与按键重复次数组合而成的数据
;
CTRL:
扫描使能信号
.
高电平为使能,低电平为禁止。
模块功能描述
:
本模块用于控制是否允许进行扫描以及完成键盘去抖动等。在无键按下时,
CTRL
置高电平以允许扫描
;
当连续几次扫描到同一个按键时,则认为此键被按下了
(
已经完成了去抖动操作
)
。然后
CTRL
置低电平以禁止扫描同时开始延时,当
CNT
达到某一数值时,重新进行扫描并再次延时。
同时将按键重复次数和键值
VALUE
组合成
KEYVALUES
并输出。以此类推,直到无键按下或检测到其他的键值。
(3)
扫描脉冲模块
输人信号
:
CLK50HZ:
时钟信号,用于产生时序
;
CLKSMHZ:
时钟信号,用于产生时序
;
CTRL:
扫描使能信号,高电平为使能,低电平为禁止。
输出信号
:
SCAN:
扫描指示信号,每输出一个正脉冲执行一次键盘扫描
;
CNT[4:O]
:扫描延时计数器,用于对扫描进行延时。
模块功能描述:
本模块的主要功能是产生扫描指示窄脉冲和扫描延时计数。当
CTRL
为高电平时,在每个
CLK50HZ
的上升沿送出一个
SCAN
窄脉冲
;
当
CTRL
为低电平时,延时计数器开始计数,当达到某一特定值时,则送出一次扫描脉冲信号
SCANo
(4)
健值传送模块
输人信号
:
SYSCLK:
系统时钟信号,用于产生时序
;
KEYVALUES[15:0]:
此值为去抖动后的键值与按键重复次数组合而成的数据。
输出信号
:
WRITE_ N:
存贮器的写使能信号,低电平有效
;
ADDRESS[31:0
存贮器的键值信息写人地址,为恒定值
;
KEYVALUE[ 15:0]:
要写人存贮器的键值信息,其中包括按键重复次数和键值。
模块功能描述
:
本模块负责把键值信息写入存贮器,供应用软件定时查询。当且仅当输人端
KEYVALUES
的值发生改变时
.
才会发起一次存贮器写操作。
结束语
将此模块用
VHDL
硬件描述语言予以实现,然后经过功能仿真
.
再利用
QUARTUS II
软件进行编译并下载到
ALTERA
的
CYCLONE 1C20
开发板上后
.
经过对键盘的实际操作检验证明,此模块可以正常地实现键盘扫描、去抖动等功能。同时,若对该模块稍加修改,同样可以移植到其他嵌人式系统中,这样可以大大减轻
CPU
的运行负荷,因此,本设计对大多数对系统资源比较敏感的嵌人式系统来说,具有很强的现实意义。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0