基于VHDL的矩阵键盘及显示电路设计

时间:2022-09-12 07:14:18

基于VHDL的矩阵键盘及显示电路设计

摘 要:为了有效防止机械式键盘按键抖动带来的数据错误,这里在Quartus Ⅱ开发环境下,采用VHDL语言设计了┮恢知能够将机械式4×4矩阵键盘的按键值依次显示到8个7段数码管上的矩阵键盘及显示电路。仿真结果表明,所设计的矩阵键盘及显示电路成功地实现了按键防抖和按键数据的准确显示。以ACEX1K系列EP1K30QC208芯片为硬件环境,验证了各项设计功能的正确性。关键词:VHDL; 键盘; 按键防抖; 数码管

中图分类号:TN710-34; TP332.1+2 文献标识码:A 文章编号:1004-373X(2010)16-0014-03

Design of the Matrix Keyboard and Display Circuit Based on VHDL

ZHANG Xi-feng,QU Bao-peng

(Electronics Engineer Department of Shaanxi Institute of Technology, Xi’an 710300,China)

Abstract:The application of the FPGA/CPLD becomes more and more extensive in the design of digital system, and it has affected our life deeply. The data inputted by matrix keyboard and displayed by digital tube, the design is applied widely in electron equipments. In order to avoid the data mistakes resulted by the key-press shake, a matrix keyboard and display circuit which can display the key-press input data produced by 4×4 matrix keyboard in turn with 8 word 7-seg display was designed with the language of VHDL in the environment of Quartus Ⅱ. The simulation results indicate that the matrix keyboard and display circuit designed in this paper realized the key-press anti-shake and exact display. Finally, validity of whole designed functions was validated with the EP1K30QC208 chip of ACEX1K series.Keywords:VHDL; keyboard; anti-shake; digital tube

收稿日期:2010-03-12

FPGA/CPLD在数字系统设计中的广泛应用,影响到了生产生活的各个方面[1-4]。在FPGA/CPLD的设计开发中,VHDL语言作为一种主流的硬件描述语言,具有设计效率高,可靠性好,易读易懂等诸多优点[3,5-6]。作为一种功能强大的FPGA/CPLD数字系统开发环境,Altera公司推出的Quartus Ⅱ,为设计者提供了一种与结构无关的设计环境,使设计者能方便地进行设计输入、快速处理和器件编程,为使用VHDL语言进行FPGA/CPLD设计提供了极大的便利[7]。

矩阵键盘作为一种常用的数据输入设备,在各种电子设备上有着广泛的应用,通过7段数码管将按键数值进行显示也是一种常用的数据显示方式。在设计机械式矩阵键盘控制电路时,按键防抖和按键数据的译码显示是两个重要方面。

本文在Quartus Ⅱ开发环境下,采用VHDL语言设计了一种按键防抖并能连续记录并显示8次按键数值的矩阵键盘及显示电路。

1 矩阵键盘及显示电路设计思路

矩阵键盘及显示电路能够将机械式4×4矩阵键盘的按键值依次显示到8个7段数码管上,每次新的按键值显示在最右端的第0号数码管上,原有第0~6号数码管显示的数值整体左移到第1~7号数码管上显示,见图1。总体而言,矩阵键盘及显示电路的设计可分为4个部分:

(1) 矩阵键盘的行及列的扫描控制和译码。该设计所使用的键盘是通过将列扫描信号作为输入信号,控制行扫描信号输出,然后根据行及列的扫描结果进行译码。

(2) 机械式按键的防抖设计。由于机械式按键在按下和弹起的过程中均有5~10 ms的信号抖动时间,在信号抖动时间内无法有效判断按键值,因此按键的防抖设计是非常关键的,也是该设计的一个重点。

(3) 按键数值的移位寄存。由于该设计需要在8个数码管上依次显示前后共8次按键的数值,因此对已有数据的存储和调用也是该设计的重点所在。

(4) 数码管的扫描和译码显示。由于该设计使用了8个数码管,因此需要对每个数码管进行扫描控制,并根据按键值对每个数码管进行7段数码管的译码显示。

2 矩阵键盘及显示电路的实现

本文所设计的矩阵键盘及显示电路的电路符号如图2所示。其中,clk为时钟信号输入端(频率可为1 024~32 768 Hz);start为清零控制端;kbrow为列扫描信号输入端;kbcol为行扫描信号输出端;scan为数码管地址扫描信号输出端;seg7为数码管显示信号输出端。

图1 矩阵键盘及显示电路原理图

图2 矩阵键盘及显示电路的电路符号

限于篇幅,在此不详述所设计矩阵键盘及显示电路的全部VHDL代码,只对部分重要代码段落进行详细说明。

如图1所示,全部代码由7个进程(process)组成。其中,进程P1和P2用于对列扫描输入信号kbrow进行读取,并通过或非运算产生行扫描使能控制信号en对行扫描输出信号kbcol进行控制,并生成┮桓霆与kbcol对应的状态信号state。若没有按键被按下(即kbrow=“0000”),则en=‘1’,行扫描输出信号kbcol不断循环扫描各行;若有按键被按下,en=‘0’,则行扫描停止,并锁存当前kbcol的值。进程P1和P2的代码如下:

P1:process(clk,kbrow)

begin

en

or kbrow(3));

if(clk′event and clk=′1′) then

if en=′1′ then count

end if;

end if;

end process;

P2:process(clk)

begin

if clk′event and clk=′1′ then

case count is

when "00"=>kbcol

state

when "01"=>kbcol

state

when "10"=>kbcol

state

when "11"=>kbcol

state

when others=>kbcol

end case;

end if;

end process;

进程P3使用“case…when”语句,根据状态信号state的值(即kbcol的值)和列扫描输入信号kbrow的值进行按键值译码,生成┮桓霆4位二进制按键数值信号dat,用以记录当前按键值。例如,当kbcol=“0010”,kbrow=“0001”时,“B”键按下,dat=“1011”。进程P3的代码在此不再赘述。

进程P4和P5用于按键的防抖和按键值的移位寄存。通过将行扫描使能控制信号en不断赋给一个8位二进制变量reg8,再将reg8赋给8位二进制信号key,实现对按键状态的记录,然后通过对key的各位数值进行与运算,生成防抖控制信号fnq。一旦有按键按下,en=‘0’,则即便是按键在抖动,key中至少也有1位数值为‘0’,从而使fnq=‘0’。只有当按键再次弹起,并且在连续8个时钟周期内不再有新的按键按下,key的数值全为‘1’,则fnq=‘1’,fnq产生一个上升沿,从而触发按键数值信号dat进入数值寄存信号temp(32位┒进制数)的第0~3位,并将temp原来的第0~27位左移到第4~31位,实现1次按键按下的数值存储。进程P4和P5的代码如下:

P4:process(clk)

variable reg8:std_logic_vector(7 downto 0);

BEGIN

if(clk′event and clk=′1′) then

reg8:=reg8(6 downto 0)&en;

end if;

key

end process;

fnq

and key(4) and key(5) and key(6) and key(7);

P5:process(fnq,start)

BEGIN

IF start=′0′ then

temp

elsif(fnq′event and fnq=′1′) then

temp

end if;

end process;

进程P6用于将数值寄存信号temp的32位二进制数分配给8个数码管,从而生成数码管地址扫描输出scan,以及数码管数值信号data(4位2进制数)。进程P6代码如下:

P6:process(clk,temp,cnt8)

begin

if clk′event and clk=′1′ then cnt8

end if;

case cnt8 is

when 0=>scan

when 1=>scan

when 2=>scan

when 3=>scan

when 4=>scan

when 5=>scan

when 6=>scan

when 7=>scan

when others=>null;

end case;

end process;

进程P7用于将数码管数值信号data译码成为7段数码管显示输出seg7,进程P7的代码在此不再赘述。

值得注意的是,本文设计的矩阵键盘及显示电路在按键防抖和数据寄存部分设计得更加简洁可靠,实现的功能更加强大,其具有如下特点:

(1) 为了实现按键防抖,本文采用对按键状态连续记录的方式,即在按键弹起后连续8个时钟周期均无按键信号才确认1次按键有效,从而避免了按键按下和弹起过程中的数据抖动,相比于使用计数器从按键按下开始计数,直到5~10 ms后才让按键有效的防抖方式[8-9],这里设计的按键防抖更加可靠,且可有效避免长时间按下按键产生的重复数据输出,使每次按键无论时间长短均可且只会产生1次数据输出。另外,当电路采用32 768 Hz以上的时钟作为系统时钟时,可以通过增加按键状态连续记录的时钟周期数,实现可靠的防抖。

(2) 该设计采用一个32位一维数组temp作为数据寄存器,使用移位寄存方式,实现了对连续8次按键数据的存储和调用,从而可以在8个数码管上连续显示数据。

3 仿真结果分析

本文设计的矩阵键盘及显示电路在Quartus Ⅱ开发环境下进行了仿真验证。其中,按键防抖功能的仿真波形如图3所示。仿真结果分析如下:

(1) clk为时钟输入信号,作为系统时钟;

(2) start为清零控制端,当其为高电平时,按键有效;

(3) kbrow为列扫输入信号,kbcol为行扫输出信号,图3中对kbrow[1]的输入波形进行设置,模拟了“A”键按下和弹起的过程;

(4) fnq为防抖控制信号,scan为数码管地址扫描输出,seg7为数码管显示输出。由图3可知,只有在按键弹起后,才有数据输出,从而实现防抖功能。

图3 矩阵键盘及显示电路按键防抖仿真波形

该设计的其他功能也可以通过仿真验证,不再赘述。

4 结 语

本文设计矩阵键盘及显示电路在Quartus Ⅱ开发环境下进行仿真验证后,下载到湖北众友科技实业股份有限公司的ZY11EDA13BE实验箱中进行了硬件验证。该实验箱使用ACEX1K系列EP1K30QC208芯片作为核心芯片。实验证明,当电路的系统时钟频率在1 024~32 768 Hz范围内时,电路均可稳定运行,按键防抖可靠、功能完整。当系统时钟频率低于1 024 Hz时,需要减少防抖记录时钟周期的个数,否则容易错过短时按键动作;当系统时钟频率高于32 768 Hz时,需要增加防抖记录时钟周期的个数,以确保可靠的按键防抖。

参考文献

[1]康华光.电子技术基础(数字部分)[M].北京:高等教育出版社,2004.

[2]马或,利,王丽英.CPLD/FPGA可编程逻辑器件实用教程[M].北京:机械工业出版社,2006.

[3]侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计[M].西安:西安电子科技大学出版社,2000.

[4]李国丽,朱维勇,栾铭.EDA与数字系统设计[M].北京:机械工业出版社,2005.

[5]卢毅,赖杰.VHDL与数字电路设计[M].北京:科学出版社,2001.

[6]李志,田永清,朱仲英.VHDL的设计特点与应用研究[J].微型电脑应用,2002(10):5-8.

[7]周润景,图雅,张丽敏.基于Quartus Ⅱ的FPGA/CPLD数字系统设计实例[M].北京:电子工业出版社,2007.

[8]鲁传明,瓮嘉民.基于VHDL的防抖型矩阵式键盘设计[J].河南工程学院学报,2009(3):58-62.

[9]樊国梁,张晓燕.基于VHDL的键盘扫描及显示电路设计[J].电子世界,2005(2):25-26.

上一篇:基于多数决定逻辑非门的低功耗全加器设计 下一篇:中型组机器人运动控制系统的FPGA设计