从零开始,在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项目就好了

Technorati 标签: , , ,

本站标签: , , ,

发表评论

日历

2010年七月
« 六    
 1234
567891011
12131415161718
19202122232425
262728293031  

文章索引模板

链接

StatPressCN

Since 20091224:
  • Current page is visited 7 times
  • Now there are 0 friends visiting this blog, 10 today, 7 yesterday, and 148 totally
  • The posts have been viewed 20 times today, 10 yesterday, and 465 totally
  • 0 friends have subscribed this blog
  • The TopPost is Cadence IC5141+Assura 314完全安装指南, TopBroswer is Firefox 3, TopOS is Windows XP
  • You come from , your broswer is , OS is
  • This blog have 53 posts, 4 pages, 8 comments, and 5 commentors.

技术支持来自 天高云淡

BABY COUNT

Just updated...
The Count is 2336.