基于 FPGA 开发应用 SATA 硬盘协议详解
FPGA 外挂的硬盘主要是 SATA 和 NVMe 协议盘。在实现之前,先对比一下两者的特征:
| 特征类型 | SATA 盘 | NVMe 盘 |
| 热插拔 | 支持 | 不支持 |
| 双工 | 半双工 | 全双工 |
| 速率 | Gen1:1.5Gbps(150MB/S) Gen2:3.0Gbps(300MB/S) Gen3:6.0Gbps(600MB/S) | PCIe Gen2 x4 : 2GB/S PCIe Gen3 x4 : 4GB/S |
| gt_clock | 150MHz | 100Mhz |
| lane 数 | 1 对 | 4 对(最大 4,可 1,2,4) |
| 多 sector 读写顺序 | 按指令的扇区顺序进行 | 写:按指令的扇区顺序进行 读:page 内按扇区顺序进行,page 间可能不按 page 顺序读 |
SATA 协议主要包含物理层 (PHY)、链路层、传输层和应用层/命令层。FPGA 侧主要通过 SerDes 实现物理层连接。
一、SATA 接口与硬件基础
目前常用的 SATA 接口为 7 针数据接口和 15 针电源接口。数据接口包含一对收发差分信号和 GND。Host(如 FPGA 板卡)与 Device(SATA 硬盘)之间用两对差分对连接:
- (SATA_A+, SATA_A-):Host 发送、Device 接收
- (SATA_B+, SATA_B-):Device 发送、Host 接收
电源接口方面,2.5 寸硬盘通常只需 5V 供电。
二、物理层实现
物理层借助 SerDes 实现时钟恢复、串并转换、字节对齐及 OOB 建链。OOB(Out of Band signals)带外信号用于链路建立前的设备识别,不进行数据传输。
1. OOB 信号交互
OOB 信号通过特定电压脉冲序列(Burst)和静默时间组成,主要包括三种类型:
| OOB 类型 | 发起方 | 用途 | 描述 |
| COMRESET | Host | 复位 | 用于复位设备,表示建链开始。 |
| COMINIT | Device | 响应 COMRESET | 响应 Host 的 COMRESET,持续发送 6 个 SIGNAL,间隔 320ns NOSIGNAL。 |
| COMWAKE | Host/Device | 建链 | 表示已准备好建立链路,持续发送 6 个 SIGNAL,间隔 106ns NOSIGNAL。 |
建链时序流程:
- 系统上电或热插拔后,Host 向 Device 发送 COMRESET,等待回复 COMINIT。
- Device 检测到 COMRESET 后响应 COMINIT;若 Device 晚启动,也会主动发送 COMINIT。
- Host 收到 COMINIT 后校准,发出 COMWAKE。
- Device 检测 COMWAKE 后校准,发送 ALIGN 原语。若 54.6us 未收到 Host 的 ALIGN,则降速重试。
- Host 锁定 Device 的对齐原语,以相同速率回传 ALIGN。需在 873.8us 内检测到第一个 ALIGN。
- Device 锁定后发送 SYNC 原语,准备普通操作。
- Host 接收三个连续 non-ALIGN 原语后,链路正式建立,可收发 FIS。
双方连接从最高速开始匹配,不满足则降速,直至最低速失败进入错误状态。换速等待时间为 54.6us。


