6.1 PS 与 PL 深度集成


6.1 PS 与 PL 深度集成

本节摘要:SoC FPGA 把 ARM 处理器系统(PS)与可编程逻辑(PL)放在同一颗芯片上。本节拆解 PS 内部的组成(处理器核、DDR 控制器、硬核外设)、PL 承担的角色、以及连接两边的系统基础设施——启动顺序、时钟复位、中断路径。读完你能画出 SoC 的整体框图,理解"一个系统的两个剖面"到底意味着什么。

一段被低估的演化史

FPGA 早期的绰号叫"胶合逻辑"——把板子上乱七八糟的芯片粘在一起的那种逻辑。三十多年过去,同一颗芯片里现在塞进了 ARM 双核处理器、DDR 控制器、全套外设,还有一整片可编程逻辑。这个演化不是厂商炫技:通信基站需要同时跑协议栈(软件灵活)和基带处理(硬件高速),工业设备需要同时跑人机交互和实时控制——单靠一颗 CPU 或一块 FPGA 都吃力,干脆焊在一起。

SoC FPGA 的通俗比喻是一座联合厂房:PS 是行政楼(跑操作系统、协议栈、业务逻辑),PL 是车间(跑高速流水线、实时控制、定制数据通路)。两者之间有几条专用走廊(高速总线)直通,交换数据不用出园区。理解了这个分工,SoC 的一切设计决策都有了坐标系。

PS 里有什么

PS(Processing System)是硬核集成的处理器子系统,开机就有,不需要 PL 参与:

  • 处理器核:ARM Cortex-A 系列(单核或双核),带缓存、MMU,能跑完整的 Linux。
  • DDR 控制器:直接管理板载 DDR 内存,软件和 PL 都通过它访问内存。
  • 硬核外设:UART、I2C、SPI、USB、以太网 MAC 等,不用占用 PL 资源。
  • 互连矩阵:把上述模块串起来的片上总线(ARM 的 AXI 协议,6.2 主角)。

PS 的价值在于:软件生态完整。Linux、驱动、工具链、第三方库,全都现成。这意味着一大类工作——协议栈、文件系统、网络、人机交互——可以直接在 PS 上跑,不用在 PL 里从零造轮子。

PL 里承担什么

PL 就是前面五章练的全部本事。在 SoC 语境下,PL 的典型角色有三类:

  • 定制加速器:卷积、FFT、加密等计算密集任务,PL 按数据流定制电路,能效远超 CPU 软跑。
  • 协议与接口逻辑:高速协议(PCIe、千兆以太网)的硬实现,或"时间敏感"的逻辑(周期精确到纳秒的波形产生)。
  • 实时控制:电机伺服、电源控制这类要求确定延迟的任务,不能容忍操作系统调度抖动,必须放 PL。

划分的判据第 6.3 会系统展开,这里先记住直觉:要灵活、要生态 → 软件;要高速、要确定、要并行 → 硬件

PS 与 PL 的深度集成架构

PS 与 PL 的深度集成架构

启动、中断、时钟:两侧怎么对接

启动顺序。SoC 上电,PS 先启动(它自带 BootROM),从启动介质加载程序;PL 的配置可以有两个时机:由 PS 在启动早期加载(PS 主导,PL 跟随),或独立配置(两者并行加载)。调试阶段常用"PS 启动后由软件加载 PL"的方式,方便在 Linux 里反复切换 PL 设计——这就是"动态重配置"的雏形。

中断路径。PL 里的硬件要通知软件"数据就绪了",走中断:PL 的中断信号经专用通道送到 PS 的中断控制器,软件注册中断服务函数处理。这是 PL 与软件协作的正式通信方式,比软件轮询(软件不停查标志位)高效得多。后面 6.3 会对比两者的代价。

时钟与复位。SoC 里时钟要统一规划:PS 有自己固定的时钟域,PL 的时钟可以由 PS 输出或独立晶振提供;复位也要分层——全局复位、PS 复位、PL 复位,别混着用。这些基础设施没规划好,联调时会遇到"逻辑随机复位""时钟相位混乱"这类头大问题。

问题:PS 和 PL 的中断怎么分工

问:系统里既有 PS 侧外设的中断,又有 PL 自定义逻辑的中断,怎么管理才不乱?答:中断管理的原则是**"谁的事件谁声明,统一汇聚再分发"**——PL 侧的中断信号在硬件里各自定义,汇总到中断控制器,由软件统一注册中断号和处理函数;PS 侧外设中断走它们自己的通道。两个易错点:PL 中断信号要保持到软件清除(脉冲型中断易丢),中断优先级要在初始化时明确(实时性要求高的 PL 中断排前面)。SoC 工程里,中断表的设计应该和寄存器地址映射一起,在设计阶段就定稿,别联调时临时加。

最小 SoC 系统:从模板到跑起来

用一次实操把 PS 与 PL 的对接走通,比读十页概念都直观。

背景:目标是做一个最简系统——PS 上跑一段裸机程序,通过 AXI 总线控制 PL 里的一个 LED 和一组寄存器。

操作:第一步,用工具生成 SoC 工程模板,添加处理器 IP,配置 DDR 和 UART(这两个是调试的命脉——UART 打印状态、DDR 供程序运行)。第二步,生成一个 AXI 从外设模板,挂到总线上,把 LED 管脚约束接出来。第三步,导出硬件描述文件给软件工程,写一段裸机程序:往外设寄存器写 1 点亮 LED、写 0 熄灭,循环打印计数值。

结果:第一次联调遇到两个典型问题——程序在 DDR 里起不来(DDR 初始化参数与板载颗粒不匹配,改用 UART 打印确认卡在哪一步,重新配参数解决);LED 不亮(管脚约束把 LED 的引脚号标错了,核对原理图改正)。

解读:这 20 分钟踩的两个坑,正是 SoC 联调的"必修课":DDR 参数与中断路径要在 PS 侧先单独验证,PL 外设要先通过寄存器读写确认通路。教程给的模板跑通一次,你对"PS 先行、PL 跟随、AXI 串起两侧"就有了肌肉记忆。

变式:把裸机程序换成 Linux(设备树描述外设、写内核驱动),把 LED 换成自定义加速器,把寄存器读写换成 DMA 搬数据——骨架完全一样,只是把"跑什么软件"升级了。先裸机后系统是 SoC 学习的推荐路径,能少一半排错时间。

⚠️ 常见坑:PS 和 PL 各用一个时钟、各写一套时序约束,然后在互连处直接交换数据——这是 SoC 上最常见的跨时钟域事故现场。两侧通信接口(AXI)内部有专门的跨域处理,你自定义的直连信号必须按第 4 章规范走同步器。

本节要点回顾

  • PS 是硬核、PL 是软逻辑:PS 开机即用、生态完整;PL 高速并行、可反复重配。
  • 分工判据先行:要灵活要生态走软件,要高速要确定要并行走硬件。
  • 启动双模式:PS 主导加载 vs 独立配置,动态重配置由软件控制 PL 换版。
  • 中断是正式通信:PL 通知软件用中断,轮询只在极端简单场景能用。
  • 基础设施要规划:时钟域、复位层次在 SoC 里要统一设计,别各搞一套。
  • 互连接口别裸连:AXI 自带跨域处理,自定义直连信号必须走同步。

下一步进入 6.2:两边靠什么通信?AXI 总线协议——SoC 的"官方语言"。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U