PS2键盘FPGA程序Word格式文档下载.docx

上传人:b****5 文档编号:16180725 上传时间:2022-11-21 格式:DOCX 页数:12 大小:414.65KB
下载 相关 举报
PS2键盘FPGA程序Word格式文档下载.docx_第1页
第1页 / 共12页
PS2键盘FPGA程序Word格式文档下载.docx_第2页
第2页 / 共12页
PS2键盘FPGA程序Word格式文档下载.docx_第3页
第3页 / 共12页
PS2键盘FPGA程序Word格式文档下载.docx_第4页
第4页 / 共12页
PS2键盘FPGA程序Word格式文档下载.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

PS2键盘FPGA程序Word格式文档下载.docx

《PS2键盘FPGA程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《PS2键盘FPGA程序Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。

PS2键盘FPGA程序Word格式文档下载.docx

 

11

取值:

x---x 

x

意义:

开始位 

数据位 

寄偶校验位 

停止位 

应答位

PS2的一帧是12位。

对PS2进行解码时,除了第1~8位数据位以外,其余的位都可以无视。

键盘的编码有“通码”(Make)和“断码”(Break)之分。

看得简单一点就是,“通码”是某按键的“按下事件”,“断码”是某按键的“释放事件”。

假设,我按下“W”键不放,每秒大约会输出10个“0x1d”的“通码”。

然后我释放“W”键,就会输出“0xF00x1d”的“断码”。

编码键盘还有一个老规则,就是一次只有一个输出。

再假设我按下“W”键不放,然后我再按下“X”键不放,那么会输出“0x1d”“0x22”“0x22”........的通码。

如果此时我放开“X”键,就会输出“0xf00x22”的“断码”,此时“W”键的“通码”已经无效。

但是当我释放“W”键的时候,依然会输出“0xf00x1d”,“W”键的“断码”。

至于组合键“Shift+?

”,“Ctrl+?

”都是软件的工作,还需要详解。

FPGA模拟PS2协议 

referto

2010-10-1409:

40:

58| 

分类:

fpga| 

标签:

ps2_clkr 

data2 

fpga 

rst 

reg 

|字号大中小 

订阅

/*出处

在以前使用单片机对PS2进行解码的时候,一句话就是苦。

如果是CPLD或者FPGA的前提下,PS2的解码才有意义。

第N位

属性

开始位

1~8

数据位

9

校验位

10

结束位

PS2的一帧是11位。

对编码键盘“键盘码”的简单认识

普通计算机采用的都是“编码键盘”,但是“编码键盘”的“编码方式”有分为“第一套”“第二套”和“第三套”。

“第二套”的编码使用较为普遍,大致上的民用键盘都是采用“第二套”编码方式。

”都是软件的工作,我们就无视吧。

在组合模块ps2_module.v中包含了两个功能块:

“电平检测模块”detect_module.v和"

ps2解码模块"

ps2_decode_module。

detect_module.v的添加时为了检查PS2时钟信号的“下降沿”,此外也是为了使模块的建立更简单。

ps2_decode_module.v如字面上的意思,对每帧(十一位一组数据)的数据进行解码和过滤的行为,最后将一字节数据输出PS2_Data,然后PS2_Done_Sig产生一个高脉冲,表示完成一次性的操作。

ps2_decode_module.v最主要的核心是在第31~55行。

同样这个模块也是采用“仿顺序操作”的写法。

步骤i一开始会停留在0(33行),当检查到H2L_Sig的变化,我们知道PS2一帧数据的第第0位是开始位,所以无视。

在接下来的8个位都是数据位,PS2的数据位是从最低位开始,最高位结束。

然后对PS2_Data_Pin_In引脚进行读值(第36~37行)。

PS2一帧数据的第9~10位是校验位和结束位,执行无视操作(39~40行)。

在i等于11的时候(42行),我们要进行判断,读取的“数据是通码还是断码?

”,如果是“通码”(44行),就进入49行随后产生一个高脉冲的完成信号(49~53行),最后返回33行,等待下一次的操作。

如果是“断码”(43行),进入46行随后对“断码”采取无视的操作(46~47行),最后产生一个高脉冲的完成信号,然后返回第33行(49~53行)。

实验八的PS2解码仅对“通码”执行操作,相反却对“断码”采取无视的行为。

实验八的重点主要是如何实现“PS2时钟采样”和“PS2数据采样”操作?

从上图中我们可以看到,黑金的时钟频率比起PS2的时钟频率,大约是2000倍。

而detect_module.v就是利用这2000个时钟信号去采集每个PS2时钟的下降沿(小箭头)。

当detect_module.v检测到ps2时钟产生下降沿,(detect_module.v32行)由于布尔的表达式关系,就会产生一个高脉冲经H2L_Sig信号。

PS2协议的一帧数据大约是11个数据位,换句话说就会产生11个下降沿,也就是说会产生11次高脉冲的H2L_Sig。

PS2时钟在每一个下降沿的时候,PS2数据就会“设置”(移位)数据,而ps2_decode_module.v中的31~55行,就是对PS2数据的移位进行“数据采样”。

假设PS2时钟在第一次的下降沿,自然而然PS2数据会“设置”第0位数据(ps2_decode_module.v34行),ps2_decode_module.v采取无视的操作,接下来的八位数据位才是真正需要的数据位。

有一点比较值得注意的是在ps2_decode_module.v第42~44行。

从上面我们知道,黑金的时钟频率对ps2的时钟频率有2000倍的相差,从另一个角度去理解的话,距离每一次PS2时钟信号的下降沿,黑金拥有2000个可以执行的时间。

然而在第42~44行只用了一个时间去判断,余下还剩下1999个可空闲的时间。

也就是说,采样和被采样的频率如果相差越大,采样方可执行的空余的时间就越多,在设计上就越轻松。

实验八总归也就是属于PS2解码的部分。

然而笔者在设计上,对ps2_detect_module.v添加了PS2_Done_Sig,这个信号无疑是表示了“一次性操作”已经完成的次数。

因为编码的键盘,只要按着不放就会一直发送“通码”,如果笔者针对“通码”去设计的话,笔者永远“只能得到键盘的数据”,已不是“通码”和“次数”这两方。

实验八演示中的“命令控制模块”cmd_control_module.v会对“W”,“X”和“Ctrl”键作出反应。

在cmd_control_module.v的输出是4位的信号,初始值是4'

b0001。

当“W”键按下,就会产生左移的效果,“X”键则是右移。

至于“Ctrl”键会产生“互换”。

第16~35行是cmd_control_module.v的核心部分,当PS2_Done_Sig产生高脉冲(23行),该控制模块就会对PS2_Data产生反应。

8'

h1d是“W”键的通码,而8'

h22是“X”键的通码,至于8'

h14是“Ctrl”键的通码。

“W”键,产生左移效果(26~27行),

“X”键,产生右移效果(29~30行),

“Ctrl”键,产生互换效果(32~33行)。

exp08_demo.v是ps2_module和cmd_control_module.v的组合模块。

ps2_module.v的具体介绍请参考实验七。

实验八演示结论:

我以前接触过很多有关PS2的解码实验,都非常执着与“字符”有关。

其实无论是什么输出,只要有效的利用“通码”就不成问题。

最重要的是如何编辑这些“通码”称为有效的“命令”!

?

还有另一点,编码键盘虽然很方便,但是编码键盘是无法取代独立键盘。

在实验八演示中,在两个键同时按下的时候,仅有按下最迟的一方才有输出“通码”的权利。

相反独立按键是完全“并行”执行,不会出现对输出争先恐后的事件。

所以在许多方面编码键盘还是不完美。

最后还有一点,就是所有拥有PS2接口的设备,一般上都是“低速”设备,这一点要好好的记住。

实验八总结:

实验八主要是表达“低级建模”在“读取”或者“采样”上发挥的效果。

在众多同样的试验中,笔者常常可以看到所有模块都是往一个.v文件里面写,虽然在编辑上会很方便,但是在“理解的方式上”,“理解的形状上”又是怎么一回事?

同样的,实验八和实验七建模的数量都是不相上下,或者可以说这是“低级建模”的普遍缺点,但是读者是不是会察觉到?

当你在组合模块,将一个一个模块实例化,思路无比是清晰,而且设计的工作也容易?

好吧,换另一个话题去讨论实验八的重点:

always@(posedgeCLK)

......

如上面的代码,在同样一个模块中出现了两个always块,在一般的情况下,我们都会“从上往下”读,类似顺序操作那样看待。

如果你的理解能力好,或者已经习惯了,那么这事儿不成问题。

但是在实际的操作中,所有always块都是“并行”执行者,很多新手都会被自身的“假概念”误导。

如果将上述的问题反映在建模上,往往会使更多新手进入瓶颈。

就像在第二章的实验,笔记一直在强调“并行”的概念和重要性。

“低级建模”的多模块设计无疑是能很好的发挥“并行”的概念。

如实验八演示中,detect_module.v,ps2_decode_module.v,cmd_control_module.v,它们在每一个时钟的上升都是在独立工作着。

至于它们会不会被触发或者协调执行,完全是依赖自身早已被设定好的功能。

detect_module.v在每一个时钟源的上升沿(posedgeCLK),如果检测到PS2时钟发生下降沿,就会经H2L_Sig产生高脉冲,除此之外它的工作就结束了。

然而ps2_decode_module.v在每一个时钟源的上升沿(posedgeCLK),如果检测到H2L_Sig的高脉冲,就会对PS2数据一帧数据的执行采集和过滤的动作,最后将完整的数据输出至PS2_Data,然后PS2_Done_Sig产生一个时钟的高脉冲,它就完工了。

cmd_control_module.v在每一个时钟源的上升沿(posedgeCLK),如果被PS2_Done_Sig触发,那么它就会依据PS2_Data的数据作出相对的反应,否则它就一直保持沉默。

虽然整体的主观上,它们会如同连线关系一方接着触发着一方。

但是实际上,每一个模块都保持者独立关系,只有在“触发”的时候才工作。

当然“低级建模”所强调的准则不仅是重视在“并行”的理解上,还有好多好多的故事会发生在这本笔记的后面。

参考网址:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1