PS2键盘是目前被广泛使用的键盘之一。首先简单的介绍一下PS2键盘的数据传输模式和时序: ps2接口一共
有6个管脚,如下图:
其中,我们所用到的只有4个管脚。其数据的传输格式和时序如下图:
其发送数据的模式为:当按下按键时,键盘会向外发出通码(即键盘的按键编码),当按键松开的时候,键盘会向外发送断码和相应的通码。如:按下Shift键,按下G键,释放G键,释放Shift键。与这些时间相关的扫描码如下:Shift 键的通码 8’h12,G 键的通码 8’h34,G 键的断码8’hf0 8’h34, Shift 键的断码 8’hf0 8’h12,因此发送到计算机的数据应该是:8’h12 8’h34 8’hf0 8’h34 8’hf0 8’h12。
本实验所实现的功能是通过检测ps2键盘的按键编码,将检测到的编码在数码管上显示,并且将所对应的英文字母发送到上位机,上位机通过串口调试助手显示传回来的数据。
具体模块如下:键盘接收模块,串口波特率产生模块,串口数据发送模块,以及顶层模块。
键盘接收模块:键盘接收的编码主要是在ps2时钟的下沿进行采样的,通过对数据的采样,来判断是哪个按键被按下。
其他模块由于在上一篇文章中已经有过介绍了,这里就不再进行介绍。
具体程序:
//===================================顶层模块==========================================
module ps2_top(clk,rst,ps2k_clk,ps2k_data,rs232_tx,led,seg,wei);
input clk;
input rst;
input ps2k_clk;//ps2接口时钟
input ps2k_data;//ps2数据信号
output rs232_tx;//串口发送
output led;
output [3:0] wei;
output [7:0] seg;
wire [7:0] ps2_byte;1byte键值
wire ps2_state;//按键状态标志位
wire bps_start;//接收到数据后,波特率时钟信号置位
wire clk_bps;//高电平为采样中间点
ps2scan ps2scan( //按键扫描模块
.clk(clk),
.rst(rst),
.led(led),
.ps2k_clk(ps2k_clk),
.ps2k_data(ps2k_data),
.ps2_byte(ps2_byte),
.ps2_state(ps2_state),
.wei(wei),
.seg(seg)
);
speed_select speed_select( 波特率发生模块
.clk(clk),
.rst(rst),
.bps_start(bps_start),
.clk_bps(clk_bps)
);
my_uart_tx my_uart_tx( .clk(clk), 串口发送模块
.rst(rst),
.bps_start(bps_start),
.clk_bps(clk_bps),
.rs232_tx(rs232_tx),
.rx_data(ps2_byte),
.rx_int(ps2_state)