FPGA 进阶 31:部分可重配置 PR 入门——分区、RM 与动态加载
本文是
fpga/进阶层第 35 篇。PR(Partial Reconfiguration)是"运行中换硬件"的技术:常规比特流下载整片重置,PR 只重配一块区域、其余照跑。专家层有 PR 深水区(量产升级/ICAP 细节)。
本文要回答的问题
- PR 是什么?静态区/RP/RM/部分比特流分别指什么?
- 用 PR 的设计流程和普通工程有什么不同?
- 分区接口、Pblock 有哪些硬限制?
- 运行时怎么加载?什么场景值得用?
一、基本概念

| 术语 | 含义 |
|---|---|
| 静态逻辑 static | 始终在片上运行的部分:时钟、复位、DDR 控制、通信、加载控制状态机 |
| RP(Reconfigurable Partition) | 被划出来可重配的区域,用 Pblock 框定物理资源并锁定 |
| RM(Reconfigurable Module) | RP 的某个具体实现,多个 RM 端口完全一致、内部不同 |
| 全比特流 .bit | 静态区 + 一个初始 RM,上电先加载它 |
| 部分比特流 .rbf/.bin | 只含某个 RM 的配置数据,运行时单独加载 |
| ICAPE2 / PCAP | 片内配置访问端口(FPGA 原生 / Zynq PS 侧) |
二、设计流程(Vivado PR)
- 划分静态/RP:确定哪些功能互斥、可放进 RP;定义 RP 端口(插槽标准);
- 写各 RM 的 RTL:所有 RM 同端口列表,内部实现不同;静态区顶层例化 RP(用黑盒/分区属性标记);
- Pblock 约束:给 RP 画物理区域,含足够 LUT/FF/BRAM/DSP(按最大 RM),边界对齐资源列,
CONTAIN_ROUTING/IS_PR_RP等属性锁死; - 多配置综合/实现:静态区综合一次,每个 RM 各综合实现一次,产出 1 个全比特流 + N 个部分比特流;
- 时序分别签核:静态 + 每个 RM 组合都要过时序;
- 加载逻辑:静态区放加载控制(ICAPE2 状态机或 Zynq PS),部分比特流存 Flash/DDR,按需读取加载;
- 验证:仿真 + 上板逐个切换 RM,确认静态区不中断、接口无死锁。
三、硬限制与设计纪律
- Pblock 资源要按最大的 RM 预留——小 RM 也占整块区域,有面积浪费;
- RM 端口必须逐位一致(名称/位宽/方向/时钟),换 RM 不改插槽;
- 跨边界走线只走 partition pin:数量、位置受限,接口宜窄不宜宽,数据类用 AXI-Stream/FIFO 类流式接口最省心;
- 跨边界打拍:不要让组合逻辑穿过 RP 边界,时钟由静态区统一供给 RP;
- RP 内部状态在切换时丢失:需要保留的上下文(系数、缓冲)放静态区 DDR/BRAM,加载后回灌;
- 复位:切换后 RM 需要干净复位,静态区在加载完成后释放;
- 时序报告按"static × 每个 RM"逐个看,任一不过即失败。
四、运行时加载方式
| 方式 | 适用 | 说明 |
|---|---|---|
| JTAG | 开发调试 | Vivado Hardware Manager 直接下 partial bit |
| ICAPE2 | 量产(纯 FPGA) | 静态逻辑读 Flash/DDR 中的部分比特流,状态机送 ICAP |
| PCAP(Zynq) | SoC 量产 | ARM PS 加载,Linux firmware 接口/裸机 xdevcfg |
| SelectMAP | 板上控制器 | 外部 MCU/CPU 并行加载 |
切换耗时 ≈ 部分比特流大小 ÷ 配置端口带宽,典型毫秒级;切换期间静态区正常工作,只有 RP 内逻辑被冻结重写。
五、典型适用场景
- 功能分时复用:数据采集设备白天跑一种协议解析、夜间跑另一种;
- 远程升级不中断业务:更新加速算法但通信链路不断;
- 资源超配:三个大加速器互斥使用,做成三个 RM 轮流上,芯片选型可降一档;
- 多租户/授权:按授权加载不同 RM(配合比特流加密见专家层安全篇)。
常见坑对照
| 坑 | 后果 | 正确做法 |
|---|---|---|
| RM 端口定义不一致 | 实现/切换失败 | 端口表冻结,所有 RM 严格一致 |
| Pblock 资源按最小 RM 划 | 大 RM 放不下 | 按最大 RM 预留并核对报告 |
| 组合逻辑跨 RP 边界 | 布线/时序失败 | 边界打拍、流式接口 |
| 上下文只存 RP 内 | 切换后状态错乱 | 系数/缓冲放静态区/DDR |
| 切换后没复位 RM | 启动随机态 | 加载完成脉冲复位 |
| 只验证一个 RM | 其他 RM 时序雷 | 逐个 RM 时序签核+上板切换 |
| 为用而用 PR | 流程复杂拖慢项目 | 无运行中换功能需求就别用 |
相关与延伸
前置:BRAM/存储、AXI4-Stream/Lite。 深入:专家层《部分可重配置 PR》(ICAP 时序、量产升级、多分区)、Zynq 数据交互(PCAP 加载)。
一句话总结
部分可重配置(PR)让 FPGA 在不掉电、不打断其余逻辑的前提下只重配一块区域:设计分静态区(时钟/DDR/通信/加载控制,始终运行)和 RP 可重配置分区(Pblock 锁定物理资源),RP 可加载多个端口完全一致、实现不同的 RM,每个 RM 产出一个部分比特流(.rbf)。纪律:Pblock 按最大 RM 预留、RM 端口逐位一致(插槽标准)、跨边界只走 partition pin 且打拍、RP 内状态切换即丢(上下文放静态区)、加载后复位、静态×每个 RM 分别时序签核。运行时经 ICAPE2(纯 FPGA)或 PCAP(Zynq PS)或 JTAG(调试)送入部分比特流,毫秒级切换。适合"运行中要不中断换功能"或"互斥大模块省资源"的场景;没有这类需求时,PR 的流程和面积开销不划算。