以下内容均以Xilinx的Nexys3作为开发板
1.PS/2键盘简介

虽然Nexys3开发板是利用USB接口搭载键盘,但是其原理与PS/2键盘完全相同,现在就仅以PS/2键盘为例讲解如何将键盘搭载在开发板上。代码程序均在Nexys3上经过测试。

PS/2标准键盘使用6个接口,各个接口定义如下:

1:DATA,数据信号
2:N.C.,不连接
3:GND,地
4:VCC,+5V电源
5:CLK,时钟
6:N.C.,不连接

而对于USB键盘,有用的接口只有两个CLK以及DATA,同时需要+5V供电。这点很重要,但是FPGA的CMOS最大供电是3.3V,如何解决这个问题笔者也是花费了一番周折,文章末会提到。

PS/2标准的数据帧格式与串口通讯很相似,USB就是串口通讯的格式。起始为低电平,停止位为高电平。如果数据位中1的个数是偶数,校验位就为1;如果数据位中1的个数是奇数,校验位就为0,通常自己使用我们都不管校验位。其实就是奇校验。

图1 数据帧格式
2.键盘扫描码

当PC通过PS/2接口与从设备通信时,总是利用下降沿读取数据。键盘仅仅在数据线和时钟线都为高电平(即空闲态)时可以把数据传送给主机,一旦主机使用了总线,键盘在驱动总线前必须检查主机当前是否仍在发送数据。为了促进这一核查,时钟线将暂时作为发送完成信号。一旦主机把时钟线拉低,那么键盘将使时钟线变成高电平才可以传输数据。

PS/2型键盘主要使用扫描码来进行数据传输。每个按键被按下时都会被分配固定的扫描码,如果按键一直被按下,那么该按键码值将每隔100ms重复发送一次。当按键释放后,一个关键码F0发送后,该扫描码才会被发送。当使用上档键进行组合键时,也会产生上档键的码值,并且由主机决定到底是哪一个ASCII值。当组合键被释放后,一个E0和F0关键码发送后,按键扫描码才被发送。。大多数按键的扫描码如下图所示。

图2 键盘扫描码

主机也会向键盘发送数据。下面是主机可能发送的常用命令的清单。

ED  使NumLock,CapsLock和ScrollLock LED灯发光。在接收到ED后键盘反馈FA码,然后主机发送一个用来设置LED显示状态的字节:第0位控制ScrollLock置位,第1位控制NumLock置位,第2位控制CapsLock置位;

EE  用来进行键盘测试,当键盘接受EE后将反馈EE;

F3  设置扫描码重复频率,当键盘接受FA反馈F3后,主机将发送第二个字符用来设置重复频率。

FE  重新发送。FE将使键盘重新发送最近的扫描码。

FF  重置。重置键盘。

3.源程序简介

PS/2键盘模块接口定义:

首先,还是利用移位寄存器的方式捕捉PS/2键盘时钟线的下降沿。
reg ps2_clk_r0,ps2_clk_r1,ps2_clk_r2;
wire neg_ps2_clk;always @(posedge clk or negedge rst_n) begin
if (!rst_n)  beginps2_clk_r0 <= 1'b0;ps2_clk_r1 <= 1'b0;ps2_clk_r2 <= 1'b0;endelse beginps2_clk_r0 <= ps2_clk;ps2_clk_r1 <= ps2_clk_r0;ps2_clk_r2 <= ps2_clk_r1;end
end // end alwaysassign neg_ps2_clk = ps2_clk_r2 & (~ps2_clk_r1);

neg_ps2_clk即为PS/2时钟信号下降沿的有效信号。然后,利用一个寄存器和计数器,存储8位有效数据帧。

//------------------------------------------------------
// 接受来自PS/2键盘的数据存储器
reg [7:0] ps2_byte_r;        // 来自PS/2的数据寄存器
reg [7:0] temp_data;            // 当前接受数据寄存器
reg [3:0] num;always @(posedge clk or negedge rst_n) beginif (!rst_n) beginnum <= 4'd0;temp_data <= 8'd0;endelse if (neg_ps2_clk) begincase (num)4'd0: beginnum <= num + 1'b1;end4'd1: beginnum <= num + 1'b1;temp_data[0] <= ps2_data;end4'd2: beginnum <= num + 1'b1;temp_data[1] <= ps2_data;end4'd3: beginnum <= num + 1'b1;temp_data[2] <= ps2_data;end4'd4: beginnum <= num + 1'b1;temp_data[3] <= ps2_data;end4'd5: beginnum <= num + 1'b1;temp_data[4] <= ps2_data;end4'd6: beginnum <= num + 1'b1;temp_data[5] <= ps2_data;end4'd7: beginnum <= num + 1'b1;temp_data[6] <= ps2_data;end4'd8: beginnum <= num + 1'b1;temp_data[7] <= ps2_data;end4'd9: beginnum <= num + 1'b1;end4'd10: beginnum <= 4'b0;enddefault: num <= 4'd0;endcaseend
end // end always 

通过当前按键状态,判断通码还是断码,并保存在ps2_byte_r的8位寄存器内。

//-------------------------------------reg key_f0;                // 松键标志位reg ps2_state_r;        // 当前状态,高电平表示有键按下always @(posedge clk or negedge rst_n) beginif (!rst_n) beginkey_f0 <= 1'b0;ps2_state_r <= 1'b0;ps2_byte_r <= 8'd0;endelse if (num == 4'd10) begin    // 刚传输一个字节if (temp_data == 8'hf0)    begin // 断码的第一个字节key_f0 <= 1'b1;end    else beginif (key_f0) begin    // 存储通码ps2_state_r <= 1'b1;ps2_byte_r <= temp_data;key_f0 <= 1'b0;endelse beginps2_state_r <= 1'b0;key_f0 <= 1'b0;endend    endelse    ps2_state_r <= 1'b0;end // end always

利用case判断不同的通码,来决定字符的ASCII。

//---------------------------------------reg [7:0] ps2_ascii;    //接受相应的asciiIalways @(posedge clk) begincase (ps2_byte_r)8'h15: ps2_ascii = 8'h51;    //Q8'h1d: ps2_ascii = 8'h57;    //W8'h24: ps2_ascii = 8'h45;    //E8'h2d: ps2_ascii = 8'h52;    //R8'h2c: ps2_ascii = 8'h54;    //T8'h35: ps2_ascii = 8'h59;    //Y8'h3c: ps2_ascii = 8'h55;    //U8'h43: ps2_ascii = 8'h49;    //I8'h44: ps2_ascii = 8'h4f;    //O8'h4d: ps2_ascii = 8'h50;    //P                      8'h1c: ps2_ascii = 8'h41;    //A8'h1b: ps2_ascii = 8'h53;    //S8'h23: ps2_ascii = 8'h44;    //D8'h2b: ps2_ascii = 8'h46;    //F8'h34: ps2_ascii = 8'h47;    //G8'h33: ps2_ascii = 8'h48;    //H8'h3b: ps2_ascii = 8'h4a;    //J8'h42: ps2_ascii = 8'h4b;    //K8'h4b: ps2_ascii = 8'h4c;    //L8'h1a: ps2_ascii = 8'h5a;    //Z8'h22: ps2_ascii = 8'h58;    //X8'h21: ps2_ascii = 8'h43;    //C8'h2a: ps2_ascii = 8'h56;    //V8'h32: ps2_ascii = 8'h42;    //B8'h31: ps2_ascii = 8'h4e;    //N8'h3a: ps2_ascii = 8'h4d;    //Mdefault    ps2_ascii = 8'hfe;endcase    endassign ps2_byte = ps2_ascii;assign ps2_state = ps2_state_r;

以上就是程序代码的主要部分。最重要的还是管脚分配文件如何解决FPGA供电不足的问题。其实也很简单,只是我们平时不常用罢了。而且这也是官方标准ucf文件的一个错误。只需要将PS/2键盘的时钟线与数据线上拉即可,详细内容如下(只列举PS/2键盘部分):

NET "ps2_clk" LOC = L12 | IOSTANDARD = LVCMOS33 | PULLUP;

NET "ps2_data" LOC = J13 | IOSTANDARD = LVCMOS33 | PULLUP;

至此,笔者也只是将PS/2键盘搭载到了开发板上。但是如何更加灵活的利用键盘以及VGA,还需要仔细的设计各个寄存器的功能以及用法。

以下Demo内容需要连接VGA接口,按动键盘的A~Z的任意键,LED灯会显示对应的ASCII值。若按动A键,屏幕会显示字符a。(因为没有时间折腾字符提取软件,rom比较小只存了a的一个字符。喜欢的朋友也可以增加很多其他的字符。)若按动其他键,屏幕只显示一个白色矩形。

4.源程序

PS2键盘源程序.rar

以上内容均可以在百度网盘下载http://pan.baidu.com/share/link?shareid=940132753&uk=1092766566。

转载于:https://www.cnblogs.com/bombe1013/p/3294372.html

【原创】FPGA开发手记(三) PS/2键盘相关推荐

  1. 【正点原子FPGA连载】 第三章 硬件资源详解 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  2. FPGA开发技巧:Modelsim仿真.do文件详细解析 原创 特权同学

    FPGA开发技巧:Modelsim仿真.do文件详细解析 原创 特权同学 FPGA快乐学习 以<FPGA边码边学 视频教程>"Lesson06 分频计数器设计"中的si ...

  3. 三、1【Verilog HDL】基础语法快速入门(FPGA开发)

    参考资料: 参考野火FPGA开发视频的基础语法:[野火]FPGA系列Xilinx Artix7教学视频,真正的手把手教学,"波形图"教学法,现场画波形图写代码,硬件基于野火FPGA ...

  4. 【正点原子FPGA连载】第三十九章OV7725摄像头RGB-LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  5. 【正点原子FPGA连载】第三十四章RGB-LCD触摸屏实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  6. 紫光同创 FPGA 开发跳坑指南(三)—— 联合 Modelsim 仿真

        Modelsim 是 FPGA 开发中重要的 EDA 设计仿真工具,主要用于验证数字电路设计是否正确.紫光 Pango Design Suite 开发套件支持联合 Modelsim 仿真,这里 ...

  7. 【正点原子FPGA连载】 第三十五章双目OV5640摄像头HDMI显示实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  8. 【正点原子FPGA连载】第二章 实验平台简介 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  9. 【正点原子FPGA连载】 第二章 实验平台简介 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

最新文章

  1. 软件自动测试框架,软件自动化测试框架的研究和实现
  2. python 中type和object的关系
  3. 基础算法 -- 贪心算法
  4. Srs之Clion编译
  5. 1.PHP数据库陷阱
  6. RAKE接收技术基础知识
  7. Win32_1深入浅出windows消息机制
  8. W3school离线手册最新版下载
  9. python3思维导图.xmind_Xmind和FreeMind思维导图格式互转
  10. 【常垒·投资】芯率智能完成A轮融资
  11. 查手机服务器ip和端口网站,手机怎么看ip和端口
  12. Matlab - 在Figure界面去掉图像的坐标刻度
  13. jmeter之取样器(HTTP请求、调试取样器)
  14. mt5虚拟服务器,mt5云服务器
  15. 我对软件分层设计的思考
  16. hive中如何计算字符串中表达式
  17. react 翻书效果_React-FlipOver-Counter(日历翻页)
  18. 三国志战略版:Daniel_S7赤壁前瞻4_地图深度解析
  19. 如何远程桌面局域网内计算机,实现远程访问局域网内的多台电脑
  20. Python提取excel中指定关键字的单元格

热门文章

  1. 快速理解聚合根、实体、值对象的区别和联系
  2. Steve Kemp的XSS介绍
  3. Sendmail服务器的配置
  4. 推荐一款非常好用的java反编译工具
  5. mysql查询未讲课教师_经典教师 学生 成绩sql面试题再次来袭3(附答案)
  6. 怎么把截屏的一部分内容涂掉_电脑怎么录屏?录屏软件的使用技巧
  7. 大数据开发笔记(四):Hive分区详解
  8. 获取一个字符串在另一个字符串中出现的次数
  9. 扩展JavaScript数组(Array)添加删除元素方法
  10. 辐流式重力浓缩池计算_污泥浓缩池工作方式