PS/2鼠标接口(VHDL实现)

逻辑主页

代码下载

PS/2鼠标接口(顶层文件):ps2_mouse.vhd (10.8 KB)

PS/2主机收发器(必须同时包含在项目中):ps2_transceiver.vhd (11.2 KB)

消抖逻辑(必须同时包含在项目中): debounce.vhd (2.4 KB)

功能特性

  • PS/2鼠标接口的VHDL源代码
  • 将PS/2鼠标配置为持续数据流模式
  • 通过并行接口接收并输出PS/2数据
  • 新数据到达时触发标志位
  • 可配置系统时钟频率
  • 同步PS/2时钟域与系统时钟域
  • 对输入PS/2信号进行消抖处理

简介

本文详述了用VHDL编写的CPLD/FPGA专用PS/2鼠标接口组件。该组件初始化鼠标并将其配置为标准数据流模式。随后持续接收鼠标数据流,通过并行接口输出至用户逻辑。新数据就绪时通过标志位通知用户逻辑。本组件使用Quartus II 13.1版本开发。图1展示了PS/2鼠标接口在系统中的典型应用实例。

1. 应用实例

背景知识

PS/2 通信协议

PS/2(IBM Personal System/2)是一种通过6针Mini-DIN接口连接键盘和鼠标到PC兼容计算机系统的接口。计算机系统必须为键盘或鼠标提供5V电源和接地连接。通信通过2线串行接口进行,包括时钟线和数据线。两条线都需要上拉电阻(图1中显示为2kΩ)。图1中的120Ω串联电阻用于将3.3V FPGA I/O与5V信号接口连接。

图2展示了接收事务的格式。空闲时,时钟和数据信号均为逻辑高电平(注意上拉电阻)。设备同时提供时钟信号和数据信号。时钟频率在10 kHz至16.7 kHz之间(即周期为60-100微秒)。数据以起始位(逻辑低电平)开始,随后是一个字节的数据、一个奇偶校验位,最后是停止位(逻辑高电平)。数据以最低有效位(LSB)优先发送。每个比特应在时钟信号的下降沿读取。完成后,时钟和数据信号均恢复为逻辑高电平。

02_00

2 PS/2接收时序图

图3显示了发送事务的格式。主机首先通过将时钟线拉低100微秒来请求发送数据。这将禁用PS/2总线。在这100微秒的禁用期后,主机释放时钟线并在数据线上输出一个低电平起始位。随后设备开始生成时钟脉冲。在每个下降沿,主机依次移出数据位(先传输最低有效位),最后是奇偶校验位。在下一个时钟周期,主机释放数据线,该线路被上拉电阻拉高以表示停止位。设备在时钟上升沿读取这些信号后,会发出一个逻辑低电平的确认位,向主机反馈已成功接收数据。主机在最后一个下降沿读取该确认位,随后设备释放时钟线和数据线,二者恢复为逻辑高电平。

03_00

3. PS/2传输时序图

PS/2 鼠标数据格式

鼠标以3字节数据包形式发送数据,如表1所示。首字节包含X/Y溢出标志位、9位二进制补码运动数据的最高有效位(符号位)以及鼠标按键状态数据。第二和第三字节分别包含X/Y轴运动数据的低8位。每个X/Y轴运动值表示自上次数据包发送后鼠标位置的相对变化量。

1. PS/2鼠标数据包格式

04_00

操作原理

PS/2 通信事务

PS/2鼠标接口组件通过本文档所述的PS/2主机收发器组件实现与鼠标的通信事务。

配置鼠标进入数据流模式

上电或复位时,组件会向鼠标发送复位命令(0xFF)。组件验证鼠标是否返回正确应答(0xFA),否则重发复位命令。随后鼠标执行自检BAT(基础保证测试)。完成后发送完成码(0xAA)或错误码(0xFC)。组件验证收到0xAA,否则尝试再次复位鼠标。BAT测试码之后,鼠标发送设备ID(0x00)标识自身为标准PS/2鼠标。组件同样验证该代码,出错则执行复位。

发送ID后,鼠标自动进入流模式持续采样并收集活动数据。但默认不传输这些信息,因为数据报告功能初始为禁用状态。此时组件发送启用数据报告命令(0xF4)。组件验证鼠标返回正确应答(0xFA),否则执行复位。收到应答后进入流传输状态,持续采集鼠标数据并提交至用户逻辑。

图4中的流程图展示了这一初始化过程。

05_00

4. 鼠标初始化

端口描述

表2描述了PS/2鼠标接口的端口。

2. 端口描述

时序参数设置

系统时钟速度会影响PS/2鼠标接口组件的时序操作。ENTITY中声明的两个GENERIC参数clk_freqdebounce_counter_size 必须正确设置,以确保组件正常运行。clk_freq 参数需设置为系统时钟clk 的频率(Hz)。示例代码中的默认设置为50MHz(该组件仿真测试时采用的频率)。debounce_counter_size 参数需满足2^debounce_counter_size / clk_freq = 5微秒。对于50MHz系统时钟,debounce_counter_size = 8。

用户逻辑接口

由于PS/2鼠标接口组件负责处理鼠标初始化和所有PS/2事务,用户逻辑只需从设备读取新的鼠标数据。图5展示了该接口。当组件从鼠标接收到第一个新数据字节时,会取消mouse_data_new标志的置位,表示新数据接收正在进行。当完整数据包接收完成后,组件会通过mouse_data 端口呈现数据,并置位mouse_data_new 标志,向用户逻辑表明新的鼠标信息已就绪。

5. 用户逻辑接口

鼠标数据映射到mouse_data 口的方式如表3所示。关于数据的详细说明,请参阅前文PS/2鼠标数据格式部分。

3. mouse_data 端口数据映射表

04_00

复位

PS/2鼠标接口组件工作时,reset_n 输入端口必须保持逻辑高电平。该端口的低电平信号将异步复位组件。复位期间,组件会清除mouse_data 输出端口和mouse_data_new 标志位。随后重置并重新初始化PS/2鼠标。

结论

该PS/2鼠标接口是可编程逻辑组件,能无缝向FPGA逻辑提供PS/2鼠标数据。它同步时钟域、消除输入信号抖动、重置并初始化鼠标数据流、持续接收数据,并在并行输出总线上有新鼠标数据时通知用户逻辑。

相关主题

PS/2主机收发器(VHDL)
PS/2键盘接口(VHDL)
PS/2键盘转ASCII转换器(VHDL)
消抖逻辑电路(含VHDL示例)