PS2鼠标键盘驱动设计
AI summary
PS2鼠标键盘驱动设计的背景是为了解决普通键盘无法满足输入需求的问题,采用PS2接口以便于与FPGA连接。设计中涉及PS2协议的通信方式、键盘扫描码的解码、设计架构及实现过程,并通过仿真测试验证功能。最终,设计可扩展为基于PS2键盘的电子琴,利用特定按键发声。
Last edited time
Sep 24, 2024 07:00 AM
Last edited by
Tags
Serial Communication
Communication Protocols
Data Transmission Methods
一:设计背景
在电子系统当中,当需要用到大量的按键作为输入时,普通的按键/矩阵键盘已经无法满足输入需求,这个时候,我们就需要使用一种功能更加强大的键盘,来帮助我们输入更多的信息。在PC机上,我们经常用到104键的键盘,这种键盘和PC机的接口,可以分为USB和PS2接口;一般采用FPGA实现USB接口比较困难,因为USB的接口线路,不是标准的TTL电平,而PS2接口,则时采用标准的TTL电平;故采用PS2键盘来扩展FPGA的输入设备,以便输入更多的信息。
二:ZX-1开发板硬件原理图

PS2有6脚的mini_din的连接器:

信号 | 描述 |
1:DATA | 串行数据线 |
2:No implemented | 无定义保留 |
3:GND | 电源地 |
4:VDD5 | 电源+5V |
5:CLOCK | 串行时钟线 |
6:No implemented | 无定义保留 |
PS2有5脚的mini_din的连接器:

信号 | 描述 |
1:CLOCK | 串行时钟线 |
2:DATA | 串行数据线 |
3: No implemented | 无定义保留 |
4:GND | 电源地 |
5: VDD5 | 电源+5V |
有两种通讯方式(双向串行通信):设备发送数据到主机/主机发送数据到设备
在设计时,讨论设备发送数据到主机方式,也就是说通过FPGA(主机)来解码PS2设备发送过来的数据。
- FPGA和PS2设备端口连接:
- 1个起始位(总是为0)
- 8个数据位(LSB优先)
- 1个校验位(奇校验)
- 1个停止位(总是为1)

PS2协议中有两根信号线:1根时钟线(ps2_sclk)和1根数据线(ps2_sda)。把采用PS2协议的键盘称为从设备(S:PS2),把控制和解码PS2协议的称为主设备(M:FPGA),PS2总线协议的两根线,时钟信号线始终由从设备产生(PS2设备)。
PS2时钟大小最大不超过33KHZ,往往在10~20KHZ之间。
PS2从设备发送1个完整的数据包,满足以下的数据格式:

PS2键盘按照上述的数据格式来发送数据,对于FPGA来说,只需要正确的视线该协议的解码,将其中的8位数据读取出来即可。在时序图中,可以看出数据是在时钟的下降沿是最稳定的,所以只需在时钟的下降沿来读取数据,在检测到时钟下降沿时读取数据线上的电平,就能够正确的读取到数据。
- 键盘扫描码
至于FPGA解码的数据具体是什么内容,需要对照键盘扫描码来查看,常用的键盘扫描码是第二套键盘扫描码(104键)。

在104键中,分为短码和长码(扩展码)。
长码:通码通常为两个字节(E0+XX)
例:HOME MAKE:E0 6C BREAK:E0 F0 6C
短码:通码通常为一个字节(XX)
例:A MAKE:1C BREAK:F0 1C
通码:指按键按下时键盘会发送通码。
断码:指按键释放时键盘会发送断码。
- 实际上PS2键盘上按键由按下到释放的响应过程:
- 键盘检测到按键A按下
- 键盘发送A键通码1C
- 键盘检测到按键A释放
- 键盘发送A键断码F0 1C
- 键盘检测到按键A按下
- 键盘发送A键通码1C
- 短暂的机打延时
- 键盘会检测到按键A依然按下
- 键盘发送A键通码
- 短暂的机打延时
- 键盘检测按键A释放
- 键盘发送A键断码F0 1C

例如:键盘上按键“A”的通码“1C”,断码是“F0 1C”。当按键“A”按下时,键盘就会往FPGA发送“A”的通码“1C”,如果A键一直处于按下状态,那么在一个短暂的机打延时后,键盘会再次往FPGA发送“1C”,机打延时后,直到A键被释放,在A键释放时,键盘会往FPGA发送A键的断码,首先发送第一个字节“F0”,然后再发送第二个字节“1C”。
机打延时:第一个字符数据和第二个字符数据延时时间。
机打速率:每秒钟可以打印多少个字符数据。
短码按键方式:
(1)短按并立即释放
(2)长按再释放
…
如果是长码(扩展码),和短码中短按以及长按区别在于:发送通码时,长码会发送2个字节数据(E0 XX),发送断码时,长码会发送3个字节(E0 F0 XX)。
发送通码时,短码会发送1个字节(XX),发送断码时,短码会发送2个字节(F0 XX)。
三:设计实现
- 设计架构

也可以将接收数据设置为10位,包括1位长短码标志(0:短码 1:长码),1位通断码标志(0:通码 1:断码),低8位数据为接收8bit数据。
- 设计分析
- 节拍在PS2时钟的每一个下降沿进行计数;
- 时钟下降沿是读取8位数据(1个字节),也可以称为解码PS2发送过来的数据(满足PS2协议即可)
- 解码完成后判断按键的数据具体是长/短码 通/断码。

采用线性序列机实现数据的解码:
直接对PS2时钟下降沿进行计数

利用PS2时钟的下降沿来完成节拍计数(0~10),读取数据时,在节拍1读取D0数据;在节拍2读取D1数据….在节拍8读取D7数据(1~8:D0~D7)。
对PS2时钟下降沿进行寄存

利用PS2时钟的下降沿标志寄存(11个PS2时钟下降沿),读取数据时,在节拍2读取D0数据,在节拍3读取D1数据….在节拍9读取D7数据。(2~9:D0~D7)。
- 设计实现
采用线性序列机实现。
节拍 | LSM_1S:节拍计数 | LSM_2S:对应节拍发生动作 | 说明 |
(sys_rst_n==0):cnt=0 | (sys_rst_n==0):temp_data=8’h0 | 初始状态 | |
0 | (ps2_clk_neg==1):cnt=cnt+1 | ||
2 | cnt=cnt+1 | temp_data[0]=ps2_sda | LSB:D0 |
3 | cnt=cnt+1 | temp_data[1]=ps2_sda | D1 |
4 | cnt=cnt+1 | temp_data[2]=ps2_sda | D2 |
5 | cnt=cnt+1 | temp_data[3]=ps2_sda | D3 |
6 | cnt=cnt+1 | temp_data[4]=ps2_sda | D4 |
7 | cnt=cnt+1 | temp_data[5]=ps2_sda | D5 |
8 | cnt=cnt+1 | temp_data[6]=ps2_sda | D6 |
9 | cnt=cnt+1 | temp_data[7]=ps2_sda | MSB:D7 |
- 仿真测试
PS2时钟在测试时假设设定为20KHZ
F=20KHZ T=10^9/20K=50,000ns
HALF_T=T/2=25000ns
例1:测试INSERT按下(E0,70)。

例2:测试4组短码(QWER)和4组长码(INSERT/HOME/END/DELET)
模拟按键时(长/短码)都有按键按下和释放。
短码:15----->F0 15----->1D----->F0 1D----->24----->F0 24----->2D----->F0 2D
长码:E0 70----->E0 F0 70----->E0 6C----->E0 F0 6C----->E0 69----->E0 F0 69----->E0 71----->E0 F0 71
需要模拟32组数据发送。

- 下板验证

下板验证结果:

键盘第二套扫描码转换成ASCII码:
A:8’h1C 8’d65
ESC:8’h76 8’h1B
四:PS2键盘拓展
可以做成一个基于PS2键盘的硬件电子琴设计。

- 电子琴设计分析
PS2键盘设备有104键,规定其中21个键使其蜂鸣器发声。

红色标注按键:低音1~7(QWERTYU)
绿色标注按键:中音1~7(ASDFGHJ)
蓝色标注按键:高音1~7(ZXCVBNM)
音名 | 频率:HZ | 音名 | 频率:HZ | 音名 | 频率:HZ |
低音1(Q) | 262 | 中音1(A) | 523 | 高音1(Z) | 1046 |
低音2(W) | 294 | 中音2(S) | 587 | 高音2(X) | 1175 |
低音3(E) | 330 | 中音3(D) | 659 | 高音3(C) | 1318 |
低音4(R) | 349 | 中音4(F) | 698 | 高音4(V) | 1397 |
低音5(T) | 392 | 中音5(G) | 784 | 高音5(B) | 1568 |
低音6(Y) | 440 | 中音6(H) | 880 | 高音6(N) | 1760 |
低音7(U) | 494 | 中音7(J) | 988 | 高音7(M) | 1976 |
使用的21个按键均为短码,那么也就是说通码只有1个字节,断码只有2个字节(第一个字节:F0)
按键按下时,使其蜂鸣器响对应的音调,抬起时不发声。
可以判断断码标志是0/1,如果是1(断码:按键释放),蜂鸣器不发声。
如果是0(通码:按键按下),蜂鸣器发声,一旦能够发声,具体看设置按键对应哪一个音调。
练习:
- 了解PS2理论(详见PS2器件手册)
- 尝试完成PS2驱动线性序列表
- 尝试PS2驱动设计(建议测试时以其中一种情况做测试:短码通码(通过模拟PS2协议发送出去))
拓展:主机发送数据到设备

Loading...