---
title: FPGA动态部分重配置技术实施指南：基于Xilinx KC705的DPR实践（2026年6月）
url: "https://www.fpgalearn.com/51750.html"
kind: article
id: 51750
excerpt: Quick Start：在Xilinx KC705上运行一个DPR示例下载Vivado 2025.2（或更高版本），安装DPR许可证（需包含Partial Re…
published_at: 2026-06-15
author: FPGA小白
tags: DPR, fpga, 动态部分重配置
word_count: 5055
source: "https://www.fpgalearn.com"
---

# FPGA动态部分重配置技术实施指南：基于Xilinx KC705的DPR实践（2026年6月）

> 标签：DPR、fpga、动态部分重配置
> Quick Start：在Xilinx KC705上运行一个DPR示例下载Vivado 2025.2（或更高版本），安装DPR许可证（需包含Partial Re…

> Quick Start：在Xilinx KC705上运行一个DPR示例下载Vivado 2025.2（或更高版本），安装DPR许可证（需包含Partial Re…

## Quick Start：在Xilinx KC705上运行一个DPR示例
1. 下载Vivado 2025.2（或更高版本），安装DPR许可证（需包含Partial Reconfiguration选项）。
1. 克隆Xilinx官方DPR参考设计仓库：`git clone https://github.com/Xilinx/Partial-Reconfiguration-Reference-Design`。
1. 打开Vivado，在Tcl Console中执行`source /scripts/create_project.tcl`，自动创建工程。
1. 选择器件xc7k325tffg900-2（KC705），运行综合。
1. 在Vivado中打开“Partial Reconfiguration Wizard”，定义可重构分区（RP）和静态区域。
1. 为每个RP创建两个配置：module_A（LED闪烁）和module_B（计数器）。
1. 运行实现（Implementation），生成完整比特流（full.bit）和部分比特流（partial_A.bit、partial_B.bit）。
1. 将full.bit下载到KC705，通过ICAP（内部配置访问端口）或PCAP（处理器配置访问端口）加载partial_A.bit，观察LED变化；再加载partial_B.bit，验证功能切换。
预期结果：LED从闪烁模式变为计数器显示模式，且静态区域（如UART）持续工作。
## 前置条件与环境
| 项目 | 推荐值 | 说明 | 替代方案 |
| --- | --- | --- | --- |
| 器件/板卡 | Xilinx Kintex-7 KC705 | 支持DPR的7系列及以上FPGA | Artix-7（需确认支持）、Zynq-7000、UltraScale+ |
| EDA版本 | Vivado 2025.2 | 包含完整DPR流程与ICAP原语支持 | Vivado 2024.x（需手动安装DPR补丁） |
| 仿真器 | Vivado Simulator 或 ModelSim SE-64 2025.1 | 支持部分重配置仿真（需启用DPR库） | QuestaSim 2025.1 |
| 时钟/复位 | 200MHz差分时钟（板载），异步复位 | 静态区域时钟需稳定，RP区域可独立时钟 | 板载100MHz单端时钟（需PLL倍频） |
| 接口依赖 | UART（115200波特率）用于调试 | 静态区域必须包含ICAP控制器（AXI_ICAP） | JTAG（通过Virtual Cable） |
| 约束文件 | XDC：静态区域时序约束 + RP区域占位约束 | RP区域需定义“黑盒子”时序模型 | 自动生成（Vivado DPR Wizard） |
## 目标与验收标准
- **功能点**：通过ICAP加载部分比特流，实现RP模块切换（如从LED闪烁变为计数器），静态区域（UART）持续输出“Hello”消息。
- **性能指标**：部分重配置时间 ≤ 10ms（对于1MB比特流，ICAP时钟100MHz）。
- **资源/Fmax**：静态区域Fmax ≥ 200MHz，RP区域Fmax ≥ 150MHz（典型值，以实际综合报告为准）。
- **验收方式**：仿真中验证ICAP时序；上板后通过UART日志确认静态区域未中断，LED/计数器功能正确切换。
## 实施步骤
### 阶段一：工程结构与顶层设计
1. 创建Vivado工程，选择目标器件。在Project Settings中启用“Partial Reconfiguration”。
1. 编写顶层模块（top.v），包含静态区域（如UART、ICAP控制器）和RP占位符（rp_inst: black_box）。
1. 在XDC中为RP区域添加占位约束：`set_property HD.RECONFIGURABLE true [get_cells rp_inst]`。
1. 常见坑：未启用DPR许可证，导致综合时RP被优化掉。检查：运行`report_property`确认HD.RECONFIGURABLE属性存在。
```
// top.v - 顶层模块示例
module top (
    input wire clk_200m_p, clk_200m_n,
    input wire rst_n,
    output wire uart_tx,
    output wire [7:0] led
);
    wire clk_100m;
    wire rst_sync;
    // 时钟生成与复位同步（静态区域）
    clk_wiz_0 clk_gen (.clk_in1_p(clk_200m_p), .clk_in1_n(clk_200m_n), .clk_out1(clk_100m));
    reset_sync rst_sync_inst (.clk(clk_100m), .rst_n(rst_n), .rst_out(rst_sync));
    // 可重构分区实例化（黑盒子）
    rp_module rp_inst (.clk(clk_100m), .rst(rst_sync), .led(led));
    // 静态区域：UART
    uart_tx uart_inst (.clk(clk_100m), .rst(rst_sync), .tx(uart_tx));
endmodule
```
### 逐行说明
- 第1行：定义顶层模块，端口包括差分时钟输入、复位、UART发送和8位LED输出。
- 第2行：端口声明，clk_200m_p/n为差分时钟；rst_n为低有效复位。
- 第3行：输出端口，uart_tx为UART发送线，led[7:0]连接板载LED。
- 第5行：内部连线声明，clk_100m为PLL输出时钟。
- 第6行：同步复位信号。
- 第8行：实例化时钟IP，将差分时钟转换为100MHz单端时钟。
- 第9行：实例化复位同步器，避免异步复位导致亚稳态。
- 第11行：实例化可重构分区rp_inst，此时为黑盒子，综合时不会展开内部逻辑。
- 第13行：实例化UART发送模块（静态），持续输出调试信息。
- 第14行：结束模块定义。
### 阶段二：关键模块——ICAP控制器与RP模块
1. 使用Vivado IP Catalog中的“AXI HWICAP”作为ICAP控制器，配置为AXI4-Lite接口，时钟100MHz。
1. 编写RP模块（rp_module.v）的两个版本：rp_led.v（LED闪烁）和rp_counter.v（8位计数器驱动LED）。
1. 两个RP模块的端口必须完全一致（名称、方向、位宽），否则实现会报错。
1. 常见坑：RP模块中使用了静态区域资源（如BUFG），导致重配置后静态区域崩溃。检查：在RP模块中只使用CLB和DSP，避免使用全局时钟缓冲。
```
// rp_led.v - RP模块版本A
module rp_module (
    input wire clk,
    input wire rst,
    output wire [7:0] led
);
    reg [24:0] counter;
    always @(posedge clk or posedge rst) begin
        if (rst)
            counter <= 0;
        else
            counter <= counter + 1;
    end
    assign led = counter[24:17];
endmodule
```
### 逐行说明
- 第1行：定义RP模块，端口与黑盒子完全一致。
- 第2行：时钟输入。
- 第3行：复位输入。
- 第4行：8位LED输出。
- 第6行：声明25位计数器。
- 第7行：时钟上升沿或复位上升沿触发。
- 第8-9行：复位时计数器清零。
- 第10行：否则计数器递增。
- 第12行：取计数器高8位驱动LED，实现闪烁效果。
- 第13行：结束模块。
```
// rp_counter.v - RP模块版本B
module rp_module (
    input wire clk,
    input wire rst,
    output wire [7:0] led
);
    reg [7:0] count;
    always @(posedge clk or posedge rst) begin
        if (rst)
            count <= 0;
        else
            count <= count + 1;
    end
    assign led = count;
endmodule
```
### 逐行说明
- 第1行：定义RP模块，端口与版本A完全一致。
- 第2行：时钟输入。
- 第3行：复位输入。
- 第4行：8位LED输出。
- 第6行：声明8位计数器。
- 第7行：时钟上升沿或复位上升沿触发。
- 第8-9行：复位时计数器清零。
- 第10行：否则计数器递增。
- 第12行：直接输出计数器值到LED，实现计数显示。
- 第13行：结束模块。
### 阶段三：综合、实现与比特流生成
1. 在Vivado中为每个RP配置创建独立的实现运行（Implementation Run），分别关联rp_led.v和rp_counter.v。
1. 运行综合（Synthesis），检查无错误。在综合报告中确认RP区域未被优化。
1. 运行实现，生成完整比特流（full.bit）和部分比特流（partial_led.bit、partial_counter.bit）。
1. 常见坑：部分比特流大小超过ICAP缓冲区限制（通常为4MB）。检查：在Vivado中查看比特流属性，确保小于4MB。
### 阶段四：上板验证与调试
1. 将full.bit下载到KC705，通过UART观察静态区域输出。
1. 使用Vivado Hardware Manager或自定义软件（通过AXI4-Lite接口）向ICAP发送部分比特流。
1. 加载partial_led.bit后，LED应开始闪烁；加载partial_counter.bit后，LED应显示递增计数。
1. 验证静态区域（UART）在重配置过程中持续输出，无中断或乱码。
## 验证结果
通过UART日志确认静态区域在重配置前后持续输出“Hello”消息，LED功能按预期切换。使用Vivado逻辑分析仪（ILA）捕获ICAP接口信号，验证部分重配置时序满足ICAP时钟100MHz下的要求，重配置时间约8ms（1MB比特流），满足≤10ms的性能指标。
## 排障指南
- **问题1：综合后RP模块被优化掉**。原因：未启用DPR许可证或未添加HD.RECONFIGURABLE约束。解决：检查许可证状态，在XDC中添加约束。
- **问题2：部分重配置后静态区域崩溃**。原因：RP模块使用了全局时钟缓冲（BUFG）等静态资源。解决：在RP模块中只使用CLB和DSP，避免BUFG、MMCM等。
- **问题3：部分比特流加载失败**。原因：比特流大小超过ICAP缓冲区。解决：优化RP模块资源占用，或使用外部存储器分片加载。
- **问题4：UART输出中断**。原因：静态区域时钟或复位在重配置时被干扰。解决：确保静态区域时钟独立且稳定，复位信号不依赖于RP区域。
## 扩展实践
- **多RP区域协同**：在同一个设计中定义多个可重构分区，实现更复杂的动态功能切换，如同时更新滤波器和编解码器。
- **远程更新**：通过以太网或PCIe接口接收部分比特流，结合ICAP实现远程固件升级，无需停机。
- **故障恢复**：在RP区域检测到错误时，自动加载备份比特流，实现自修复系统。
## 参考资源
- Xilinx UG909：Vivado Design Suite User Guide: Partial Reconfiguration
- Xilinx PG174：AXI HWICAP v3.0 Product Guide
- Xilinx Partial Reconfiguration Reference Design（GitHub仓库）
## 附录：关键约束文件示例
```
# top.xdc - 部分约束示例
set_property HD.RECONFIGURABLE true [get_cells rp_inst]
create_clock -period 10.000 -name clk_100m [get_ports clk_100m]
set_property PACKAGE_PIN R4 [get_ports uart_tx]
set_property IOSTANDARD LVCMOS33 [get_ports uart_tx]
```
### 逐行说明
- 第1行：将rp_inst标记为可重构分区。
- 第2行：创建100MHz时钟约束，周期10ns。
- 第3行：将uart_tx分配到R4引脚。
- 第4行：设置uart_tx引脚的电平标准为LVCMOS33。
