写在前面的话
我们从小就开始接触电脑,曾经多么羡慕那些在键盘上洋洋洒洒的人,手指轻柔的飞舞,刻画出一章章美丽的篇幅…那么作为工程师的我们,同样拥有着属于我们的情怀。如果曾经的向往变成我们喜欢的玩具;如果曾经的神秘变成我们夜以继日的痴迷。那么,一切又将如何?梦翼师兄携手大家一起来欣赏、来品味。
项目需求
设计一个ps2键盘的接口驱动电路。
原理分析
ps2的接口如下图所示:
其中,1是数据线DATA;
2是预留N/C;
3是GND;
4是VCC(+5V);
5是时钟信号线CLK;
6是预留N/C;
数据传输的时序图如下图所示:
一般的ps2接口,都是ps2产生时钟信号,而且是在上升沿的时候把数据发送出去,而在下降沿的时候数据被采样,大多数的ps2设备发送数据的时钟频率是15Khz-20Khz。每一帧的数据有11位或者12位数据,其中包括:
1位起始位:总为逻辑0;
8位数据位:低位在前;
1位奇偶校验位;
1位停止位:总为逻辑1;
1位答应位:仅用于主机对设备通信中(在本次键盘接口设计中不用)
当键盘的某一个按键被按下的时候,键盘会向外发送那一个按键的通码,当按键松开的时候,键盘就会向外发送那一个按键的断码,需要注意的是,如果按着一个按键不放的话,键盘会以一定的频率发送那一个按键的通码。
右侧小键盘的0-9的通码与断码如下图所示:
现在我们具体举一个例子来说明ps2接口的工作原理,假设我现在按下小键盘中的0键,再按下按键9,然后把按键0松开,最后再松开按键9,ps2往FPGA发送的数据就会如下,先发0按键的通码8’h70,再发9按键的通码8’h7d,接着发0按键的断码8’hf0 8’h70,接着再发9按键的断码8’hf0 8’h7d,发送数据的顺序如下: 8’h70→8’h7d→8’hf0→8’h70→8’hf0→8’h7d。
系统架构
当ps2_data_out信号有效的时候,valid会拉高一个周期(valid可用于同其他级联模块的握手)。
模块功能介绍
模块名 |
功能描述 |
ps2_scan |
将ps2接口传输过来数据转成通码或者断码 |
顶层模块端口描述
端口名 |
端口说明 |
clk |
系统时钟输入 |
rst_n |
系统复位 |
Ps2_clk |
时钟信号线 |
Ps2_data_in |
数据线 |
valid |
通、断码有效信号(高电平有效) |
Ps2_data_out |
通、断码信号 |
用signaltap ii 分析波形
打开signaltap ii ,将采样时钟设置为clk,采样深度为64K。将ps2_clk和ps2_data_in两个输入信号引出来,并将ps2_clk的的触发条件改为下降沿(我们是在ps2_clk为下降沿的时候采集数据),之后进行全编译,并将编译好的sof文件下载到开发板中。
按下数字键“1”(数字小键盘),波形图上出现如下波形:
在ps2_clk每个下降沿,我们进行读数据,分别是:“01001011011”。第一位是起始位“0”,后面连续的8位是低位在前的有效数据:“10010110”,改成高位在前就是“01101001”,也就是我们的8‘h69(1的通码就是8’h69)。第十位“1”为奇偶校验位,第十一位“1”是停止位,这两位不需要我们关心。
放开按键“1”,出现了如下的波形:
在ps2_clk每个下降沿,我们进行读数据,分别是:“00000111111”。第一位是起始位“0”,后面连续的8位是低位在前的有效数据:“00001111”,改成高位在前就是“11110000”