从零开始,在FPGA上使用PS2键盘
| 热度: |
声明:全文属原创,转载请注明出处。文中引用的图片均有原地址链接。
这两天因为项目需要,得做一个ps2键盘和FPGA板的接口程序,google了一下,再参考些别人的代码,慢慢明白了PS2键盘的工作原理,自己动手写了个verilog模块用来驱动键盘。因为项目的重心不在键盘上,所以模块写得很简单,只驱动了几个键并且没考虑多键同时按下和特殊按键的情况,留待以后再完善吧。
先从PS2键盘的工作原理说起吧。
PS2键盘和主机通信的方式很简单,PS2接口上有6根线,2根是没用的,1根电源,1根地,另外两根是我们要考虑的。其中一根是时钟,对于我那个项目而言,因为不用考虑诸如设置键盘重复频率,numlock灯之类的问题,只需要读取键盘发来的数据,所以这个时钟就由键盘提供。这个时钟频率约在10~16.7kHz之间。另一根是数据线,每按下或松开按键时就会有1~3组不等的数据从数据线传过来,因此FPGA要做的就是按键盘时钟将这些数据接收并解码成所需的格式。
发送回的数据格式大致如下:
每组数据为11位,包括1位起始位,8位数据位,1位奇偶校验位(奇校验)和1位停止位。起始位永远为0,停止位永远为1。8位数据为按键的代码,按键和代码的对应关系参见以下地址:
http://www.computer-engineering.org/ps2keyboard/scancodes2.html
注意其中的make和break的区别。make是当按下键的时候发送的代码,break是抬起键的时候发送的代码。对于有多个代码的键,每一个代码都要按照上述格式发送,这就是为什么会有1~3组不等的数据发回的原因。
收到代码之后,用一个case就可以识别不同的键并实现任意形式的转换(转成ASCII码,控制信号等等等等)。
目前我只能做到识别抬起键,还不能做到识别抬起哪个键,不过这个程序改起来应该也不会太复杂,等到有时间了改一改。
代码可以去www.opencores.org下载,找到bu pacman项目就好了