基于FPGA的矩阵键盘控制器及显示电路的设计*
2012-05-15王荣扬吴国强
王荣扬 , 吴国强
(湖州职业技术学院 机电工程分院, 浙江 湖州 313000)
在便携式电子设备中有着广泛应用的矩阵键盘,一般利用单片机对其进行扫描控制,大大降低了单片机处理其它信息的能力,造成资源的浪费。利用FPGA强大的逻辑处理能力及丰富的引脚,本文设计了基于FPGA的矩阵键盘控制器,主要包括矩阵键盘抗抖动模块、扫描模块、译码模块、存储模块以及数码管显示模块,同时将矩阵键盘输入的数据通过7段数码管进行显示。
1 矩阵键盘控制器及显示电路设计思路
为完成便携式设备的人机交互,利用4×4矩阵键盘设计了基于FPGA的矩阵键盘控制器及显示电路,如图1所示。系统主要由FPGA、矩阵键盘、138译码芯片以及数码管等组成,主要完成一个8位数的输入,对所输入的8位数进行存储供后续使用,利用数码管的显示功能来确认所输入的数据是否准确,降低输入误差。
由图1可看出,本系统软件部分主要实现矩阵键盘行列扫描控制、输入抗抖动、按键译码、按键存储以及数码管显示等功能。
(1)矩阵键盘行列扫描控制模块:产生周期性的扫描信号,根据扫描输入信号进行判断是否有按键被按下,若有按键被按下则立刻进行按键判断和编码,并将按键存储到内部寄存器[1]。
(2)弹跳消除电路:机械开关结构的矩阵键盘,按键被按下时,接触点会出现来回弹跳的信号。信号弹跳时间内程序无法有效的判断按键值,从而影响到输入的正确性,降低设备的性能[1]。
(3)按键译码电路:扫描回复信号(按键输入给FPGA的信号)在FPGA内部无法直接作为后续使用信号,必须定义中间信号,用以区分不同按键的功能,对按键进行译码[1]。
(4)按键存储电路:前一次按键的输入数据将被下一次扫描产生的新按键数据覆盖,因此需要一个移位寄存器来保存整个按键的输入。
(5)数码管显示电路:为完成8位数据的输入显示,需要对每个数码管进行扫描控制,并根据按键值对数码管进行译码显示。
图1 系统硬件电路图
2 矩阵键盘控制器及显示的VHDL设计
2.1 矩阵键盘防抖设计
矩阵键盘抗抖动电路主要有计数器、移位寄存器、D型触发器延时和采样型防抖微分电路四种方法[2]。本文采用的去抖方法是:将键盘输入信号作为电路输入信号,在时钟信号作用下,输入信号经过两级D触发器延时后再使用RS触发器进行处理。抖动消除电路所使用的脉冲信号频率必须比其它电路使用的脉冲信号频率更高,通常将扫描电路的工作频率定在24Hz左右,而将弹跳电路的工作频率定在128Hz左右[3]。根据以上设计思想,采用VHDL硬件语言编写了键盘抗抖动模块,抗抖动模块经综合后其RTL电路图如图2所示。
图2 抗抖动电路RTL图
2.2 时钟电路和扫描电路
时钟电路主要产生系统所需要的时钟信号,由FPGA时钟分频得到系统工作时钟,然后采用计数器分频方法得到所需要的弹跳消除时钟信号、键盘扫描信号以及数码管显示时钟信号。键盘扫描电路用来产生键盘扫描信号,根据矩阵键盘工作原理,需要产生从第一列到第四列的周期性扫描信号。采用VHDL硬件语言设计扫描模块,具体程序如下。
Process(clk_1khz) “1101” when clk_key=“01”else
begin “1011” when clk_key=“10”else
if clk_1khz'event and clk_1khz='1' then “0111” when clk_key=“11”else
counter<=counter+1; clk_scan<=sel;
end if; “1111”;
clk_key<=counter(9 downto 0); end process;
sel<= “1110” when clk_key=“00” else
2.3 矩阵键盘译码电路
矩阵键盘所产生的扫描回复信号(按键输入给FPGA的信号),是无法直接在FPGA内部作为信号进行使用,在使用前需要根据定义的不同功能将扫描回复信号译码为可供FPGA识别的BCD编码,完成矩阵键盘输入的译码,同时区分不同按键的功能。译码电路的主要功能是:判断是否有键按下,然后根据扫描的信号确认所按下的键是数字键还是功能键,将所按下的键编写成BCD码。表1为所用键盘输入信号与按键位置之间的关系。
表1 按键输入信号与按键位置的关系
译码电路对应的VHDL程序如下。
Process(clk) when “101011” =>data_n<=“1001”;
begin when “100111” =>data_n<=“1110”;
scan<= clk_key & KO; when “111101” =>data_n<=“1011”;
if clk'event and clk='1' then when “111011” =>data_n<=“1100”;
case scan is when others =>data_n<=“0000”;
when “001110” =>data_n<=“0001”; end case;
when “001101” =>data_n<=“0100”; end if;
when “001011” =>data_n<=“0111”; if clk'event and clk='1' then
when “000111” =>data_n<=“0000”; case scan is
when “011110” =>data_n<=“0010”; when “111110” =>data_f<=“1010”;
when “011101” =>data_n<=“0101”; when “110111” =>data_f<=“1101”;
when “011011” =>data_n<=“1000”; when others =>data_f<=“0000”;
when “010111” =>data_n<=“1111”; end case;
when “101110” =>data_n<=“0011”; end if;
when “101101” =>data_n<=“1010”; end process;
2.4 存储及显示电路
每次扫描会产生新的按键输入,可能会覆盖前面的数据,所以需要一个按键存储器电路,将整个键盘扫面完毕后的结果记录下来。按键存储电路由移位寄存器电路组成。本设计采用串行输入、串行输出移位寄存器作为按键存储电路。设计思路:八进制计数器cnt按合适的频率进行计数;每记一个数,便给位选信号segweixh赋一个不同的值,通过I/O口将segweixh的值输出给138译码器;当位选信号segweixh变化时,按一定的算法将键盘输入信号的四位赋值给内部寄存器datebuf;process(datebuf)过程是数码管显示译码阶段,主要完成对输入信号的译码工作。(限于篇幅,程序略)
3 实验结果分析
(1)扫描电路仿真分析:图3所示为分频和键盘扫描仿真图,图中clk为频率为50MHz的FPGA时钟信号;clk_1kHz为经过50000分频得到的1kHz的键盘扫描工作时钟信号;在程序内部分频器的作用下对键盘进行扫描,clk_scan为键盘扫描信号,由图3可以看出仿真结果和理论要求一致。
图3 分频及扫描模块仿真波形图
(2) 数码管显示电路仿真分析:图4所示为数码管显示仿真波形,图中clk为频率为50Mhz的FPGA时钟信号;clk_1khz为经过50000分频得到的1khz的数码管显示工作时钟信号;矩阵键盘输入数据存放在移位寄存器datain_x中,假设输入数据为“0000 0001 0010 0011 0100 0101 0110 0111”,对应的显示数码为0、1、2、3、4、5、6、7;led_out为138位选信号,由仿真结果看得其与理论值一致;segma_out为数码管显示断码,由图4可得,在led_out为“000”、 “001”、 “010”、 “011”、 “100”、 “101”、 “110”、 “111”时分别显示“11111010”、“ 00100010”、“ 10111001”、“ 10101011”、“ 01100011”、“ 11001011”、“ 11011011”、“ 10100010”,即0、1、2、3、4、5、6、7与输入的数据一致。
图4 数码管显示模块仿真波形图
4 结 语
本设计的矩阵键盘控制器及其显示电路在ISE13.4 开发环境下进行仿真验证后,下载到采用138译码芯片、矩阵键盘、FPGA及4位数码管建立开发的硬件系统中进行了硬件验证,该硬件采用Xilinx系列 spartan-xc3s500E 芯片作为核心芯片。实验证明,所设计的系统能够准确的完成目标功能,硬件系统结果与仿真结果一致,即验证了系统的正确性。所设计的系统误判概率低,反应速度快,能够满足设计要求。该模块以按键的释放控制按键编码输出,在按键被按下一段时间到释放按键之前,不能按一定的间隔连续输出被按键的键值,矩阵键盘没有连续按键的功能。
参考文献:
[1] 张喜凤,屈宝鹏.基于VHDL的矩阵键盘及显示电路设计[J].现代电子技术,2010,33(16):14-16.
[2] 鲁传明,翁嘉民.基于VHDL的防抖型矩阵式键盘设计[J].河南工程学院学报,2009,21(1):58-62.
[3] 谭会生,翟遂春.EDA技术综合应用实例与分析[M].西安:电子科技大学出版社,2004:11.