FPGA PS2键盘打字机(硬件历险记,第8部分)

2020-11-03 14:45:21

将PS2键盘与FPGA接口,我们将如何处理醉酒键盘?我们要用醉酒的键盘做什么?我们要用醉酒的键盘做什么?一大早!19世纪初的一个海上棚屋,我在“历险记”第6部分--秒表内存映射LCD控制器中实现了内存映射显示后,我想多玩一下LCD显示。我还买了一个PS2键盘,感觉这两个可以搭配在一起。所以,和我一起尝试一些在实际工程场景中可能不切实际的东西:一台电子打字机,你键入的单词会显示在屏幕上。处理PS2协议的最终项目预览传输设备(键盘或鼠标)在10-16.7 kHz范围内触发时钟,然后在PS2时钟的每个下降沿上,这些位经过数据引脚:1个起始位8个数据位1个奇偶校验位1个停止位此分配描述了一种简单的数据收集方法,该方法由@Negedge CLK触发,在11状态机器中仅收集8个数据位而忽略其他数据位。在示波器上捕获PS2时钟引脚波形试图在示波器上捕获PS2时钟有点麻烦。再说一次,更正确地阅读规范可能会让我不那么惊讶,因为它明确地指出,只有当有一些数据通过线路时才会生成时钟信号。PS2接收器如果我们想要与系统的其余部分友好相处,我们应该将协议封装到PS2接收器模块中,接口如下(根据本文):模块PS2_RX(输入线CLK,RESET,输入线ps2d,//PS2数据输入线ps2c,//PS2时钟输入线rx_en,//Receiver Enable Output reg rx_one_tick,//表示数据可用输出线[7:0]DOUT//PS2 scancode);注意,PS2接收器代码不是我自己想出来的,但是在线查看各种实现向我展示了处理输入和状态的不同方法。然后,我们可以使用RX_DONE_TICK信号将此模块连接到系统的其余部分。在这种情况下,我直接将接收到的扫描码通过转换器转换成ASCII码(通过下面的Verilog模块)到显示RAM中,稍后在屏幕上显示。这是当我在键盘上键入“hello”时发生的情况:*符号代表未知的扫描码PS2生成和中断代码HM,这并不是我所期望的。再来看看PS2协议,它使用Make(按下)和Break(释放)代码的概念进行操作,因此H(0x48)的扫描码在被推送时首先被发送,然后在它被释放时发送“Break Code”0xF0,紧随其后的是“Break Code”0xF0。再次使用H(0x48)的扫描码。对于特殊的键,如ALT、箭头键、HOME、END等,这有点复杂,因为这些键有多个单词组成的代码。在按住H键的情况下,它会生成代码序列48 48 48...。F0 48。当然,当您按住A并按下B,然后松开B再松开A时,您会得到一系列的Make代码,分别是A、B、B和A的Break代码。键Make Break A 1C F0,1C B 32 F0,32 Backspace 66 F0,66 L Shift 12 F0,12 Enter 5A F0,5A Left←E0,6B E0,F0,6B Numpad 4 6B F0,6B Home E0,6C E0,F0,6C Numpad 7 6C F0,6C暂停E1,1D,45,E1,9D,C5-None-在这个简单的打字机案例中,让我们假装对键盘释放事件不感兴趣。同样碰巧的是,多字制码的最后一个字通常对应于常规键盘上的键的另一个版本。因此,左箭头←的代码与键盘4 E0,6B的代码相同,在我的键盘上,键盘上有一个左箭头图片。这意味着,如果我们假装键盘上的数字部分不存在,我们可能只需要解释make代码的最后一个词,就可以得到最正确的含义。改进仅处理按键,而不是释放我们应该升级键盘驱动程序,在其周围添加另一个处理按键的模块。它有一个新输出:makeBreak,它将为make输出1,为Break代码输出0。然后,在顶部模块中,我们可以通过完全忽略带有中断码标志的扫描码来单独处理这些情况。E0后面似乎有一个扫描码,E1后面似乎有两个扫描码。有一些扫描码序列较长的奇怪密钥:Pause:e11D 45 e1 9D C5,Print Screen:e0 2a e0 37。我会假装这些不存在。我将新模块命名为ps2_keypress_driver,如果事件带有中断代码,它实际上会忽略这些事件。它还推进了写入内存的字节的地址,所以现在当我们键入Hello时,它会存储相应的ASCII码48454C4C4F,然后它们就会显示出来。//将当前ASCII代码写入$CURRENT_ADDRESS并将地址前进1 WRITE_ADDRESS<=CURRENT_ADDRESS;RAM_IN<=ASCII_SCAN_DATA;CURRENT_ADDRESS<=CURRENT_ADDRESS+1;WE<=1‘b1;实现退格键。实施结束