代码下载
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)优先发送。每个比特应在时钟信号的下降沿读取。完成后,时钟和数据信号均恢复为逻辑高电平。

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

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

操作原理
PS/2 通信事务
PS/2鼠标接口组件通过本文档所述的PS/2主机收发器组件实现与鼠标的通信事务。
配置鼠标进入数据流模式
上电或复位时,组件会向鼠标发送复位命令(0xFF)。组件验证鼠标是否返回正确应答(0xFA),否则重发复位命令。随后鼠标执行自检BAT(基础保证测试)。完成后发送完成码(0xAA)或错误码(0xFC)。组件验证收到0xAA,否则尝试再次复位鼠标。BAT测试码之后,鼠标发送设备ID(0x00)标识自身为标准PS/2鼠标。组件同样验证该代码,出错则执行复位。
发送ID后,鼠标自动进入流模式持续采样并收集活动数据。但默认不传输这些信息,因为数据报告功能初始为禁用状态。此时组件发送启用数据报告命令(0xF4)。组件验证鼠标返回正确应答(0xFA),否则执行复位。收到应答后进入流传输状态,持续采集鼠标数据并提交至用户逻辑。
图4中的流程图展示了这一初始化过程。

图 4. 鼠标初始化
端口描述
表2描述了PS/2鼠标接口的端口。
表 2. 端口描述
时序参数设置
系统时钟速度会影响PS/2鼠标接口组件的时序操作。ENTITY中声明的两个GENERIC参数clk_freq 和debounce_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 端口数据映射表

复位
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示例)


