基于verilog的PS2键盘设计进阶.docx
《基于verilog的PS2键盘设计进阶.docx》由会员分享,可在线阅读,更多相关《基于verilog的PS2键盘设计进阶.docx(10页珍藏版)》请在冰豆网上搜索。
![基于verilog的PS2键盘设计进阶.docx](https://file1.bdocx.com/fileroot1/2023-1/1/bc4cb02d-f303-492f-884a-a3040724e37e/bc4cb02d-f303-492f-884a-a3040724e37e1.gif)
基于verilog的PS2键盘设计进阶
实验九、基于verilog的PS/2键盘设计进阶
一、 前言及背景:
说到PS/2相信大家都不会陌生,不错的,我们日常的鼠标键盘大多是基于PS/2接口设计的。
虽然USB鼠标大有取而代之之势,但是依然阻止不了我们这群IT菜鸟掌握它的强烈欲望,而使用verilog来做PS/2的解码更是需要我们把PS/2的传输协议理解的更透彻一些。
所以,下面就让特权同学带领大家一步一步掌握PS/2。
PS/2接口标准的发展过程
随着计算机工业的发展,作为计算机最常用输入设备的键盘也日新月异。
1981年IBM推出了IBMpc/XT键盘及其接口标准。
该标准定义了83键,采用5脚DIN连接器和简单的串行协议。
实际上,第一套键盘扫描码集并没有主机到键盘的命令。
为此,1984年IBM推出了IBMAT键盘接口标准。
该标准定义了84~101键,采用5脚DIN连接器和双向串行通讯协议,此协议依照第二套键盘扫描码集设有8个主机到键盘的命令。
到了1987年,IBM又推出了PS/2键盘接口标准。
该标准仍旧定义了84~101键,但是采用6脚mini-DIN连接器,该连接器在封装上更小巧,仍然用双向串行通讯协议并且提供有可选择的第三套键盘扫描码集,同时支持17个主机到键盘的命令。
现在,市面上的键盘都和PS/2及AT键盘兼容,只是功能不同而已。
二、 基础知识:
电气特性
管脚说明:
1
DATA
Keydata
2
N.C
Noconnected
3
GND
GND
4
VCC
+5V
5
CLK
Clock
6
N.C
Noconnected
数据格式
数据帧格式说明:
1个起始位
总是逻辑0
8个数据位
(LSB)低位在前
1个奇偶校验位
奇校验
1个停止位
总是逻辑1
1个应答位
仅用在主机对设备的通讯中
表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。
(是不是发现它的数据传输协议和串口很像呢!
呵呵)
PS/2发送数据到PC的时序
键盘接口时序:
(a)键盘发送时序(b)键盘接收时序
注:
在时钟的下降沿读取数据。
以下可做具体写代码设计参考:
从PS/2向PC机发送一个字节可按照下面的步骤进行:
(1) 检测时钟线电平,如果时钟线为低,则延时50us;
(2) 检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1);
(3) 检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时PC机在向 PS/2设备发送数据,所以PS/2设备要转移到接收程序处接收数据);
(4) 延时20us(如果此时正在发送起始位,则应延时40us);
(5) 输出起始位(0)到数据线上。
这里要注意的是:
在送出每一位后都要检测时钟线,以确保PC机没有抑制PS/2设备,如果有则中止发送;
(6) 输出8个数据位到数据线上;
(7) 输出校验位;
(8) 输出停止位
(1);
(9) 延时30us(如果在发送停止位时释放时钟信号则应延时50us);
通过以下步骤可发送单个位:
(1) 准备数据位(将需要发送的数据位放到数据线上);
(2) 延时20us;
(3) 把时钟线拉低;
(4) 延时40us;
(5) 释放时钟线;
(6) 延时20us。
PS/2设备从PC机接收一个字节
由于PS/2设备能提供串行同步时钟,因此,如果PC机发送数据,则PC机要先把时钟线和数据线置为请求发送的状态。
PC机通过下拉时钟线大于100us来抑制通讯,并且通过下拉数据线发出请求发送数据的信号,然后释放时钟。
当PS/2设备检测到需要接收的数据时,它会产生时钟信号并记录下面8个数据位和一个停止位。
主机此时在时钟线变为低时准备数据到数据线,并在时钟上升沿锁存数据。
而PS/2设备则要配合PC机才能读到准确的数据。
具体连接步骤如下:
(1) 等待时钟线为高电平。
(2) 判断数据线是否为低,为高则错误退出,否则继续执行。
(3) 读地址线上的数据内容,共8个bit,每读完一个位,都应检测时钟线是否被PC机拉低,如果被拉低则要中止接收。
(4) 读地址线上的校验位内容,1个bit。
(5) 读停止位。
(6) 如果数据线上为0(即还是低电平),PS/2设备继续产生时钟,直到接收到1且产生出错信号为止(因为停止位是1,如果PS/2设备没有读到停止位,则表明此次传输出错)。
(7) 输出应答位。
(8) 检测奇偶校验位,如果校验失败,则产生错误信号以表明此次传输出现错误。
(9) 延时45us,以便PC机进行下一次传输。
读数据线的步骤如下:
(1) 延时20us;
(2) 把时钟线拉低
(3) 延时40μs
(4) 释放时钟线
(5) 延时20μs
(6) 读数据线。
下面的步骤可用于发出应答位;
(1) 延时15μs;
(2) 把数据线拉低;
(3) 延时5μs;
(4) 把时钟线拉低;
(5) 延时40μs;
(6) 释放时钟线;
(7) 延时5μs;
(8) 释放数据线。
键盘编码返回值介绍:
注意:
键盘的返回值并不是和一般ASCII码相对应!
键盘的处理器如果发现有键被按下、释放或按住键盘,将发送扫描码的信息包到计算机。
扫描码有两种不同类型的通码和断码,当一个键被按下或按住,就发送通码;当一个键被释放,就发送断码。
每个按键被分配了唯一的通码和断码,这样主机通过查找唯一的扫描码就可以测定是哪个按键。
每个键一整套的通断码组成了扫描码集,有三套标准的扫描码集,分别是第一套、第二套和第三套。
所有现代的键盘默认使用第二套扫描码。
虽然多数第二套通码都只有一个字节宽,但也有少数扩展按键的通码是两字节或四字节宽,这类的通码第一个字节总是为E0H。
正如有键按下,通码就被发往计算机一样,只要键一释放,断码就会被发送。
每个键都有它自己唯一的通码,它们也都有唯一的断码。
幸运的是你不用总是通过查表来找出按键的断码,在通码和断码之间存在着必然的联系。
多数第二套断码有两字节长,它们的第一个字节是F0H;第二个字节是这个键的通码扩展按键的断码,通常有三个字节,它们前两个字节是E0H,F0H,最后一个字节是这个按键通码的最后一个字节。
作为例子讲解,下面列出了几个按键的第二套通码和断码。
No.
KEY
通码(第二套)
断码(第二套)
1
"A"
1C
F01C
2
"5"
2E
F02E
3
"F10"
09
F009
4
RightArrow
E0 74
E0F074
5
Right"Ctrl"
E014
E0F014
一个键盘发送值的例子:
通码和断码是以什么样的序列发送到你的计算机,从而使得字符G出现在你的字处理软件里的呢?
因为这是一个大写字母,需要发生这样的事件次序:
按下Shift键,按下G键,释放G键,释放Shift键,与这些时间相关的扫描码如下:
Shift键的通码12H,G键的通码34H,G键的断码F0H34H,Shift键的断码F0H12H,因此发送到你的计算机的数据应该是:
12H34HF0H34HF0H12H。
第二套扫描码:
101102和104键的键盘:
KEY
通码
断码
KEY
通码
断码
KEY
通码
断码
A
1C
F01C
9
46
F046
[
54
F054
B
32
F032
`
0E
F00E
INSERT
E070
E0 F070
C
21
F021
-
4E
F04E
HOME
E06C
E0 F0 6C
D
23
F023
=
55
F055
PGUP
E07D
E0 F0 7D
E
24
F024
\
5D
F05D
DELETE
E071
E0 F0 71
F
2B
F02B
BKSP
66
F0 66
END
E069
E0 F0 69
G
34
F0 34
SPACE
29
F0 29
PGDN
E07A
E0 F0 7A
H
33
F0 33
TAB
0D
F0 0D
UARROW
E075
E0 F0 75
I
43
F0 43
CAPS
58
F0 58
LARROW
E06B
E0 F0 6B
J
3B
F0 3B
LSHFT
12
F0 12
DARROW
E072
E0 F0 72
K
42
F0 42
LCTRL
14
F0 14
RARROW
E074
E0 F0 74
L
4B
F0 4B
LGUI
E01F
E0F01F
NUM
77
F0 77
M
3A
F0 3A
LALT
11
F0 11
KP/
E04A
E0 F0 4A
N
31
F0 31
RSHFT
59
F0 59
KP*
7C
F0 7C
O
44
F0 44
RCTRL
E014
E0 F014
KP-
7B
F0 7B
P
4D
F04D
RGUI
E027
E0F0 27
KP+
79
F0 79
Q
15
F0 15
RALT
E011
E0F0 11
KPEN
E05A
E0 F0 5A
R
2D
F0 2D
APPS
E02F
E0F02F
KP
71
F0 71
S
1B
F0 1B
ENTER
5A
F0 5A
KP0
70
F0 70
T
2C
F0 2C
ESC
76
F0 76
KP 1
69
F0 69
U
3C
F0 3C
F1
05
F0 05
KP 2
72
F0 72
V
2A
F0 2A
F2
06
F0 06
KP 3
7A
F0 7A
W
1D
F0 1D
F3
04
F0 04
KP 4
6B
F0 6B
X
22
F0 22
F4
0C
F0 0C
KP 5
73
F0 73
Y
35
F0 35
F5
03
F0 03
KP 6
74
F0 74
Z
1A
F0 1A
F6
0B
F0 0B
KP 7
6C
F0 6C
0
45
F0 45
F7
83
F0 83
KP 8
75
F0 75
1
16
F0 16
F8
0A
F0 0A
KP 9
7D
F0 7D
2
1E
F0 1E
F9
01
F0 01
]
58
F0 58
3
26
F0 26
F10
09
F0 09
;
4C
F0 4C
4
25
F0 25
F11
78
F0 78
'
52
F0 52
5
2E
F0 2E
F12
07
F0 07
41
F0 41
6
36
F0 36
PRNT
SCRN
E012
E07C
E0F0
7CE0
F012
.
49
F0 49
7
3D
F0 3D
SCROLL
7E
F0,7E
/
4A
F0 4A
8
3E
F0 3E
PAUSE
E11477
E1F014
F077
-NONE-
ACPI扫描码:
KEY
通码
断码
Power
E0,37
E0,F0,37
Sleep
E0,3F
E0,F0,3F
Wake
E0,5E
E0,F0,5E
Windows多媒体扫描码:
KEY
通码
断码
NextTrack
E0,4D
E0,F0,4D
PreviousTrack
E0,15
E0,F0,15
Stop
E0,3B
E0,F0,3B
Play/Pause
E0,34
E0,F0, 34
Mute
E0,23
E0,F0, 23
VolumeUp
E0,32
E0,F0, 32
VolumeDown
E0,21
E0,F0, 21
MediaSelect
E0,50
E0,F0, 50
E-Mail
E0,48
E0,F0, 48
Calculator
E0,2B
E0,F0, 2b
MyComputer
E0,40
E0,F0, 40
WWWSearch
E0,10
E0,F0, 10
WWWHome
E0,3A
E0,F0, 3a
WWWBack
E0,38
E0,F0, 38
WWWForward
E0,30
E0,F0, 20
WWWStop
E0,28
E0,F0, 28
WWWRefresh
E0,20
E0,F0, 20
WWWFavorites
E0,18
E0,F0, 18
三、实验说明
上面说了这么一大通,如果是第一次接触PS/2协议的朋友一定是头大了,如果你用别的MPU做过PS/2的通信,那么上面的协议对于你只是小case,权当复习一下好了。
下面要开始动手实践了,协议一大堆内容,我们要做的是一个相对比较容易的实验,达到入门的目的即可,当然更深入的探讨有兴趣的朋友可以在这个基础上继续。
实验内容
通过FPGA把大写字母A-Z转换成相应的ASCII码,只要字母按键被按下,就能在串口调试助手里显示相应大写字母。
四、verilog代码以及详细注释
除了顶层模块(ps2_key),三个底层模块分别为PS/2传输处理模块(ps2scan)、串口传输模块(my_uart_tx)以及串口波特率选择模块(speed_select)(下面只给出顶层模块和PS/2传输处理模块的verilog代码,串口部分的设计可以参考串口通信设计)。
详细的project代码参考在同目录文件夹ps2verilog下,该代码下载配置后,接上PS/2键盘(注意PS/2一般不支持热拔插,最好CPLD下载后在掉电状态下插入PS/2键盘,然后上电),随后打开串口调试助手,如果按下键盘上A-Z任意个键,串口调试助手即可显示相应字母。
(串口调试助手在附赠光盘软件目录下,注意设置好波特率,默认波特率为9600bps,代码中可以随意调整;8位数据,不需要校验位)。