简介:《ug470-7Series-Config-中文版-2025年.pdf》是一份AMD/Xilinx官方7系列FPGA配置用户指南的中文翻译版,主要面向FPGA开发工程师、硬件设计人员以及系统性学习FPGA配置技术的初学者,帮助读者理清配置接口选择、比特流生成与加载、配置安全等核心技术问题。资源为完整PDF手册,共1个文件,压缩包大小6.29MB,适合离线查阅和团队内部培训。手册内容从配置概述展开,覆盖配置引脚、主串与从串、SPI、JTAG等多种配置接口,详细讲述比特流文件的生成与加载步骤,并重点介绍利用AES对称加密算法保护比特流数据安全的具体实现,防止敏感配置信息泄露。此外,书中还讨论了基于SSI技术的3D IC配置差异、配置调试方法以及设计注意事项,这些问题在实际项目中常被忽略,却有很高参考价值。目前已有326人学习/下载,无论对于新手入门还是老工程师排障,都是一份值得收藏的中文权威指南。
1. 为什么 7 Series 配置最终都要回到 UG470 来找答案
做过 7 Series 板卡调试的人多半经历过这种场面:Vivado 里 bit 已经生成,JTAG 下载能跑,一断电再开机就不亮。查完电源和时钟,最后发现是 M[2:0] 悬空、SPI flash 里的数据格式不对,或者 CONFIGRATE 超了 flash 上限。这类问题的标准答案都写在 UG470《7 Series FPGAs Configuration User Guide》里,可英文原版两百多页,多数人只翻到表格就合上了。2025 年的中文版把模式、时序、寄存器说明和术语排到同一套表述里,省掉了来回对照翻译的功夫。这篇文按普通 FPGA 工程师调板卡的顺序,把 7 Series 配置的原理、接口、约束生成、回退和验证串成一套可复现的做法。
2. 7 Series 配置架构:模式引脚、启动时序与 CONFIGRATE 的关系
2.1 配置的本质是 SRAM 初始化,不是“下载程序”
7 Series 的查找表与触发器都基于 SRAM,掉电即丢。所谓配置,是上电后由内部配置逻辑从外部源读入一整份 bit 数据,写入配置存储器,再由启动逻辑拉起 DONE。和 MCU 的 Flash 启动有本质区别:MCU 是执行代码,FPGA 是填充逻辑。所以「配置模式」的真实含义是:FPGA 从哪里、用什么接口拿第一份数据。这个选择由 M[2:0] 引脚决定,而且只在配置开始前采样一次。
常见误区是认为 JTAG 下载成功就等于配置成功。JTAG 模式会把 bit 直接写入配置存储器,掉电后不保留;要断电自启,必须把镜像放到外部非易失存储,并让 FPGA 在主模式下自己拉数据。这个差异是后面所有调试的出发点。
2.2 M[2:0] 编码决定数据来源与时钟来源
7 Series 的配置模式编码在 UG470 表 2-1 里列得很清楚,整机设计时必须把这三个引脚通过电阻固定到确定的电平,不能悬空。下面是我惯用的速查表:
| M[2:0] | 配置模式 | 数据来源 | CCLK 来源 |
|---|---|---|---|
| 000 | Master Serial | 串行 PROM(x1) | FPGA 内部产生 |
| 001 | Master SPI | SPI NOR Flash | FPGA 产生,即 SPI SCK |
| 010 | Master BPI | 并行 NOR Flash | FPGA 内部产生 |
| 011 | Master SelectMAP | 外部并行总线 | FPGA 内部产生 |
| 100 | Slave SelectMAP | 外部主机 | 外部提供 |
| 101 | Slave Serial | 外部主机(串行) | 外部提供 |
| 110 | JTAG | JTAG 链路 | JTAG TCK |
注意 110 并不是 JTAG 可用的唯一前提,JTAG 在任何模式下都能介入;M[2:0]=110 只是让 FPGA 上电后不主动找外部介质,停留在边界扫描状态。实际量产板多数把模式拨到 SPI 或 BPI,JTAG 只作为调试口用。
2.3 上电到 DONE 的启动时序
7 Series 启动序列大致是:电源稳定 → POR 释放 → INIT_B 拉高并释放 → 采样 M[2:0] → 主模式开始输出 CCLK → 从外部介质读入 bit 流头部 → 配置逻辑装载数据并做 CRC 校验 → DONE 拉高 → 启动用户 I/O。如果中途 CRC 或 IDCODE 出错,INIT_B 会被拉低,DONE 不拉高,配置失败。
这个时序里有两个容易被忽略的检查点:一是电源轨的稳定顺序,UG470 要求 VCCINT 先于或同时于 VCCAUX 和 VCCO 到达;二是 PROGRAM_B 的滤波,抖动会造成误触发重配。批量板卡上,用示波器抓 PROGRAM_B 下降沿到 DONE 上升沿,就能测到整条配置链路的时间。
2.4 CONFIGRATE 决定主模式读数据的快慢
主模式下 CCLK 由 FPGA 产生,频率由 bit 流头部的配置属性决定,对应 Vivado 里的参数就是 CONFIGRATE。它并不是越大越好,要同时受制于 PCB 走线、SPI flash 的最高时钟和 FPGA 型号本身的上限。
set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design]这条约束把主模式 CCLK 设为 33 MHz。生产环境里我一般先用 20 MHz 验证时序裕量,再逐步提频。设置完要重新生成 bit,因为该值会写进 bit 流头部,运行中的 FPGA 不受影响。如果 flash 的规格书标称 50 MHz 读时钟,但布线过长或串了太强的上拉,实际波形会劣化,这时报错往往表现为刚开始配置就失败。
3. 配置模式怎么接:SPI、BPI、SelectMAP 和 JTAG 的硬件与参数差异
3.1 SPI 模式:量产单镜像最稳妥的选择
7 Series 的 Master SPI 模式是当前单板最常见的量产启动方式。FPGA 作为 SPI 主机,主动给 flash 发读命令,把数据按 x1、x2 或 x4 位宽取回来。x4 模式需要占用 flash 的 DQ0-DQ3 四条线,换来的速度是 x1 的 4 倍。硬件上 MOSI、MISO、CS_B 和 SCK 都走 FPGA 专用配置引脚,不需要额外逻辑。Vivado 侧对应约束是:
set_property CONFIG_MODE SPIx4 [current_design] set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design] set_property BITSTREAM.CONFIG.CONFIGRATE 40 [current_design] set_property BITSTREAM.CONFIG.SPI_32BIT_ADDR Yes [current_design]第一行把配置模式声明为 SPI x4,第二行告诉位流生成器按 4 位数据总线写入配置信息,第三行限制 CCLK 频率,第四行启用 32 位 SPI 地址。最后这条在 flash 容量超过 16 MB 时必须开启,否则高地址访问会被截断。还有一个细节:SPIx4 依赖 flash 支持 Quad Read 指令,市面上常见的 N25Q、S25FL 系列基本都带;如果你选的 flash 只读支持 x1,那把SPI_BUSWIDTH改成 1,避免配置阶段总线飘忽。
3.2 BPI 模式:并行 NOR Flash 的低延迟优势
BPI 模式让 FPGA 像读内存一样去读并行 NOR Flash,地址线由 FPGA 直接管理,天然适合 MultiBoot,因为跳转地址就是直接给地址总线。它比 SPI 快,但要占掉几十根 PCB 走线,小板子一般不用。Vivado 里的接口名和约束对应关系如下:
set_property CONFIG_MODE BPI [current_design] set_property BITSTREAM.CONFIG.BPI_BUSWIDTH 16 [current_design]BPI 的BPI_BUSWIDTH可以是 8 或 16,必须和 NOR Flash 的位宽一致。写烧写镜像时,write_cfgmem的-interface要写成bpi-x16或bpi-x8,保证生成的 bin 文件在地址编排上匹配 FPGA 的读时序。BPI 模式下 CCLK 频率同样受 CONFIGRATE 控制,但因为并行读取,相同频率下吞吐远高于 SPI。
3.3 SelectMAP:让外部处理器掌握加载节奏
SelectMAP 是从模式中吞吐最高的一档,数据位宽支持 8、16、32。外部主机通过 CSI_B 和 RDWR_B 控制写入窗口,并在每个 CCLK 上升沿送一个数据字。Zynq-7000 的 PS 配置 PL 用的就是类似机制,但 7 Series 独立 FPGA 如果要搭配外部 CPU,常见做法是把 CPU 的通用并行总线和 SelectMAP 引脚相连。约束写法:
set_property CONFIG_MODE SELECTMAP [current_design] set_property BITSTREAM.CONFIG.SELECTMAP_BUSWIDTH 16 [current_design]在从模式下 CONFIGRATE 不生效,CCLK 由外部提供,所以外部主机的时钟频率直接决定配置速度。调试时注意 RDWR_B 在写入方向必须保持低电平,CSI_B 拉低期间数据总线不能翻转,否则 FPGA 采到错字会立刻把 INIT_B 拉低。很多第一次做 SelectMAP 的板子,问题都出在主机软件把总线复用脚配置错了方向。
3.4 JTAG:调试允许慢,但不能没有
JTAG 模式不需要配置 flash,也不依赖 M 引脚,但 M[2:0]=110 会让 FPGA 上电直接停在 JTAG 状态。更常见的做法是 M 引脚设在 SPI,JTAG 始终可用。下载命令使用program_hw_devices,速度受 TCK 和 Virtex 系列配置逻辑共同限制。JTAG 在生产环节还有一个作用:读取 IDCODE,确认 FPGA 型号和封装有没有被 PCB 贴错。
| 模式 | 典型场景 | 速度量级 | 掉电自启 |
|---|---|---|---|
| SPIx1 | 小容量、布线紧张 | 慢 | 支持 |
| SPIx4 | 量产板 | 中 | 支持 |
| BPIx16 | 大镜像、MultiBoot | 快 | 支持 |
| Slave SelectMAP | CPU 动态加载 | 快 | 外部配合 |
| JTAG | 调试、烧写 flash | 慢 | 仅 JTAG 不持留 |
4. 用 Vivado 的 UG470 属性从 bit 生成 7 Series 烧写镜像
4.1 用 write_cfgmem 把 bit 转成 flash 能认的格式
Vivado 综合实现后得到.bit,它带时序定义和器件信息,但 flash 不认。量产需要的是.bin或.mcs。转换命令如下:
write_cfgmem -format bin -interface spix4 \ -loadbit "up 0x0 top.bit" \ -size 16 -file top.bin-format bin输出纯二进制,-interface spix4要和前面约束里的 CONFIG_MODE 一致,-loadbit "up 0x0"表示从 flash 的 0x000000 地址开始放 bit,-size 16是 flash 容量,单位是 Mb。比如 128 Mb 的 flash 要写-size 128。如果接口写错,比如约束是 SPIx4、这里写spi,生成的 bin 在 x4 读取时会错位,表现就是 DONE 永远不拉高。
4.2 压缩、加密和用户访问寄存器
7 Series 支持 bit 流压缩,压缩后镜像体积变小、烧写时间变短,但配置逻辑要先解压再装载,所以启动时间会比未压缩略长。开启方式:
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] set_property BITSTREAM.CONFIG.USR_ACCESS 0xA5A5A5A5 [current_design]USR_ACCESS是一条 32 位用户自定义数据,会被写进 bit 流,上电后可以通过配置状态寄存器读取,常用来放版本号或板卡标识。加密方面,7 Series 支持 AES-256,密钥存在 BBRAM 或 eFUSE 里,流程要先烧密钥再生成加密 bit。这环节一旦出错,器件不会变砖,但只能回 JTAG 清掉 BBRAM,eFUSE 则不可逆,所以量产前一定先在样机上验证整套流程。
4.3 属性名写错时最常见的报错
Vivado 的配置属性名和值都是强校验的,写错会看到类似unsupported config option的提示。常见原因是把旧版本属性名带到新版本,或者在current_design还没设置时执行约束。解决办法是先在 Tcl Console 里确认对象:
current_design report_property [current_design] -all检查输出里 BITSTREAM 开头的属性是否存在,再逐条设置。另一个高频错误是把SPIx4写成SPI_X4或spix4,Vivado 里模式大小写不敏感但下划线位置敏感。遇到这类报错别急着怀疑工具,把属性名复制到 UG470 的附录里搜一遍,通常都能对上。
4.4 常用 CONFIG 属性速查
| 属性 | 常见取值 | 作用 |
|---|---|---|
| BITSTREAM.CONFIG.CONFIGRATE | 1-100,整数 MHz | 主模式 CCLK 频率 |
| BITSTREAM.CONFIG.SPI_BUSWIDTH | 1/2/4 | SPI 数据位宽 |
| BITSTREAM.CONFIG.BPI_BUSWIDTH | 8/16 | BPI 数据位宽 |
| BITSTREAM.CONFIG.CONFIGFALLBACK | Enable/Disable | 是否允许回退 |
| BITSTREAM.CONFIG.NEXT_CONFIG_ADDR | 十六进制地址 | 下一次跳转地址 |
| BITSTREAM.GENERAL.COMPRESS | TRUE/FALSE | 位流压缩 |
5. 7 Series MultiBoot 回退:golden 镜像与 ICAP 跳转的落地配置
5.1 双镜像布局:golden 住底,update 住高
MultiBoot 的核心是让 FPGA 在加载一个镜像失败时,退回去加载另一个可靠镜像。实践中我把第一个镜像放在 flash 最低地址 0x0,称为 golden,第二个镜像放在 0x01000000 之后的 update 区。golden 镜像只放最保守的功能,比如点灯和 JTAG 回退;update 镜像放真正的应用逻辑。两个镜像都生成好后,按地址拼接写入同一颗 flash。
地址规划上要注意 flash 的扇区边界,update 起始地址最好对齐扇区起始,方便擦写时不影响 golden。如果 update 需要现场升级,应用层直接擦除 update 所在扇区,golden 区域加写保护,这样最安全。
5.2 CONFIGFALLBACK 控制回退行为
回退能力由 bit 流的 CONFIGFALLBACK 属性决定。golden 镜像里要开回退,并指定下一次要尝试的地址:
set_property BITSTREAM.CONFIG.CONFIGFALLBACK Enable [current_design] set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 0x01000000 [current_design]CONFIGFALLBACK Enable让 FPGA 检测到 CRC、IDCODE 或看门狗超时后,自动回到地址 0x0 重新加载 golden。NEXT_CONFIG_ADDR是 golden 镜像里写死的跳转目标,告诉 FPGA 加载完 golden 后,下一次 IPROG 应该从哪个地址取 update。两个属性要作用在同一次生成的 golden bit 上,update bit 里不需要开 fallback,因为它已经是被跳转的一方。
5.3 用 ICAPE2 从应用逻辑主动发起重配
MultiBoot 不只能被动等失败,应用逻辑可以在运行中主动跳转。7 Series 上通过 ICAPE2 原语向配置逻辑发 IPROG 命令实现。最简序列如下:
reg [31:0] icap_cmd [0:6]; initial begin icap_cmd[0] = 32'hAA995566; // sync word icap_cmd[1] = 32'h20000000; // NOP icap_cmd[2] = 32'h30020001; // write WBSTAR icap_cmd[3] = 32'h01000000; // 目标地址 icap_cmd[4] = 32'h20000000; // NOP icap_cmd[5] = 32'h30008001; // write CMD icap_cmd[6] = 32'h0000000F; // IPROG 命令 endAA995566是配置同步字,30020001是 Type 1 写寄存器命令,后面跟的01000000写入 WBSTAR,即下次加载地址。30008001打开 CMD 寄存器,0000000F触发 IPROG。写入时要把这七个 32 位字按顺序送到 ICAPE2 的数据端口,并配合 CS_B 和 WRITE 信号。手工写状态机时在每两个字之间加 NOP 是安全习惯,能避免配置接口过紧导致漏字。
5.4 回退触发条件与易踩的坑
回退触发条件有三个:CRC 错误、器件 ID 不匹配、配置看门狗超时。DONE 已经拉高后表示当前镜像启动成功,之后不管应用逻辑怎么跑,回退机制都不再介入。最容易踩的坑是 NEXT_CONFIG_ADDR 写错成字节地址之外的地址,导致 IPROG 跳到一个没有镜像的扇区,FPGA 反复配置失败,表现为 DONE 周期性地闪一下。这类问题用示波器抓 DONE 就能看到规律。
还有一个常见误用:update 镜像生成时也开了 CONFIGFALLBACK,导致它加载失败后回退到 0x0,这本身没问题,但如果 update 里又写了 NEXT_CONFIG_ADDR,回退后可能导致再次跳回 update,形成死循环。我的做法是只在 golden 镜像里配 fallback 和 NEXT_CONFIG_ADDR,update 镜像保持默认。
6. 配置验证与排错:从 DONE 波形和错误码定位问题
6.1 用 Hardware Manager 完成一次命令行下载
图形界面下载人人都熟,命令行更适合批量验证或写进测试脚本。核心流程如下:
open_hw_manager connect_hw_server -url localhost:3121 open_hw_target current_hw_device [lindex [get_hw_devices] 0] set_property PROGRAM.FILE top.bit [current_hw_device] program_hw_devices [current_hw_device]open_hw_target连接本地 JTAG 链,get_hw_devices返回链上所有设备,current_hw_device选中第一个。PROGRAM.FILE指定 bit 文件,最后program_hw_devices完成下载。如果有多片 FPGA,用get_hw_devices配合filter按名字选,避免烧错目标。
6.2 用示波器量出整条配置时间
配置时间可以从 PROGRAM_B 下降沿开始,到 DONE 上升沿结束。理论值近似为:bit 文件大小除以(CCLK 频率乘数据位宽)。比如 20 Mb 镜像、SPIx4、40 MHz 时钟,时间约为 20e6 / (40e6 × 4) = 0.125 秒。实测如果比这个值大得多,说明 CONFIGRATE 没有生效,或者镜像开了压缩产生了解压开销。测量时注意探头要同时抓 PROGRAM_B 和 DONE,M 引脚采样发生在 INIT_B 释放附近,这一小段延迟也包含在总时长里。
6.3 高频故障速查
| 现象 | 优先排查方向 |
|---|---|
| CCLK 有脉冲但 DONE 始终低 | bit 与器件不匹配,查 IDCODE |
| DONE 周期性闪一下 | MultiBoot 跳转地址不存在,或 update 扇区被擦坏 |
| 掉电后完全不启动,JTAG 正常 | M[2:0] 电平不对,或 flash 数据缺失 |
| SPIx4 配置失败,x1 正常 | flash 不支持 Quad 读,或 DQ2/DQ3 没接 |
| 约束报 unsupported config option | 属性名或模式写法与当前版本不匹配 |
最后留一个实践技巧:凡是 SPI flash 相关的配置问题,先别急着改代码,把 CONFIGRATE 降到 20 MHz,改用write_cfgmem -interface spi生成一套 x1 镜像,只接 DQ0/DQ1 试启动。x1 能起,说明硬件链路和 bit 都正常,问题集中在 quad 位宽或时钟裕量上;x1 也不能起,再回头查 M 引脚和 flash 焊接。
本文还有配套的精品资源,点击获取