原创 【转】模拟PS2协议,丢掉4x4键盘,来用标准键盘吧!

2008-4-29 10:34 2666 3 6 分类: FPGA/CPLD
本来以为模拟PS2协议相当的麻烦,今天下了一本PS2协议手册看了半天,原来读键盘值相当简单嘛,比模拟SPI、I2C简单多了呵呵。

下面介绍一下具体过程

1.明确接线关系,只需接4根线,VCC要+5V,3.3我测试过不能用,时钟和数据线要用bidir双向口线,FPGA可以不用外接上拉电阻。另外,USB键盘也可以用,只要用一个转接头转成PS2即可。
1.JPG (33.26k字节) 删除
图片代码: 
点击看大图



2.读取基本的键盘数据,不需要FPGA发送任何数据,只需读取键盘发回来的数据即可

如下面的时序图,每次键盘发送11个clock信号,我们需要做的事情就是在时钟的下降沿读取数据

2.jpg (33.25k字节) 删除
图片代码: 
点击开大图 

3.如何来采样CLK低电平?

这里可以用一个FIFO来储存数据,如下面的程序,当ps2_clk信号处于下降沿时,ps2_clk_fallingedge值将被置高

reg [2:0] ps2_clkr;//用一个fifo来采样ps2_clk信号;
always @(posedge clk)  
ps2_clkr <= {ps2_clkr[1:0], ps2_clk};

wire ps2_clk_risingedge = (ps2_clkr[2:1]==2'b01); // now we can detect ps2_clk rising edges
wire ps2_clk_fallingedge = (ps2_clkr[2:1]==2'b10); // and falling edges

4.当检测到第一个低电平时,我们只需要连续读取11个周期值就可以了,这里用一个变量i来控制

always @(posedge clk)
if(rst)
i <= 0;
else
begin
if(ps2_clk_fallingedge)
begin
data2 <= data;
data <= ps2_data;
if(i<10) i <= i+1;
else i <= 0;
end
end

最后来解释下这11个数据的功能,如下表
3.jpg (10.92k字节) 删除
图片代码: 
点击开大图 

5.如果想进一步区分键值,就需要查表了,如下表

4.jpg (42.85k字节) 删除
图片代码: 
点击看大图 
基本按键,键盘会发送“F0”+“键码”

扩展按键,则发送“E0”+“F0”+“键码”

大家都来试一下吧,一个下午就能搞定!

附程序,晶振频率降至1MHz,用LED输出键值

//==============================================================

module ps2(clk, rst, ps2_clk, ps2_data, data ,data2);

input clk, rst, ps2_clk , ps2_data;
output [10:0] data;
output [10:0] data2;


reg [3:0] i;  
reg [10:0] data;//another fifo
reg [10:0] data2;


reg [2:0] ps2_clkr;//用一个fifo来采样ps2_clk信号;
always @(posedge clk)  
ps2_clkr <= {ps2_clkr[1:0], ps2_clk};

wire ps2_clk_risingedge = (ps2_clkr[2:1]==2'b01); // now we can detect ps2_clk rising edges
wire ps2_clk_fallingedge = (ps2_clkr[2:1]==2'b10); // and falling edges


always @(posedge clk)
if(rst)
i <= 0;
else
begin
if(ps2_clk_fallingedge)
begin
data2 <= data;
data <= ps2_data;
if(i<10) i <= i+1;
else i <= 0;
end
end

endmodule

//========================================================

文章评论3条评论)

登录后参与讨论

用户146369 2009-3-7 20:14

这个是用fpga试的一个小模块。原作者是我大学另外一个学院的强人。 你说的STC单片机的串口应该是UART吧,也是可以实现的

用户1443911 2009-3-6 11:18

请问你这篇东西是转谁的?

用户1443911 2009-3-6 11:17

好东西,但我还是做不出,我用STC单片机用串口数数据,就是不行,用单片机接键盘的时钟和数据线可以吗?请教了。我真的是不会啊?都弄了两个星期了,每天不少于9个少时的弄,就是弄不了。感谢....
相关推荐阅读
用户146369 2010-05-11 20:06
几个中兴华为3G模块比较
注:X表示资料中未提及。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />参数MC86...
用户146369 2010-05-11 17:55
关于移动通信的一些基本概念和3G(最近学习笔记,不一定对)
名词解释:IMT-2000:国际移动通信2000                   工作在2000MHz,最高2000kbit/s(至少:室内2Mbit/s,室外步行384kbit/s,室外车载14...
用户146369 2010-03-15 16:09
小鲍子回来了
好久没来了,没来的这段时间主要是上课,跟师兄后面做嵌入式软件,然后陆续的出差。现在刚接了一个网络摄像头的新项目,搜资料一不小心搜到这里,突然想回来了。接下来的日子,与EDN一起进步...
用户146369 2009-04-20 16:08
备忘Mfile:不过新版本的WINAVR已经是好的了
AVR-GCC“needed by 'xx.elf'”编译错误解决方案初次使用AVR-GCC/WINavr,使用VC++6.0做IDE,尝试编译程序时候总是出现如下错误:<?xml:namesp...
用户146369 2009-03-15 16:08
TIP:mega128 and max485
大致情况:M128连接MAX485,再通过485转232转换器连接到上位PC机。出现问题:M128与上位机的通讯能发能收,但收发的数据通通不正确。M128接收的错误数据多是255,发送的错误数据多出现...
用户146369 2009-03-04 17:01
ADI的客服气死我啦!
本来周围人就告诫我说ADI的样片难弄,可惜我这次偏偏要用到几种ADI的片子,没法子硬着头皮去申请。登陆后,网上选好了我要的样片;结果跳出来的网页ADI的客服要我们打电话过去,说是申请流程的一部分。最让...
我要评论
3
3
关闭 站长推荐上一条 /2 下一条