PS/2键盘接口(VHDL)

逻辑主页

代码下载

PS/2键盘接口逻辑: ps2_keyboard.vhd (5.1 KB)

消抖逻辑(必须包含在项目中):debounce.vhd (2.4 KB)

特性

  • PS/2键盘接口的VHDL源代码
  • 输出从键盘接收到的PS/2通码与断码
  • 当新代码可用时设置标志输出
  • 验证PS/2传输的奇偶校验位、起始位和停止位
  • 可配置的系统时钟频率
  • 同步PS/2时钟域与系统时钟域
  • 对输入的PS/2信号进行消抖处理

引言

本文详述了用VHDL编写的、适用于CPLD和FPGA的PS/2键盘接口组件。该组件接收来自PS/2键盘的数据传输,并通过并行接口向用户逻辑提供键盘通码和断码。其设计采用Quartus II 12.1版本完成。图1展示了PS/2键盘接口集成到系统中的典型示例。此处提供了一个实现该PS/2键盘接口组件的示例设计,可将PS/2键盘转换为ASCII编码器。该PS/2键盘接口本身是此处提供的PS/2主机收发器的简化版本。

1. 示例实现

背景

PS/2(IBM个人系统/2)是一种通过6针Mini-DIN接口连接键盘和鼠标与PC兼容计算机系统的接口。计算机系统必须为键盘或鼠标提供5V电源和接地连接。通信通过2线串行接口进行,包括时钟线和数据线。两条线都需要上拉电阻(图1中显示为2kΩ)。图1中的120Ω串联电阻用于将3.3V FPGA I/O与5V信号进行接口。

键盘通电后,会执行自初始化序列。完成后即可通过PS/2接口传输键盘事件。

图2展示了事务格式。时钟信号和数据信号在非活动状态下均为逻辑高电平。键盘同时提供时钟信号和数据信号。时钟频率在10 kHz至16.7 kHz之间(即周期为60-100微秒)。数据以起始位(逻辑低电平)开始,后跟一个字节的数据、一个奇偶校验位,最后是停止位(逻辑高电平)。数据以最低有效位(LSB)优先发送。每个比特应在时钟信号的下降沿读取。完成后,时钟和数据信号均返回逻辑高电平。

2 PS/2键盘传输时序图

数据字节代表键盘扫描码的一部分:可能是通码(按键按下)或断码(按键释放)。存在三种不同的扫描码集,但绝大多数键盘使用附录中提供的扫描码集2。通码通常由一或两个字节组成。若通码使用两个字节,首字节为x"E0"。特定按键的断码通常与其通码相同,只是断码会在倒数第二字节处额外插入x"F0"字节。(PAUSE和PRNT SCRN键不遵循上述规则)

虽然可以向键盘发送数据(用于更改设置等),但通常无需此操作,本VHDL组件也未包含该功能。但此处提供的PS/2主机收发器组件可实现此功能。

操作原理

图3从概念上展示了PS/2键盘接口组件的架构。来自键盘的时钟信号和数据信号首先进行同步和消抖处理。(消抖组件的VHDL代码已在上文提供,文档可在此处查阅。)处理后的内部PS/2数据信号在PS/2时钟下降沿时被串行加载到移位寄存器中。空闲计数器用于判定传输何时结束,其定义为PS/2时钟信号保持高电平超过55微秒(即超过最坏情况下PS/2时钟周期的一半)。组合错误检查逻辑会验证起始位、停止位和奇偶校验位与数据的匹配性。当PS/2端口空闲且数据有效时,组件输出接收到的PS/2代码,并将ps2_code_new 信号置高以指示 ps2_code 总线上有新代码可用。该代码在总线上保持有效,直到接收到新代码。ps2_code_new 信号保持高电平,直到下一个PS/2事务开始(当PS/2时钟信号变低时会清零空闲计数器)。

3. PS/2键盘接口逻辑架构

端口描述

表1描述了PS/2键盘接口的端口定义。

1. 端口描述

设置时序参数

系统时钟频率会影响消抖时间和空闲计数器时序。ENTITY中声明的两个GENERIC参数clk_freqdebounce_counter_size 必须正确设置,以确保组件正常运行。clk_freq 参数必须设置为系统时钟clk 的频率(以Hz为单位)。提供代码中的默认设置为50 MHz(该组件在此频率下进行了仿真和测试)。必须按照此处提供的消抖组件文档要求设置debounce_counter_size 参数,使2^debounce_counter_size/clk_freq=5微秒。对于50 MHz的系统时钟,debounce_counter_size = 8。

示例传输

图4展示了一个示例传输的时序图。当PS/2时钟信号变为低电平时,ps2_code_new 标志位会解除置位,表示新的PS/2键盘传输正在进行。事务完成后,ps2_code_new 标志断言,表示已接收到新的PS/2代码,并在ps2_code 总线上可用。本例中接收到的PS/2编码为x"1C",即"A"键的按下码。

05_00

4. PS/2通信示例

结论

该PS/2键盘接口是可编程逻辑元件,用于接收来自PS/2键盘的通信数据。它能同步时钟域、消除输入信号抖动、执行错误检查,并在键盘新编码通过并行输出总线就绪时通知用户逻辑。

附录:扫描码集 2

A1. 键盘扫描码集2

按键 按下码 释放码
A 1C F0,1C
B 32 F0,32
C 21 F0,21
D 23 F0,23
E 24 F0,24
F 2B F0,2B
G 34 F0,34
H 33 F0,33
I 43 F0,43
J 3B F0,3B
K 42 F0,42
L 4B F0,4B
M 3A F0,3A
N 31 F0,31
O 44 F0,44
P 4D F0,4D
Q 15 F0,15
R 2D F0,2D
S 1B F0,1B
T 2C F0,2C
U 3C F0,3C
V 2A F0,2A
W 1D F0,1D
X 22 F0,22
Y 35 F0,35
Z 1A F0,1A
0 45 F0,45
1 16 F0,16
2 1E F0,1E
3 26 F0,26
4 25 F0,25
5 2E F0,2E
6 36 F0,36
7 3D F0,3D
8 3E F0,3E
9 46 F0,46
` 0E F0,0E
- 4E F0,4E
= 55 FO,55
|5D F0,5D
BKSP 66 F0,66
SPACE 29 F0,29
TAB 0D F0,0D
CAPS 58 F0,58
L SHFT 12 FO,12
L CTRL 14 FO,14
L GUI E0,1F E0,F0,1F
L ALT 11 F0,11
R SHFT 59 F0,59
R CTRL E0,14 E0,F0,14
R GUI E0,27 E0,F0,27
R ALT E0,11 E0,F0,11
APPS E0,2F E0,F0,2F
ENTER 5A F0,5A
ESC 76 F0,76
F1 5 F0,05
F2 6 F0,06
F3 4 F0,04
F4 0C F0,0C
F5 3 F0,03
F6 0B F0,0B
F7 83 F0,83
F8 0A F0,0A
F9 1 F0,01
F10 9 F0,09
F11 78 F0,78
F12 7 F0,07
PRNT SCRN E0,12,E0,7C E0,F0,7C,E0,F0,12
SCROLL 7E F0,7E
PAUSE E1,14,77,E1,F0,14,F0,77 -NONE-
[ 54 FO,54
INSERT E0,70 E0,F0,70
HOME E0,6C E0,F0,6C
PG UP E0,7D E0,F0,7D
DELETE E0,71 E0,F0,71
END E0,69 E0,F0,69
PG DN E0,7A E0,F0,7A
U ARROW E0,75 E0,F0,75
L ARROW E0,6B E0,F0,6B
D ARROW E0,72 E0,F0,72
R ARROW E0,74 E0,F0,74
NUM 77 F0,77
KP / E0,4A E0,F0,4A
KP * 7C F0,7C
KP - 7B F0,7B
KP + 79 F0,79
KP EN E0,5A E0,F0,5A
KP . 71 F0,71
KP 0 70 F0,70
KP 1 69 F0,69
KP 2 72 F0,72
KP 3 7A F0,7A
KP 4 6B F0,6B
KP 5 73 F0,73
KP 6 74 F0,74
KP 7 6C F0,6C
KP 8 75 F0,75
KP 9 7D F0,7D
] 5B F0,5B
; 4C F0,4C
52 F0,52
, 41 F0,41
. 49 F0,49
/ 4A F0,4A

相关主题

PS/2主机收发器(VHDL)
PS/2键盘转ASCII转换器(VHDL)
PS/2鼠标接口(VHDL)
消抖逻辑电路(VHDL)