基于FPGA的键盘扫描程序的设计.docx
《基于FPGA的键盘扫描程序的设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的键盘扫描程序的设计.docx(34页珍藏版)》请在冰豆网上搜索。
基于FPGA的键盘扫描程序的设计
XX 学 院
CHANGSHAUNIVERSITY
本科生毕业设计
设计(论文)题目:
基于FPGA的键盘扫描程序的设计
系 部:
专业:
学生姓名:
班级:
学号
指导教师姓名:
职称讲师
XX学院教务处
二○一一年二月制
(2013届)
本科生毕业设计说明书
基于FPGA的键盘扫描程序的设计
系 部:
电子与通信工程系
专业:
学生姓名:
班级:
学号
指导教师姓名:
职称
最终评定成绩
2013年6月
摘要
在现代电子工业的控制电路中,键盘扫描和显示电路对系统的调试和设置有着重要的作用。
随着EDA技术的发展,基于FPGA的扫描键盘因其结构简单,能有效防止机械键盘按键抖动带来的数据错误等优点在许多电子设备中都得到了广泛的应用。
本文主要是设计一个基于FPGA的键盘扫描程序,该设计在EDA工具QuarutusII9.0上开发完成,以Creat-SOPC2000实验箱上的4*4矩阵键盘为硬件实体,设计键盘扫描程序,将程序划分为时序产生模块、键盘扫描模块、弹跳消除模块、键值译码模块四个模块,时序产生模块为键盘扫描和弹跳消除模块产生时钟信号,键盘扫描模块采用行扫描法对4*4矩阵键盘进行扫描,键值译码模块将所按键值译码为共阳极8位7段数码管的显示码,几个模块组合起来实现键盘扫描的设计要求。
最后对程序进行仿真分析和硬件验证。
仿真结果表明,该系统具有集成度高、稳定性好、设计灵活和设计效率高等优点。
关键词:
FPGA,QuartusII,VHDL,键盘扫描
ABSTRACT
Inthemodernelectronicsindustrycontrolling-circuit,thekeyboardscanninganddisplaycircuitplaysanimportantroleindebuggingandsettingthesystem.WiththedevelopmentofEDAtechnology,FPGA-basedscanningkeyboardhavebeenwidelyusedinmanyelectronicdevicesbecauseofitssimplestructure,anditalsocaneffectivelypreventmechanicalkeyboardjittercausedbydataerrors.
ThisarticleprimarilydesignedanFPGA-basedkeyboardscanprocedures,thisdesignisdevelopedontheEDAtools——QuarutusII9.0anddesignedthekeyboardscanprogram,usingtheCreat-SOPC2000experimentalbox4*4matrixkeyboardasthehardwareentity.theprogramisdividedintofourmodulesasthetiminggenerationmodule,akeyboardscanningmodule,bouncecancellationmoduleandthedecodingmodule.Thetiminggenerationmodulegeneratestheclocksignalforthekeyboardscanningandbounceeliminationmodule,thekeyboardscanningmoduleusingthelinescanningmethodtosweepthe4*4matrixkeyboard,keydecodermoduledecodesthekeyvalueforthecommonanodeeight7-segmentdisplaycode.Severalmodulesassemblestogethertomeetthekeyboardscanningdesignrequirements.Finally,conductingsimulationanalysisbytheprogramandverifyingthehardware.Simulationresultsshowthatthesystemhasmanyadvantagessuchashighintegration,goodstability,highefficiency,flexibledesignandhighdesignefficiency.
Keywords:
FPGA,QuartusII,VHDL,keyboardscanning
第1章绪 论
1.1课题的研究背景
在现代计算机与电子系统中,一般都采用通用式的标准键盘将所需的数据和指令等信息通过键盘输入到计算机和电子系统,以此来实现人机之间的接口交互。
但是,在各种嵌入式系统(如微波炉、手机、电风扇等)中的键盘按键个数有限,一般为几个到十几个左右,而标准键盘则一般在一百多个左右,并且每个按键都有其各自的功能含义。
所以针对每一种电子设备对其键盘进行扫描程序的设计时,必须结合工程的实际情况以及设备自身的各种资源,使所设计的键盘能够很好地融合到系统中,成为其重要的组成部分。
在数字电路中,如果将每个按键的输出信号连接到编码器对应的输入端,通过编码逻辑在编码器的输出端得到每个按键对应的键值,利用编码器实现按键键值的直接编码,这种键盘在早期称为编码键盘。
但是,这类键盘有许多缺点如按键数量较多时编码逻辑的成本就会相对变高.直接编码的方法也具有很大的局限性,编码逻辑一旦固定就难以改变。
现代数字电路中,一般当按键数量较多时,我们采用扫描的方式来产生键值。
用矩阵的形式连接按键,使每个按键位于行、列的相交点上,通过输入扫描信号确定所按按键的行值和列值,即位置码也称扫描码,再通过查表或译码的方式将位置码转换为按键码值,采用这类方式扫描的,我们习惯称其为“非编码键盘”。
在执行键盘扫描的过程中,因大多数键盘采用的都是机械开关,所以按键在闭合时往往会出现一些难以避免的机械性抖动,输出信号随之也发生跳变,其跳变宽度一般在10ms一20ms之间。
若不对其进行处理,则系统很有可能会将其误认为多次按键。
因此在系统中须设置硬件延时电路,按键输入在经过一定时间的延迟后方可读取键值,即键盘系统中常出现的去抖电路。
还有一种情况是当前面按键键值还没输出但已近有新的按键按下时,后按的键值就会覆盖前面的键值,造成数据的丢失。
这时可以在系统中设置一个控制信号,确保前一按键的键值输出后才允许后一键值的产生,又或设置一组寄存器来保存按键的键值,然后系统依序对其进行处理。
这类扫描键盘的优点在于不需要主机担负扫描任务,而是由软件程序完成,其次也可通过更改程序来改变按键的功能定义。
基于FPGA的键盘扫描程序,由芯片中的键盘扫描程序对键盘进行扫描,按键时,系统通过时钟模块启动扫描程序,依次对每行键值赋值来扫描每行,再通过键盘每列的输出来确定按键位置,这种扫描方法被称为逐行扫描法,当有键按下时首先获得此键的列值,然后逐行扫描就可以判断按键所在的行值,由行、列的值可以得出按键的键值。
此外,还需在键盘扫描程序的中加入延时程序,以消除机械键盘按键抖动所带来的影响。
如果键盘的扫描频率设置过低,则在扫描显示的过程中,会出现按键显示迟缓,甚至乱码等现象。
因此在实际的设计中,需根据设计要求及系统的硬件规格选择合适的扫描平率。
现代数字设备中的键盘大多采用这样的键盘扫描方法[1-6]。
1.2课题的研究意义
从计算机时代开始以来,数字系统设计就存在两个大的分类,即系统硬件设计和系统软件设计。
早期的数字系统设计人员也因此被分为两个族群:
硬件设计人员和软件设计人员,他们都只从事自己的工作领域,很少涉足对方的领域,尤其是软件设计人员。
但是,随着数字技术和硬件系统的发展,这两个领域开始互相有所合作。
在硬件描述语言HDL(HardwareDescriptionLanguage)出现后,数字系统的设计已无软硬件之分。
设计人员可以用HDL语言来描述系统的硬件构成及其行为,并通过仿真确定其运用到系统硬件上时是否可行,设计出符合要求的硬件系统。
不仅如此,利用HDL语言来设计系统硬件同传统的硬件设计方法相比,具有其独特的优势,它为系统的硬件设计带来了深远的影响,是硬件设计领域的一次重要的变革。
传统的键盘扫描是以硬件电路来确定键盘的变化,特定的硬件电路只能应用于特定的键盘,因此它存在这样一些缺点:
不能根据实际应用的改变而变化,形式固定。
本文所采用的技术方案能克服上述所讲的技术缺点,该键盘扫描程序是由软件控制完成,不需要改变硬件电路,就可以适用于多种不同类型的键盘。
整个系统设计是自动化过程,减少了工作量,主要把精力放在创造性的方案和概念构思上,提高了工作效率,缩短了产品的研制周期。
1.3本文的主要工作
本设计主要是以计算机为设计平台,综合运用EDA软件工具开发环境,使用硬件描述语言VHDL,采用自顶而下的设计方法,把系统由上至下的分成几个模块设计,最后达到系统的要求,然后在QuartusII9.0上通过编程、调试、编译、仿真,从而实现键盘扫描的设计。
第二章介绍了键盘扫描的基本特点和工作原理,查找有关可编程逻辑器件、VHDL语言的相关资料,掌握一定的理论知识,熟悉QuartusII软件的使用。
第三章先对键盘扫描做出总体的设计方案,然后对键盘扫描进行分模块设计,再对每个模块做出详细的分析。
第四章根据第三章所做的工作,对程序编译,然后进行仿真,对仿真出的结果进行详细的分析,仿真完把程序下载到实验箱上进行测试。
最后对设计做出总结。
第2章FPGA开发工具简介
2.1FPGA概述
FPGA现在已经取代ASIC,实现其功能。
通常ASIC包含三种:
全定制,半定制(包括标准单元和阵列),和可编程器件。
对于前面两种,您需要支付的费用项目不能重复使用的NRE,主要用于芯片流片,在分析工程开销,成本一般是10000美元以上,数以万计的。
如果不成功,返工,甚至多次返工的成本,成本将上升。
高成本,高风险,但通常的需求,各种ASIC的成本,NRE费用分配给每一个产品的价格太高,用户通常是不能接受的。
然而可编程逻辑器件PLD是可以解决上述问题的可编程逻辑器件,是一种新型的ASIC,它有着操作灵活,易于使用,投资风险小和开发迅速的突出优势,非常适合产品的前期开发,研究样本开发或小批量的产品。
FPGA是一种新型的PLD,有着PLD所具有的优点,而且其规模比一般的PLD规模要大。
FPGA主要特点有:
用户不需要投片生产,就能得到合用的芯片;FPGA可做其它全定制或半定制ASIC电路的中试样片;其内部有丰富的触发器和I/O引脚;是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一;FPGA采用高速CMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。
FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。
用户可以根据不同的配置模式,采用不同的编程方式。
加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。
掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。
FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。
当需要修改FPGA功能时,只需换一片EPROM即可。
这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。
因此,FPGA的使用非常灵活[7-9]。
2.2VHDL语言以及QuartusII应用
VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
一个完整的VHDL程序通常包括实体(Entity)、结构体(Architecture)、配置(Configuration)、程序包集合(Package)和库(Library)5个部分。
前4部分是可分别编译的源设计单元。
库用来存放已经编译的实体、结构体、配置和程序包集合[10-12]。
QuartusII支持多种设计输入形式,如:
原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等,是一种综合性PLD开发软件。
由于其内嵌带自有的仿真器和综合器,因而能够完成从输入设计到配置硬件的整个PLD设计流程。
而且它还支持Altera的IP核和可编程系统(SOPC)在Altera的片上开发,具有LPM宏功能的模块库,用户可以使用这些成熟的功能模块,让FPGA的设计工作变得更简单。
同时,QuartusII支持很多第三方的EDA工具,因而用户可以使用自己熟悉的第三方EDA工具来进行设计工作。
此外,QuartusII集合了Matlab/Simulink与DSPBuilder等优秀的EDA工具,各种DSP应用系统在其平台上能够很快得以实现;QuartusII是一个综合性的开发平台,集嵌入式软件开发、系统级设计和可编程逻辑设计于一体[13-15]。
2.3本章小结
本章主要介绍了基于FPGA键盘扫描程序的开发工具,简单地概述了FPGA,主要讲述了FPGA的原理及FPGA的设计流程,另外还概述了VHDL语言的一些基本知识,最后简单地介绍了QuartusII软件。
第3章基于FPGA的键盘扫描程序的设计
本次设计根据键盘扫描程序的设计思路提出了系统的整体电路框图,对硬件实体部分即本设计中4*4矩阵键盘的扫描原理和8位7段数码管的显示方式进行了简单概述,根据整体的电路构架和硬件的实现原理编写键盘扫描程序,将系统进行模块化设计,主要分为时序产生模块设计、键盘扫描模块设计、弹跳消除模块设计、键盘译码模块设计,用VHDL硬件描述语言分别编写各模块的程序,在QuartusII中为VHDL语言程序分别建立项目,在编译、仿真通过,证实逻辑功能正确后,在File菜单下选择Create/Update项中的CreateSymbolFilesforCurrentFile即可为此实体生成一个后缀为.bsf的组件符号文件,以后就可以在图形编辑器中调用此组件了。
用QuartusII图形编辑器将各模块联系起来,形成顶层文件即本次设计的主体。
模块化的设计方法能明确设计思路,也便于调试和修改。
3.1键盘扫描程序的总体电路设计
根据设计思路提出键盘扫描程序的总体电路设计图,如图3.1所示,主要由4*4矩阵键盘、键盘扫描电路、时序产生电路(即分频电路)、弹跳消除电路、键盘译码电路、8位7段数码管显示电路构成。
整体的工作原理为,通过对系统时钟提供的频率进行分频,分别为键盘扫描电路和弹跳消除电路提供时钟信号,键盘扫描电路通过由键盘扫描时钟信号控制不断产生的键盘扫描信号对键盘进行行扫描,同时弹跳消除电路实时的对键盘的按键列信号进行采集、并将采集到的按键列信号传送到键盘译码电路进行译码,译出与之对应的键码,译出的键码将通过数码管显示电路相对应的8段7位数码管显示出来,得到最终的按键结果,完成本次设计的电路设计部分。
图3.1键盘扫描的电路框图
3.1.1矩阵式键盘扫描的工作原理
图3.24*4矩阵式键盘的面板配置
矩阵式键盘是一种常用的电子输入装置,在平常的生活中,矩阵式键盘在通信设备如手机,信息终端如计算机,家用电器如油烟机等各式电子产品上都具有很重要的作用。
图3.2是一个4*4矩阵式键盘的面板配置图。
键盘上上的每个按键都是一个机械开关,当按键被按下时,则该键的电路便会输出低电平即赋值0,反之,如果没有按下按键则输出高电平即赋值1。
键盘的扫描由行信号KY0—KY3控制开始进行行扫描,变化的顺序依次为1110—1101—1011—0111—1110。
每一次扫描一行,依次进行循环。
例如现在的行扫描信号为1011,表示目前正在扫描9、0、A、B这一行的按键,如果这行当中没有按键按下的话,则KX3—KX0输出为1111;反之如果是9键按下,则由KX3—KX0输出为0111。
根据上面所述原理,我们可得到各按键的位置与码值的关系如表3.1和3.2所示。
表3.1按键位置与数码的关系
KY3-KY0
1110
1110
1110
1110
1101
1101
1101
1101
KX3-KX0
0111
1011
1101
1110
0111
1011
1101
1110
按键号
1
2
3
4
5
6
7
8
表3.2按键位置与数码的关系
KY3-KY0
1011
1011
1011
1011
0111
0111
0111
0111
KX3-KX0
0111
1011
1101
1110
0111
1011
1101
1110
按键号
9
0
A
B
C
D
E
F
若从KX3—KX0读出的值皆为1时,代表该列没有按键按下,则不进行按键译码的动作,反之,如果有按键按下时,则应将KX3—KX0读出的值送至译码电路进行译码。
3.1.2数码管的显示原理
数码管的显示数据的方式有静态显示和动态显示之分。
所谓静态显示,就是将被显示的数据的BCD码通过各自的4—7/8显示译码器译码后,分别接到显示译码器的显示驱动端a—g(p),而公共端COM则根据数码管的类型(共阴/共阳)分别接GND/VCC。
所谓动态显示,就是将被显示的数据的BCD码按照一定的变化频率,在不同的时刻周期性地分别送到一个数据总线上,再通过一个公共的4—7/8显示译码器译码后,接到多个显示译码的公共显示驱动端口a—g(p)上,同时,在不同的时刻周期性的选通对应的数码管的公共端口COM。
本设计采用的是共阳极数码管,采用的显示方式是静态显示,其电路中只用到一个数码管,当有键按下时,数码管将显示出对应的键码值。
其主要的VHDL程序如下:
---------数码管显示程序----------
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysmgxsis
port(ym_in:
instd_logic_vector(4downto0);
com0:
outstd_logic;
qout8:
outstd_logic_vector(7downto0));
endentitysmgxs;
architectureartofsmgxsis
signalqout8_s:
std_logic_vector(7downto0);
begin
process(ym_in)is
begin
caseym_inis
when"00000"=>qout8_s<="11000000";----0
when"00001"=>qout8_s<="11111001";----1
when"00010"=>qout8_s<="10100100";----2
when"00011"=>qout8_s<="10110000";----3
when"00100"=>qout8_s<="10011001";----4
when"00101"=>qout8_s<="10010010";----5
when"00110"=>qout8_s<="10000010";----6
when"00111"=>qout8_s<="11111000";----7
when"01000"=>qout8_s<="10000000";----8
when"01001"=>qout8_s<="10010000";----9
when"01010"=>qout8_s<="10001000";----A
when"01011"=>qout8_s<="10000000";----B
when"01100"=>qout8_s<="11000110";----C
when"01101"=>qout8_s<="11000000";----D
when"01110"=>qout8_s<="10000110";----E
when"01111"=>qout8_s<="10001110";----F
whenothers=>qout8_s<="11111111";
endcase;
endprocess;
qout8<=qout8_s;
com0<='1';
endarchitectureart;
3.2键盘扫描电路各主要功能模块的设计
3.2.1时序产生模块
本时序产生模块中使用了二种不同频率的工作脉冲波形,通过对系统时钟脉冲进行分频得到键盘扫描模块和键盘去抖模块的时钟信号。
当系统需要使用多种操作频率的时钟脉冲时,较为直接和简便的方法就是用一个自由计数器自由累加得到所需的各种频率。
也就是建立一个N位计数器,N的大小根据电路的需求决定,N的值越大,电路可以分频的次数就越多,这样就可以获得更多的频率变化,以便提供多种不同频率的时钟信号。
若输入时钟为CLK,N位计数器的输出为Q[N-1.0],则Q(0)为CLK的2分频脉冲信号,Q
(1)为CLK的4分频脉冲信号,Q
(2)为CLK的8分频脉冲信号……Q(N-1)为CLK的2N分频脉冲信号。
我们利用以上规律即可得到我们所需要频率的信号或信号序列。
时序产生模块模块电路图如图3.4所示。
xd_clk输出信号和ym_clk输出信号分别为系统时钟clk的8分频和2分频,其中xd_clk信号用作弹跳消除取样电路的时钟信号,ym_out信号用作键盘扫描电路的时钟信号。
时序产生模块原理图如图3.3所示。
图3.3时序产生模块
时序产生模块VHDL描述如下:
--------------扫描时钟产生程序-------------
libraryieee;
us