PS2 接口键盘驱动
实验报告
院系名称
: 电子工程学院
专业班级
: 微电子 0901
学 号
: 04094002
学生姓名
: 周源彬
指导老师
: 刘镇弢
时 间
2012-4-17
一、实验目的
熟悉 PS2 接口,以及键盘的工作原理,学会用 Verilog HDL 设计键盘的 PS2 接口驱
动。
二、实验内容
设计基于 FPGA 的 PS2 接口键盘驱动 Verilog 程序,并下载到 ALTERA 的 DE2 学习板
验证程序,通过 RS-232 接口将键盘的结果输送到上位机,显示键盘按键结果。
三、实验原理
如图 3.1 所示,PS2 标准使用了 6 个接
口,各个接口的定义如表 3.1 所示
图 3.1 PS2 标准接口
表 3.1 PS2 引脚说明
数据帧格式如图 3.2 所示,起始位为低电平,停止位为高电平,应答位仅在主机对
设备的通信中使用。
图 3.2 PS2 数据帧格式
PC 通过 PS2 接口与从设备通信时,总在时钟的下降沿读取数据。
键盘的返回值并不是和一般 ASCII 码相对应。键盘的处理器如果发现有键被按下、
释放或者按住,就发送通码。有键被按下时,键盘发送一帧通码数据;过一小段时间再
检查,如果发现该键还按下,即按住,则再次发送通码,第一次检查是否键被按住的时
间较长,当检查到有键被按住时,往后检测时间为大大减小;当一个键被释放,就发送
断码。每个按键被分配了唯一的通码和断码,这样主机通过查找唯一的扫描码就可以测
定是按下哪个键。每个键一整套的通断码组成了扫描集,有三套标准的扫描集,分别是
第一套、第二套(附件 1)、第三套。所有现代的键盘默认使用第二套扫描码。
四、实验步骤
4.1 顶层划分
图 4.1 顶层模块划分
表 2 顶层模块引脚说明
信号名 输入/输出 目标/源 功能描述
clk Input Pin 时钟频率 50MHz,占空比 1:1。
rst_n Input Pin 复位按键,低电平有效。
PS2_LKC Input Pin 键盘的输入时钟,下降沿有效(帧读取数据)
PS2_DAT Input Pin
键盘输送数据的端口,一帧 11 位,1 位起始位,8 位数据位,
1 位奇偶校验位,1 位停止位。
UART_TXD Input Pin RS-232 端口输送数据到上位机。
功能描述:当键盘有键按下或者按住时,先将该通码转化为 ASCII 码,然后通过
RS-232 端口将数据送到上位机显示。Shift 按键为上档键,按住该键可以切换大小写字
母和字符、数字。只定义一些常用的按键。
程序代码:
module PS2_keyboard(clk,
rst_n,
PS2_CLK,
PS2_DAT,
UART_TXD
);
input clk; //50MHz clock
input rst_n; //reset,low level effective
input PS2_CLK; //PS/2 clock
input PS2_DAT; //PS/2 data
output UART_TXD;//RS-232 transmit data signal
wire bps_start; //start produce bps
wire ps2_state; //state transmit data
wire bps_clk; //bps clock
wire [7:0] ps2_byte;//ps2 keyboard data
//produce bps
speed_select bps(.clk(clk),
.rst_n(rst_n),
.bps_start(bps_start),
.bps_clk(bps_clk)
);
//RS-232 Serial Port transmit data
UART_TX uart(.clk(clk),
.rst_n(rst_n),
.bps_clk(bps_clk),
.rx_data(ps2_byte),
.valid_rx(ps2_state),
.UART_TXD(UART_TXD),
.bps_start(bps_start)
);
//PS2 scan data
ps2_scan scan(.clk(clk),
.rst_n(rst_n),
.PS2_CLK(PS2_CLK),
.PS2_DAT(PS2_DAT),
.ps2_state(ps2_state),
.ps2_byte(ps2_byte)
);
endmodule
4.2 子模块描述
4.2.1 speed_select 模块
功能描述:该模块主要产生相应的波特率,将数据传输到上位机。引脚说明如表 4.2
所示。
表 4.2 speed_select 模块引脚说明
信号名称 输入/输出 源 目标 功能描述
rst_n Input Pin 复位按键,低电平有效。
clk Input Pin 时钟频率 50MHz,占空比 1:1。
bps_start
Input
UART_TX
波特率的使能信号,高电平产生波特率,低电平复位。
bps_clk
Output
UART_TX
波特率时钟信号,维持一个时钟周期的高电平。
程序代码:
module speed_select(clk,
rst_n,
bps_start,
bps_clk
);
input clk; //50MHz clock
input rst_n; //reset
input bps_start;//start produce bps
output bps_clk; //bps clock
/*
parameter bps9600 = 5207, //9600bps
bps19200 = 2603, //19200bps
bps38400 = 1301, //38400bps
bps57600 = 867, //57600bps
bps115200 = 433; //115200bps
parameter bps9600_2 = 2603,
bps19200_2 = 1301,
bps38400_2 = 650,
bps57600_2 = 433,
bps115200_2 = 216;
*/
parameter bps9600 = 13'd5207; //full of bps time
parameter bps9600_2 = 13'd2603; //half of bps time
//--------------------------------------------------------------------
//counter
//--------------------------------------------------------------------
reg [12:0] cnt; //counter
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 13'd0;
else if((cnt == bps9600) || !bps_start)
cnt <= 13'd0;
else cnt <= cnt + 1'b1;
end
//--------------------------------------------------------------------
//produce bps clock
//--------------------------------------------------------------------
- 1
- 2
前往页