3. HPS子系统深入解析

Hard Processor System(HPS)是 Agilex SoC 中独立于 FPGA fabric 的硬核处理器子系统。它不是软核,也不是在 fabric 里例化的 CPU,而是芯片中固定存在的硅片区域。理解 HPS 的关键,是把它看成一个“完整的嵌入式计算机”:内部有处理器核心、缓存、内存管理、外设控制器、时钟与复位网络,并通过专用互连与 FPGA fabric 交换数据和控制信号。

处理器核心与缓存层次

Agilex HPS 的处理器集群通常包含四核 ARM Cortex-A53,部分器件还集成双核 Cortex-A76,形成大小核组合。A53 是顺序执行、低功耗的 64 位核心,适合控制面、协议栈和中等算力任务;A76 是乱序执行的高性能核心,适合 Linux 用户态计算、数据预处理等负载。两者均支持 ARMv8-A 架构,运行在 EL0~EL3 异常级别,可分别承载用户程序、内核、虚拟化管理和安全固件。

缓存层次直接决定访存行为。每个核心有独立的 L1 指令/数据缓存,通常为 32 KB;A53 集群共享 L2 缓存,A76 集群也有自己的 L2;多集群之间再通过 L3 或系统级缓存(SLC)连接。缓存一致性由 CCI/CCN 类互连维护,使 A53 与 A76 看到同一份内存视图。对开发者而言,这意味着:CPU 访问 DDR 时,数据可能已在缓存中;而 FPGA 通过 AXI 直接读写 DDR 时,若 CPU 刚写过同一地址,必须考虑缓存回写与无效化,否则会出现“CPU 看到旧值、FPGA 看到新值”或反之。

内存管理单元与地址空间

MMU 负责把虚拟地址翻译为物理地址,并控制访问权限。A53/A76 均支持 4 KB、16 KB、64 KB 页粒度,以及多级页表。典型 Linux 配置使用 4 KB 页和 3 级或 4 级页表。MMU 还提供内存属性:Normal、Device、Strongly-ordered 等,决定是否可缓存、是否可重排、是否可合并写。访问 HPS 外设寄存器时,必须映射为 Device 或 Strongly-ordered,否则 CPU 可能合并写操作,导致寄存器写入顺序错乱。

HPS 的物理地址空间大致分为:DDR 区域、片上 SRAM、外设寄存器区、FPGA fabric 映射区。以示例配置为例,DDR 可映射到 0x0000_0000 起始的大段空间,HPS 外设寄存器常位于 0x10_0000 附近,而 FPGA 侧轻量级 AXI 桥可映射到 0x20_0000 以上。具体基地址以器件手册和设备树为准,但“先看地址映射,再写驱动”是固定原则。

外设接口与互连结构

HPS 内部通过多层互连把处理器、缓存、DMA、外设和 FPGA 桥连接起来。常见主设备包括 CPU、SDM(安全设备管理器)、DMA 控制器;从设备包括 DDR 控制器、NAND/SD/eMMC、USB、以太网、UART、I2C、SPI、GPIO、定时器等。HPS 与 FPGA fabric 之间通常有三类通道:

  • FPGA-to-HPS 桥:FPGA 逻辑作为主设备,访问 HPS DDR 或 HPS 外设,适合 FPGA 采集数据后直接写入内存。
  • HPS-to-FPGA 桥:CPU 作为主设备,访问 FPGA 侧寄存器或存储器,适合控制自定义 IP。
  • 轻量级 HPS-to-FPGA 桥:用于低带宽、低延迟的寄存器访问,通常映射到 32 位空间。

这些桥本质上是 AXI 或 AXI-Lite 接口,经过地址译码、位宽转换和时钟域 crossing 后进入 fabric。若 FPGA 侧逻辑运行在 100 MHz,而 HPS 侧 AXI 运行在 200 MHz,桥内部会做异步处理,但开发者仍需关注吞吐与延迟。

Agilex HPS 与 FPGA Fabric 互连结构示意 HPS 硬核子系统 处理器集群 Cortex-A53 ×4 Cortex-A76 ×2 L1 / L2 / L3 缓存 + CCI 一致性 MMU 与地址空间 虚拟地址 → 物理地址 4KB/16KB/64KB 页 Normal / Device 属性 DDR / 外设 / FPGA 映射 HPS 内部互连 / 系统级缓存 CPU · DMA · SDM · 外设控制器 · FPGA 桥 外设接口 UART · I2C · SPI · GPIO USB · 以太网 · SD/eMMC NAND · 定时器 · DMA 时钟 / 复位管理 DDR 控制器 DDR4 / LPDDR4 / LPDDR5 多端口仲裁 CPU / FPGA / DMA 共享 缓存一致性需软件维护 FPGA Fabric 自定义 IP / 加速器 AXI4 / AXI-Lite 从设备 数据采集 / 信号处理 DMA 主设备 片上存储器 / 寄存器 HPS 可读写 时钟 / 复位 / 中断 与 HPS 交互 F2H H2F LWH2F 处理器/缓存 互连 外设 DDR FPGA 桥

时钟与复位管理

HPS 的时钟不是单一频率,而是由时钟管理单元产生多路时钟:CPU 核心时钟、互连时钟、DDR 时钟、外设时钟、FPGA 接口时钟等。它们可以来自外部晶振、片上 PLL 或 FPGA fabric 提供的时钟。复位同样分层:上电复位、冷复位、热复位、外设单独复位。实际开发中,若某个外设不工作,先确认它的时钟门控是否打开、复位是否释放,再检查寄存器配置,往往比直接怀疑驱动更有效。

以 UART 为例,典型初始化顺序是:使能 UART 时钟 → 释放 UART 复位 → 设置波特率分频 → 配置数据位/停止位/校验 → 使能收发。若时钟未使能,读写 UART 寄存器可能返回 0 或挂死;若复位未释放,寄存器保持默认值,写入无效。这些现象在调试时非常常见。

HPS 与 FPGA 的协同要点

HPS 与 fabric 的互连不是“自动一致”的。CPU 写 DDR 后,数据可能停留在 L2/L3 缓存;FPGA 通过 F2H 桥读 DDR 时,读到的是 DDR 控制器里的内容,不一定包含 CPU 尚未回写的缓存行。因此,在共享缓冲区场景中,常用做法是:CPU 写完后执行 cache flush,再触发 FPGA 读取;FPGA 写完后,CPU 在读取前执行 cache invalidate。若使用一致性端口或 ACE-Lite 接口,硬件可维护一致性,但仍需按手册确认该路径是否启用。

另一个关键是地址映射与位宽。HPS-to-FPGA 桥通常映射为 32 位或 64 位 AXI 空间,FPGA 侧 IP 若只支持 32 位,桥会自动拆分或转换。若 CPU 用 64 位访问一个 32 位寄存器,可能触发两次 32 位操作,顺序和原子性需特别注意。对控制寄存器,建议使用与 IP 位宽一致的访问宽度,并在驱动中加内存屏障。

调试 HPS 与 FPGA 交互时,可先只验证“地址能否读写”:在 FPGA 侧放一个只读 ID 寄存器,CPU 通过 HPS-to-FPGA 桥读取;再放一个可写寄存器,CPU 写入后由 FPGA 逻辑用 LED 或 SignalTap 观察。地址通了,再叠加 DMA 和缓存维护,问题定位会快很多。

小结与检查要点

HPS 子系统可以按“核心—缓存—MMU—互连—外设—时钟复位—FPGA 桥”七层来理解。实际开发中,最值得先确认的是:CPU 集群型号与数量、DDR 映射范围、外设基地址、FPGA 桥的地址窗口与位宽、时钟是否使能、复位是否释放、共享内存是否需要缓存维护。把这些信息从设备树和手册中整理成一张地址与时钟表,后续写驱动和调试会省去大量猜测。