FPGA PCIe加速卡BAR接口开发与DMA集成 - 第1节
1.1 PCIe 总线架构概述
PCI Express(PCIe)是一种高速串行计算机扩展总线标准,旨在替代传统的并行 PCI/PCI-X 总线。在 FPGA 加速卡设计中,PCIe 是主机 CPU 与 FPGA 逻辑之间进行高速数据交换的核心通道。理解 PCIe 总线架构是掌握 BAR 空间操作的前提。
PCIe 采用点对点串行连接方式,每个设备拥有独立的物理链路,无需像并行总线那样共享带宽。这种架构从根本上消除了并行总线中的信号同步与反射问题,使得单通道(Lane)速率从 2.5 GT/s(Gen1)一路演进至 32 GT/s(Gen5)以上。
1.1.1 拓扑结构
PCIe 拓扑采用树形结构,由根复合体(Root Complex)、交换器(Switch)、端点设备(Endpoint)和桥接器(Bridge)组成。FPGA 加速卡通常作为端点设备(Endpoint)挂载在交换器下方。
拓扑中的关键组件说明:
| 组件 | 角色 | 在 FPGA 加速卡中的意义 |
|---|---|---|
| 根复合体 (RC) | CPU 与 PCIe 域之间的桥梁,负责地址转换与事务路由 | CPU 发起的 MMIO 访问必须经过 RC 转换为 PCIe 事务 |
| 交换器 (Switch) | 扩展 PCIe 端口数量,实现多设备互联 | 多卡协同工作时,Switch 负责数据分发与隔离 |
| 端点 (EP) | 功能设备,如 FPGA、GPU、SSD | FPGA 作为 EP,通过 BAR 空间暴露控制/状态/数据接口 |
| 桥接器 (Bridge) | 连接不同总线标准(如 PCIe 转 PCI) | 较少用于现代 FPGA 加速卡设计 |
1.2 分层协议概述
PCIe 协议采用分层架构,从下到上依次为:物理层(Physical Layer)、数据链路层(Data Link Layer)和事务层(Transaction Layer)。这种分层设计使得每一层只关注特定职责,便于 FPGA 逻辑的模块化实现。
1.2.1 事务层 (Transaction Layer)
事务层是 PCIe 协议栈的最上层,直接面向设备核心逻辑。它负责:
- TLP 封装与解封装:将上层请求(内存读写、配置读写、消息)打包成事务层包(TLP),或从接收的 TLP 中提取数据。
- 地址空间区分:PCIe 定义了四种地址空间——内存空间、IO 空间、配置空间和消息空间。BAR 空间操作主要涉及内存空间(Memory Space)和IO 空间(I/O Space)。
- 事务排序与虚拟通道:通过流量类别(TC)和虚拟通道(VC)保证服务质量(QoS)。
1.2.2 数据链路层 (Data Link Layer)
数据链路层位于事务层与物理层之间,提供可靠传输保障:
| 功能 | 描述 | 对 FPGA 设计的影响 |
|---|---|---|
| 链路管理 | 通过 DLLP(数据链路层包)进行链路状态维护 | FPGA 硬核自动处理,用户逻辑无需干预 |
| 重传机制 | 基于 ACK/NAK 协议,确保 TLP 无差错交付 | 数据链路层会缓存未确认的 TLP,FPGA 用户逻辑需注意背压 |
| 错误检测 | 为 TLP 添加 LCRC(链路 CRC),检测传输错误 | 错误 TLP 会被自动重传,用户逻辑看到的是可靠数据流 |
1.2.3 物理层 (Physical Layer)
物理层是 PCIe 协议栈的最底层,负责电气特性与比特传输:
- 编码方案:Gen1/Gen2 使用 8b/10b 编码(20% 开销),Gen3/Gen4/Gen5 使用 128b/130b 编码(约 1.5% 开销)。
- 串行化/解串:将并行数据转换为高速串行差分信号(SerDes),每个 Lane 由一对差分发送和一对差分接收组成。
- 链路训练与初始化:上电后物理层自动进行链路训练,协商速率、宽度、极性等参数。FPGA 硬核 IP 通常提供链路状态指示信号。
1.3 配置空间与 BAR 的关系
每个 PCIe 端点设备必须实现配置空间(Configuration Space),大小为 256 字节(Type 0 配置头)。其中,BAR 寄存器(Base Address Register)位于配置空间的偏移 0x10~0x24,共 6 个 32 位寄存器。FPGA 加速卡通过 BAR 寄存器向主机声明所需的地址空间大小和类型。
配置空间中的 BAR 寄存器布局(Type 0 配置头):
| 偏移地址 | 寄存器名称 | 位宽 | 描述 |
|---|---|---|---|
| 0x00 | Vendor ID / Device ID | 32 位 | 厂商与设备标识 |
| 0x04 | Command / Status | 32 位 | 控制与状态 |
| 0x10 | BAR0 | 32 位 | 基地址寄存器 0 |
| 0x14 | BAR1 | 32 位 | 基地址寄存器 1(与 BAR0 组合为 64 位) |
| 0x18 | BAR2 | 32 位 | 基地址寄存器 2 |
| 0x1C | BAR3 | 32 位 | 基地址寄存器 3 |
| 0x20 | BAR4 | 32 位 | 基地址寄存器 4 |
| 0x24 | BAR5 | 32 位 | 基地址寄存器 5 |