本帖最后由 gonnavis 于 2011-10-22 01:19 编辑
<verilog那些事儿>没看完,PS/2部分只看了开头一点点,但是分析的很到位,一句顶百句,那张表格也很不错,
又在别的书里学了下状态机.
用仅有的这点知识,硬是编了个键盘控制LED的代码,竟然成功了,自己都感觉意外,
而且试下来,和window中按键反应一模一样.(当然,这本来就是我的目的所在)
按一次键LED变换一次,长按就不停变换,切换按键就接受新按键的输入,释放按键时不产生任何变换.
暂时只支持2个按键,不过想扩展支持按键数也不难,就是多画几个状态而已,当然代码数量肯定要成倍的上去了.
总的思路是:
只用键盘时钟,没用系统时钟.
每一批数据(11位)存入data11中,然后取其中的8个有效数据位存入data中, 这个data 就决定了用户按了什么键.
然后在每批数据结尾,产生一个脉冲,这个脉冲就用来触发状态机.
由于只有键盘时钟,所以这个结尾脉冲必须搭载在键盘时钟上来产生,
也就是说,我必须在每批11个时钟里干三件事: 取data11, 取data,产生一个结尾脉冲,
所以我不得不在data11还没取完的中途就取出data,
这里是我花了较大心思的地方了,自己感觉很微妙,
具体怎么做的大家可以看一下我的代码,
老实说,虽然这代码完全是我自己写出来的,
但我自己也没有完全把思路理清楚,只是试着按照想法大概写了一下,
能成功简直是个奇迹.
好了,data和触发信号有了,
接下来就是状态机了,
这部分怎么弄的,大家可以看一下我画的状态图.
同样,我自己也没完全理清楚,
能成功依然是个奇迹.
第一次做完后发现个bug,
所以后来还不得不加了一个感觉很累赘的unpress2状态.
哦对了,代码中默认用的两个按键是 A 和 S .
|