数字系统设计大作业44阵列键盘键信号检测电路设计Word下载.docx
《数字系统设计大作业44阵列键盘键信号检测电路设计Word下载.docx》由会员分享,可在线阅读,更多相关《数字系统设计大作业44阵列键盘键信号检测电路设计Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
![数字系统设计大作业44阵列键盘键信号检测电路设计Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/6/ae5df68d-5540-4e5a-a1ac-30f0e3ae5c4c/ae5df68d-5540-4e5a-a1ac-30f0e3ae5c4c1.gif)
并且使用Modelsim软件进行模拟仿真,下载到EDA实验箱进行硬件验证。
关键词:
EDAVHDL语言4×
4阵列键盘扫描
目录
《数字系统设计》1
数字系统设计2
摘要3
4阵列键盘扫描3
1、实验目的5
2、实验要求5
3、实验原理5
4、总体框图6
4.1.1方案一6
4.1.2方案二6
4.2设计思路7
5、功能模块介绍9
5.1键盘消抖模块9
5.2键盘模块9
5.3VHDL部分程序9
6、实验结果11
6.1综合电路图11
6.2时序仿真12
1、实验目的
(1)通过常见基本组合逻辑电路的设计,熟悉EDA设计流程;
(2)熟悉文本输入及仿真步骤;
(3)掌握VHDL设计实体的基本结构及文字规则;
(4)理解硬件描述语言和具体电路的映射关系;
(5)用VHDL设计一个能识别4×
4阵列键盘的实用电路。
2、实验要求
要求通过查阅相关书籍资料,熟悉和初步掌握VHDL语言的语法及其功能,深入分析4×
4键盘扫描电路的原理,然后运用VHDL硬件描述语言和图形设计综合方法,实现4×
4键盘扫描电路的程序设计,通过运用xilinx.ise.7.1i软件设置输入端口,实现模拟仿真,得到仿真波形图后,并记录结果。
3、实验原理
4×
4阵列键盘十分常用,如下图是此键盘电路的原理图,10芯接口也如下。
通常,此类按键的识别法有两种:
扫描法和反转法。
扫描法,即当按下某键后,为了辨别和读取键信息,向A口扫描输入一组分别只含一个0的4位数据,如1110,1101,1011等。
若有键按下,则B口一定会输出对应的数据,这时,只要结合A、B口的数据,就能判断出键的位置。
如当键S0按下,对于输入的A=1110时,那么B=0111.于是{B,A}=0111_1110就成了S0的代码。
反转法中,A、B口都必须接双向口。
首先将A口设定为输出,B口设定为输入。
然后向A口输出全0,接着读B口。
若读入的数据中有一位是0,则表明与该位对应的列线上有某键被按下,存储此值(否则循环检测);
然后反过来,将A口设定为输入,B口设定为输出。
向B口输出全0,读A口,其中必有一位为0.将此4位数与刚才从B口读得的数据组合即得被按键的特征码。
最后通过查表即得所按键的码。
4按键电路
4、总体框图
4.1.1方案一
上图为方案一的设计框图,键盘按键按下后,经过键盘扫描电路后,直接输出显示。
本方案优点在于简单易懂,缺点在于无法消除按键按下时和之后弹起时的抖动对扫描电路的干扰。
4.1.2方案二
时钟脉冲
键盘输入
键盘消抖
输出低电平
LED灯显示
键盘扫描
上图为方案二的设计框图,键盘按键按下后,先经过消除抖动电路之后,再进入键盘扫描电路,这样就可以使CPU只处理一次按键操作,避免了按键按下时和之后弹起时的抖动对扫描电路的干扰。
另外,LED灯显示可以更直观地看到实验结果。
4.2设计思路
本设计采用方案二,主要由三个功能模块组成:
键盘消抖模块、键盘扫描模块、译码显示模块。
(1)键盘消抖模块
因为普通的按键都是接触式的,当按键闭合或释放时,上下接触面都会产生一个很短暂的抖动,这个抖动时间一般都会持续5-10ms,虽然这个抖动时间很短,但对于FPGA工作在50M的高频率上的器件来说,还是可以捕捉的到的。
为了使CPU对于一次按键操作只处理一次,在软件中必须加入消除抖动处理。
本模块是由四个上升沿触发型D触发器和一个四输入的与门构成的。
四个D触发器用同步时序方式连接,即:
将它们的时钟输入端都连在一起。
在工作时四个D触发器与clk时钟信号同步,输入信号以移位串行方式向前传递。
(2)键盘扫描模块
阵列式键盘又叫做行列式键盘,用带有I/O口的线组成行列结构,按键设置在行列的交点上。
此模块所用键盘是表1所示的4×
4阵列键盘。
按键设置在行列交叉点,行列线分别接到按键开关的两端,每个键的按下与否由这个键的行电平和列电平共同决定,当按下时为低电平“0”,没有按下时为高电平“1”。
表1、4×
4阵列键盘
1
2
3
A
4
5
6
B
7
8
9
C
*
#
D
本模块设计采用扫描的方法来实现对键盘上每个键的识别,即当进行行扫描时,扫描信号由行线进入键盘,以“1110”、“1101”、“1011”、“0111”的顺序每次扫描不同的一行。
之后,读取列线的电平信号,判断是哪个键按下了,如果列线全为高电平,则代表该列没有按键按下,如果列线有输入低电平,则低电平信号所在的行和出现低电平的列的交点处有按键按下。
假设行线为a,列线为b,长度都为4。
将输入行扫描值a与列读取值b并置形成组合值作为按键的输入值,并对每一个键进行编码(如表2键盘参数所示),使其送入输出变量r(定义为4位),即可判断出按键按下的位置。
表2、键盘参数
行扫描a
列读取b
键盘按键
按键编码
1110
0111
0000
1101
0001
1011
0010
0011
0100
0101
0110
1000
1001
1010
1100
1111
3)译码显示模块
该模块包括输出低电平与LED灯显示。
因为实验箱的LED灯是低电平有效,所以需要把输出变量r进行逻辑“非”变换。
该部分采用了4个非门,分别将输入的4位扫描模块输出变量取反。
LED灯的亮灭表示输出变量r。
r为高电平时灯亮,r为低电平时灯灭,这样就能更清晰地显示出实验结果,使人一目了然。
5、功能模块介绍
5.1键盘消抖模块
图5-1消抖动模块
图4为消抖模块的逻辑符号,其中D(3:
0)输入按键按下时带抖动的信号,经过消抖之后,Q(3:
0)输出消除抖动之后的信号,使得CPU可以只对一次按键处理一次信号。
5.2键盘模块
图5-2键盘模块
图5-2为扫描模块的逻辑符号,其中a[3:
0]是4位的行扫描信号,b[3:
0]是4位的列读取信号,r[3:
0]是4位的按键编码输出。
5.3VHDL部分程序
libraryieee;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_1164.all;
entityk44is
port(clk:
instd_logic;
--1khz以下
b,a:
instd_logic_vector(3downto0);
r:
outstd_logic_vector(3downto0));
end;
architectureoneofk44is
--signalc:
std_logic_vector(1downto0);
signalba:
std_logic_vector(7downto0);
--signale:
std_logic_vector(3downto0);
begin
ba<
=b&
a;
--ba<
=e&
b<
=e;
process(a,clk)
--ifrising_edge(clk)thenc<
=c+1;
--casecis
--when"
00"
=>
e<
="
0111"
;
when"
01"
1011"
10"
1101"
11"
1110"
--whenothers=>
null;
--endcase;
casebais
when"
01111110"
r<
0000"
01111101"
0001"
01111011"
0010"
01110111"
0011"
10111110"
0100"
10111101"
0101"
10111011"
0110"
10110111"
11011110"
1000"
11011101"
1001"
11011011"
1010"
11010111"
11101110"
1100"
11101101"
11101011"
11100111"
1111"
whenothers=>
endcase;
--endif;
endprocess;
6、实验结果
6.1综合电路图
图6-1(a)电路原理图
图6-1(b)RTL电路
6.2时序仿真
对源程序进行操作,生成tbw文件后,继续对.tbw进行操作,点击SimulateBehavioralModel出现如下时序图,并对输入与输出进行赋值,如下:
图6-2(a)时序仿真初始图
图6-2(b)时序仿真结果图
具体分析:
如图6-2(b)所示,
(1)当a=0111,b=1110时,对应输出s=0000,此时对应键盘上的S0,输出信息为1;
(2)当a=0111,b=1101时,对应输出s=0001,此时对应键盘上的S2,输出信息为2;
(3)当a=1101,b=1001时,对应输出s=1001,此时对应键盘上的SA,输出信息为9.
综上所分析,实验仿真结果显然满足课题要求,故该实验方案成立。