数字逻辑部分的最后一篇博客。当初是为了做课设,需要用到外接键盘,但是只有一块4*4的键盘。无奈只能想到连USB接口的外接键盘。然后在网上搜了很多,找到了一篇PS/2协议外接键盘的微博。在那篇微博的基础上完成了课设。

进入正题,因为BASYS3开发板有一个USB接口,而目前大部分外接键盘也都是使用的USB接口。使用PS/2的设备好像不常见了,但是市面上的键盘都兼容PS/2标准。附一张PS/2接口的图片,图源:百度百科。

然后学过微机或者单片机的同学知道,CPU和外部I/O之间的通信方式有同步和异步两种。PS/2是采用同步方式的,一个数据帧是11-12位(取决于谁是发送主方)。因为本片博客是PS/2的键盘,所以是主机是接收方,数据帧是11位的。
参考:PS/2百度百科
从PS/2向PC机发送一个字节可按照下面的步骤进行:
(1)检测时钟线电平,如果时钟线为低,则延时50μs;
(2)检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1);
(3)检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时PC机在向PS/2设备发送数据,所以PS/2设备要转移到接收程序处接收数据);
(4)延时20μs(如果此时正在发送起始位,则应延时40μs);
(5)输出起始位(0)到数据线上。这里要注意的是:在送出每一位后都要检测时钟线,以确保PC机没有抑制PS/2设备,如果有则中止发送;
(6)输出8个数据位到数据线上;
(7)输出校验位;
(8)输出停止位(1);
(9)延时30μs(如果在发送停止位时释放时钟信号则应延时50μs)。
中间8个数据位里填充的是PS/2的键码。因为实验只是涉及到了怎么用,所以我没有详细地查看它的原理。需要说明的PS/2键盘的键值并不是ASCII码的值。需要我们去自己转换。具体原理可以参考:PS/2协议分析。以及本实验没有附上的键盘键值。


//
module ps2scan(clk,ps2k_clk,ps2k_data,ps2_byte,ps2_state);
input clk; //50M时钟信号  //复位信号
input ps2k_clk;   //PS2接口时钟信号
input ps2k_data;  //PS2接口数据信号
output[3:0] ps2_byte;    // 1byte键值,只做简单的按键扫描
output ps2_state;    //键盘当前状态,ps2_state=1表示有键被按下
//------------------------------------------
reg ps2k_clk_r0,ps2k_clk_r1,ps2k_clk_r2;  //ps2k_clk状态寄存器
//wire pos_ps2k_clk;     // ps2k_clk上升沿标志位
wire neg_ps2k_clk;   // ps2k_clk下降沿标志位
always @ (posedge clk) begin           //锁存状态,进行滤波ps2k_clk_r0 <= ps2k_clk;ps2k_clk_r1 <= ps2k_clk_r0;ps2k_clk_r2 <= ps2k_clk_r1;end
assign neg_ps2k_clk = ~ps2k_clk_r1 & ps2k_clk_r2;    //下降沿
//------------------------------------------
reg[7:0] ps2_byte_r;     //PC接收来自PS2的一个字节数据存储器
reg[7:0] temp_data;  //当前接收数据寄存器
reg[3:0] num; //计数寄存器
always @ (posedge clk) beginif(neg_ps2k_clk) begin //检测到ps2k_clk的下降沿case (num)4'd0:  num <= num+1'b1;4'd1:  beginnum <= num+1'b1;temp_data[0] <= ps2k_data;  //bit0end4'd2:  beginnum <= num+1'b1;temp_data[1] <= ps2k_data;  //bit1end4'd3:  beginnum <= num+1'b1;temp_data[2] <= ps2k_data;  //bit2end4'd4:  beginnum <= num+1'b1;temp_data[3] <= ps2k_data;  //bit3end4'd5:  beginnum <= num+1'b1;temp_data[4] <= ps2k_data;  //bit4end4'd6:  beginnum <= num+1'b1;temp_data[5] <= ps2k_data;  //bit5end4'd7:  beginnum <= num+1'b1;temp_data[6] <= ps2k_data;  //bit6end4'd8:  beginnum <= num+1'b1;temp_data[7] <= ps2k_data;  //bit7end4'd9:  beginnum <= num+1'b1;  //奇偶校验位,不做处理end4'd10: beginnum <= 4'd0;  // num清零enddefault: ;endcaseend
end
reg key_f0;       //松键标志位,置1表示接收到数据8'hf0(键盘断码),再接收到下一个数据后清零
reg ps2_state_r;  //键盘当前状态,ps2_state_r=1表示有键被按下
always @ (posedge clk) begin //接收数据的相应处理,这里只对1byte的键值进行处理if(num==4'd10&&neg_ps2k_clk) begin   //刚传送完一个字节数据if(temp_data == 8'hf0) key_f0 <= 1'b1;else beginif(!key_f0) begin //说明有键按下ps2_state_r <= 1'b1;ps2_byte_r <= temp_data; //锁存当前键值        endelse beginps2_state_r <= 1'b0;key_f0 <= 1'b0;endendend
end
reg[3:0] ps2_asci=0;   //接收数据的相应ASCII码
always @ (posedge clk) begincase (ps2_byte_r)    //键值转换为ASCII码,这里做的比较简单,只处理8'h45: ps2_asci <= 4'h0;//08'h16: ps2_asci <= 4'h1;//18'h1E: ps2_asci <= 4'h2;//28'h26: ps2_asci <= 4'h3;//38'h25: ps2_asci <= 4'h4;//48'h2E: ps2_asci <= 4'h5;//58'h36: ps2_asci <= 4'h6;//68'h3D: ps2_asci <= 4'h7;//78'h3E: ps2_asci <= 4'h8;//88'h46: ps2_asci <= 4'h9;//98'h15: ps2_asci <= 8'h51; //Q8'h1d: ps2_asci <= 8'h57; //W8'h24: ps2_asci <= 8'h45; //E8'h2d: ps2_asci <= 8'h52; //R8'h2c: ps2_asci <= 8'h54; //T8'h35: ps2_asci <= 8'h59; //Y8'h3c: ps2_asci <= 8'h55; //U8'h43: ps2_asci <= 8'h49; //I8'h44: ps2_asci <= 8'h4f; //O8'h4d: ps2_asci <= 8'h50; //P       8'h1c: ps2_asci <= 8'h41; //A8'h1b: ps2_asci <= 8'h53; //S8'h23: ps2_asci <= 8'h44; //D8'h2b: ps2_asci <= 8'h46; //F8'h34: ps2_asci <= 8'h47; //G8'h33: ps2_asci <= 8'h48; //H8'h3b: ps2_asci <= 8'h4a; //J8'h42: ps2_asci <= 8'h4b; //K8'h4b: ps2_asci <= 8'h4c; //L8'h1a: ps2_asci <= 8'h5a; //Z8'h22: ps2_asci <= 8'h58; //X8'h21: ps2_asci <= 8'h43; //C8'h2a: ps2_asci <= 8'h56; //V8'h32: ps2_asci <= 8'h42; //B8'h31: ps2_asci <= 8'h4e; //N8'h3a: ps2_asci <= 8'h4d; //Mdefault: ;endcase
end
assign ps2_byte = ps2_asci;
assign ps2_state = ps2_state_r;
endmodule

代码参考:PS/2键盘解码实验。如有错误,欢迎指正。

BASYS3开发板与键盘连接实验相关推荐

  1. linux开发板通过网线连接电脑(win10)连接网络问题

    最近开始学习嵌入式Linux开发,使用野火imx6ull开发板,想把开发板通过网线连接到笔记本(笔记本连接WiFi),共享使用网络:查询了很多资料后成功实现,我现在把这个方法分享出来. 1.禁用防火墙 ...

  2. arm开发板通过网线连接笔记本电脑上外网

    需要工具:arm开发板,网线,一台双网卡的win7笔记本电脑(笔记本电脑一般都是双网卡) 一.笔记本电脑需要先连上外网,可以连上家里的WIFI,或者手机开热点(本人未测试过连接手机的热点,但是理论上应 ...

  3. arm开发板用无线网卡连接ap

    首先arm开发板上一定要有无线网卡的驱动!2.6内核支持10多种无线网卡芯片的驱动在买网卡的时候最后芯片是linux内核里有的! 要不找着合适的驱动很麻烦! 接下来就是命令来连接ap 我用vista系 ...

  4. STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验

    一.首先我们来了解建立好的工程框架 1.USER 组USER下面主要存放的是用户代码. main.c是主函数 system_stm32f4xx.c文件是片上外设接入层系统文件,主要是申明设置系统及总线 ...

  5. 主机、虚拟机、开发板之间网络连接设置

    最近在玩开发板,主机使用的无线网卡,开发板与主机网线直连,现在开发板想使用tftp直接从虚拟机下载镜像等文件,偶尔又需要虚拟机从主机下载文件,虚拟机有时候又需要网络,经过一番折腾算是调试成功. 1.主 ...

  6. 看完相当于学过并实践用过arduino! ——复现arduino开发板的众多小实验

    吃饱喝足,回学校了.今天到了arduino开发板和一整套学习工具,马上就回宿舍开始学习,直播更新 回到宿舍吃点补品就开始啦. 首先是开箱,整个箱子的图片就不拍了,是一个塑料盒子.里面包含一本教材和各种 ...

  7. crt无法网络连接linux开发板,securceCRT网络连接不正常解决途径

    作为一名初学的小白,在完成作业练习时出现了很多别人看起来简单却让我十分头疼的问题,其中最麻烦和头疼的就是用securceCRT时出现的网络连接不正常. 在查看VM ware虚拟机时用ifconfig查 ...

  8. 嵌入式linux开发板使用pulseaudio连接蓝牙耳机播放音频文件

    pulseaudio基于a2dp音频架构,其使用流程如下: 首先需要一直bluez5及pulseaudio,此处关于一直pulseaudio详见其他博客. 配置使用流程: 1.开启蓝牙设备 //此处与 ...

  9. Linux开发板开机自动连接WiFi,IMX6UL(讯为开发板)。

    总共需要修改三个文件 1.wpa_supplicant.conf 2.link_wifi.sh 3.rc.local 1.wpa_supplicant.conf 文件路径:/etc/wpa_suppl ...

最新文章

  1. leetcode 解压缩_谁说 Python 的 shutil 不支持 7z 解压缩,我来教你扩展它的功能!...
  2. CentOS-6.2编译Qtopia-2.2.0
  3. 回腾讯了......
  4. 如何查看某个js 变量 runtime 类型
  5. ssh-scan处理手记
  6. 2019 ACM/ICPC 全国邀请赛(西安)J And And And (树DP+贡献计算)
  7. 万能电子狗升级工具_HUD抬头显示,车萝卜再推新品,屏幕全新升级
  8. 纯新手DSP编程--5.30--任务的通信和同步
  9. opencv学习笔记2:图像滤波
  10. matlab基因频率是看最大值吗,基于ICA的语音信号盲分离
  11. 公众号添加跳转网页链接
  12. 网站分析基础概念之初访者
  13. 【React Router 6 快速上手一】重定向Navigate / useRoutes路由表 / 嵌套路由Outlet
  14. ORB-SLAM Spanning Tree 的作用
  15. 上市公司环境污染数据大全 2000-2020年上市公司(区分行业、重污染)环境污染数据 环境信息披露EDI 环保投资环境绩效环境排放数据
  16. 安装 Visual Studio Community 2015
  17. 如何巧妙的申请换部门_换部门申请书
  18. python同花顺 财务_使用Python抓取同花顺资金流数据
  19. 5G驱动数字经济崛起,博睿数据入选电信管理论坛(TM Forum)催化剂项目团队
  20. C#索引器-索引器和属性的区别

热门文章

  1. CF 453A(Little Pony and Expected Maximum-若干次掷骰,最大那次期望-推公式)
  2. 哲理故事三百篇(1-50)5
  3. 芯片工艺PVT STA分析 OCV分析
  4. [ZYNQ随笔] uboot移植中bitstream比特流加载问题:zynq_validate_bitstream: Bitstream is not validated yet
  5. PhotoShop制作水滴魔幻特效(转)
  6. Excel 单元格中增加下拉菜单并且填充不同的颜色
  7. 微信对话在线生成器html5源码
  8. 计算机存储盘教程,计算机SATA硬盘安装教程
  9. 大学生压力主要来源于社会就业(转)
  10. C++使用hash_map时警告