Quartus II 配置文件格式详解¶
本文系统说明 Quartus II/Quartus Prime 中常见的 FPGA 配置、配置存储器编程和 JTAG 操作文件,重点比较 .sof、.pof、.jic、.rbf 与 .rpd 的用途、生成方式和使用限制。
配置文件解决什么问题¶
多数 FPGA 的逻辑配置保存在 SRAM 中,上电后必须从外部配置存储器或主控重新加载。开发和量产阶段因此会接触不同层次的文件:
HDL、IP、约束
|
v
Quartus 完整编译
|
v
.sof ----------------------> JTAG 临时配置 FPGA
|
+--> .jic ---------------> 经 FPGA 的 JTAG 间接烧写外部 Flash
|
+--> .pof ---------------> 编程配置器件、CPLD 或片上非易失区
|
+--> .rbf ---------------> MCU、CPU 或定制逻辑直接加载 FPGA
|
+--> .rpd/.hexout/.ttf --> 第三方编程器或生产烧录设备写 Flash
Quartus II 与 Quartus Prime
Intel 收购 Altera 后,Quartus II 更名为 Quartus Prime。两代工具的核心概念基本一致,但不同版本、FPGA 系列和配置器件支持的输出格式、选项名称可能不同,应以目标器件手册和当前版本界面为准。
先区分三个对象¶
理解这些格式前,应先确定文件最终作用于哪个对象。
| 对象 | 保存内容 | 典型文件 | 特点 |
|---|---|---|---|
| FPGA 配置 SRAM | 当前逻辑配置 | .sof、.rbf |
通常掉电丢失 |
| 配置 Flash 或非易失配置区 | 上电配置镜像 | .pof、.jic、.rpd、.hexout |
断电后保留 |
| 编程流程或工程描述 | JTAG 操作、器件链、格式转换参数 | .jam、.jbc、.svf、.cdf、.cof |
不一定是单纯的配置数据 |
同一个设计可以生成多种格式,但它们不能仅靠修改扩展名互相替代。文件内容可能同时包含配置位流、Flash 地址、器件选项、编程算法或 JTAG 指令。
常见格式总览¶
| 扩展名 | 名称 | 主要用途 | 典型写入路径 | 掉电后是否保留 |
|---|---|---|---|---|
.sof |
SRAM Object File | 开发阶段配置 FPGA | 下载线 -> JTAG -> FPGA SRAM | 否 |
.pof |
Programmer Object File | 编程配置器件、部分 CPLD 或片上 Flash | 下载线/编程器 -> 目标非易失器件 | 是 |
.jic |
JTAG Indirect Configuration File | 通过 FPGA JTAG 间接编程外部串行 Flash | JTAG -> FPGA/SFL -> Flash | 是 |
.rbf |
Raw Binary File | 由 MCU、CPU 或自定义配置控制器加载 FPGA | 主控 -> PS/FPP 等配置接口 | 取决于保存介质 |
.rpd |
Raw Programming Data File | 向外部 Flash 写入原始镜像 | 第三方编程器 -> Flash | 是 |
.hexout |
Hexadecimal Output File | 用 Intel HEX 记录带地址的数据 | 生产烧录器/主控工具 -> 存储器 | 取决于目标介质 |
.ttf |
Tabular Text File | 以文本表格形式导出编程数据 | 第三方工具或旧式生产流程 | 取决于目标介质 |
.jam |
JAM STAPL File | 用脚本描述 JTAG 编程过程 | JAM Player -> JTAG 链 | 取决于操作对象 |
.jbc |
JAM Byte-Code File | JAM 的紧凑字节码形式 | JBC Player -> JTAG 链 | 取决于操作对象 |
.svf |
Serial Vector Format | 用通用向量描述 JTAG 状态和数据 | SVF Player -> JTAG 链 | 取决于操作对象 |
.cdf |
Chain Description File | 保存 Programmer 中的 JTAG 链配置 | Quartus Programmer 读取 | 不适用 |
.cof |
Conversion Setup File | 保存 Convert Programming Files 参数 | quartus_cpf 读取 |
不适用 |
“掉电后是否保留”取决于最终写入对象,而不只取决于文件扩展名。例如 .rbf 自身只是文件;如果它保存在主控的 Flash 中,文件会保留,但加载到 FPGA SRAM 中的配置仍会在 FPGA 断电后消失。
.sof:开发调试的主文件¶
.sof 是 Quartus 完整编译后最常见的配置输出。它包含特定 FPGA 型号所需的 SRAM 配置数据,通常通过 Programmer 和 JTAG 下载线直接写入 FPGA。
典型操作:
Tools -> Programmer
Hardware Setup -> 选择下载线
Auto Detect 或 Add File -> 选择 .sof
勾选 Program/Configure
Start
.sof 的特点:
- 下载后立即生效,适合功能调试、SignalTap 调试和快速迭代。
- 只配置 FPGA 的易失性 SRAM,断电或重新上电后配置消失。
- 与目标 FPGA 型号和编译结果绑定,不能下载到不兼容的器件。
- 通常是生成
.jic、.pof、.rbf等文件的源文件。
成功下载 .sof 不等于已经完成固化
.sof 下载成功只能证明当前 FPGA 已配置。若板卡重新上电后逻辑消失,应检查外部 Flash 是否已经烧写、启动模式引脚是否正确,以及 FPGA 能否在上电时访问配置存储器。
.pof:非易失器件的编程对象¶
.pof 用于 Quartus Programmer 支持的非易失目标,常见对象包括:
- Altera/Intel 专用配置器件。
- 部分 MAX 系列 CPLD 或片上非易失配置区。
- 通过相应编程模式直接访问的配置存储器。
与 .sof 相比,.pof 不只是“同一位流的另一个扩展名”。它可以包含面向非易失器件的地址映射、配置页、选项位及一个或多个数据区域。具体能力取决于所选器件。
常见生成入口:
File -> Convert Programming Files
Programming file type -> Programmer Object File (.pof)
Configuration device -> 选择实际器件
Input files to convert -> 添加 .sof 或其他输入
Generate
适合使用 .pof 的情况:
- 编程对象本身出现在 Programmer 支持的器件链中。
- 使用 Active Serial 等方式直接编程受支持的配置器件。
- 目标器件手册或板卡生产流程明确要求
.pof。
不要仅因为目标是“外部 Flash”就默认选择 .pof。如果板卡只引出了 FPGA 的 JTAG,而 Flash 不在 JTAG 链上,通常应生成 .jic,利用 FPGA 作为 JTAG 到 Flash 的桥接器。
.jic:通过 FPGA 间接烧写配置 Flash¶
.jic 是工程中最容易与 .pof 混淆的格式。它面向“JTAG 间接配置”场景:下载线连接 FPGA 的 JTAG 接口,Quartus 先向 FPGA 加载 Serial Flash Loader(SFL),再由 FPGA 访问外部 EPCS、EPCQ 或兼容串行配置 Flash。
数据路径如下:
生成 .jic¶
在 Quartus 中打开:
按以下逻辑配置:
- 将输出类型设为
JTAG Indirect Configuration File (.jic)。 - 选择板上实际使用的配置 Flash 型号或容量。
- 在
Flash Loader中添加并选择实际 FPGA 型号。 - 在
SOF Data中添加完整编译生成的.sof。 - 根据需要设置配置模式、起始地址和压缩选项。
- 生成
.jic。
烧写 .jic¶
在 Programmer 中选择正确的 JTAG 硬件并执行 Auto Detect,然后添加 .jic,勾选相应 Flash 项目的 Program/Configure。某些版本还可选择 Verify 或 Blank-Check。
烧写过程中,SFL 会暂时占用 FPGA。烧写完成不代表 FPGA 已自动切换到新镜像,通常需要重新上电或触发配置重启。
.jic 包含哪些上下文¶
.jic 通常不仅包含由 .sof 转换得到的 Flash 数据,还与以下信息有关:
- 充当 Flash Loader 的 FPGA 型号。
- 外部配置 Flash 的型号或容量。
- Flash 内的地址布局。
- 间接编程所需的 JTAG/SFL 信息。
因此,同一份 .sof 在 FPGA 型号或 Flash 型号改变后,通常需要重新生成 .jic。
Flash 型号不能只按容量随意代替
即使两个器件容量相同,其命令集、地址宽度、扇区结构和器件识别方式也可能不同。应优先选择 Quartus 中与实物一致的型号;使用兼容器件时,需要先确认 FPGA 系列、Quartus 版本和 Flash 厂商的兼容说明。
.rbf:供主控加载的原始位流¶
.rbf 是相对精简的二进制配置数据,常用于脱离 Quartus Programmer 的系统。例如 MCU、SoC、CPU、Bootloader、测试设备或自定义逻辑在系统启动时读取文件,再通过 FPGA 配置接口发送数据。
典型场景:
- MCU 通过 Passive Serial(PS)接口配置 FPGA。
- 处理器通过 Fast Passive Parallel(FPP)接口配置 FPGA。
- Linux 或 Bootloader 从文件系统读取位流后配置 FPGA。
- 升级包中只保存可由现有加载程序识别的配置负载。
简单转换可使用:
.rbf 的使用方必须自行完成配置时序和状态检查,包括但不限于:
被动串行接口的位序¶
当外部主机直接通过 Cyclone IV 等器件的 Passive Serial 接口向 DATA[0] 发送 .rbf、.ttf 或 .hex 数据时,配置手册通常要求每个字节按 LSB first 发送。这里的 LSB first 是“字节内部的 bit 顺序”,不是把文件中的字节整体倒序。
例如文件中的字节为:
每个字节按 LSB first 串行发送时,对应的 bit 流为:
如果 MCU 的发送外设只能按 MSB first 输出,可以先对每个字节做 bit reverse,再按普通 MSB first 发送:
不要把这种处理误写成以下操作:
原始二进制不代表可以直接写入任意 Flash
.rbf 主要描述“主机如何向 FPGA 配置接口发送数据”,而 .rpd 更接近“配置 Flash 中应保存的编程数据”。二者的字节顺序、位顺序、头部和地址语义可能不同。主控程序或烧录器必须严格按目标接口要求处理,不能凭文件大小相近就互换。
.rpd:面向 Flash 的原始编程数据¶
.rpd 保存外部配置存储器所需的原始编程数据,常用于:
- 离线烧录器或量产编程器。
- Flash 厂商提供的烧录工具。
- 由 MCU、产线软件或自研工具直接更新配置 Flash。
- 将 Quartus 生成的镜像集成到更大的生产固件中。
与 .jic 相比,.rpd 通常不携带完整的 JTAG 间接编程流程。第三方工具需要知道目标 Flash、写入偏移、擦除范围以及数据组织方式。
.rpd 已经是二进制原始数据,因此将它交给只接受 .bin 扩展名的烧录器时,文件格式层面通常只是原样复制或改名。是否需要每字节 bit reverse,取决于该 RPD 的生成选项、目标 FPGA 配置路径以及烧录器对数据的解释。特别要区分:
MCU 直接驱动 FPGA DATA[0]:必须保证配置接口收到 LSB first
MCU 通过 SPI 写 Flash,再由 FPGA Active Serial 读取:必须匹配 Flash 中实际保存的位序
在第二种路径中,SPI Flash 常按 MSB first 向 FPGA 输出数据。如果输入文件是面向直接 DATA[0] 发送的数据,可能需要对每个字节做 bit reverse。
本项目的实际链路为:
Quartus 生成 .rpd
|
| 本项目实测:RPD 未包含每字节 bit reverse
v
每字节 bit reverse
|
v
MCU 通过 MSB-first SPI 写入 W25Q16
|
v
W25Q16 读取时按 MSB first 输出,FPGA DATA[0] 得到 LSB-first 位流
因此,不能将 .rpd 原样改名为 .bin 后直接烧写;应先对每个字节做 bit reverse,再由 MCU 写入 Flash。该结论适用于当前 Quartus 版本、目标 FPGA、W25Q16 和配置模式组合。迁移到其他 Quartus 版本、FPGA 系列或 Flash 型号时,需要做验证,确认是否需要转换。
使用 .rpd 时必须确认:
| 检查项 | 原因 |
|---|---|
| Flash 型号和容量 | 决定地址范围、擦除粒度和命令兼容性 |
| 写入起始地址 | 多镜像或带 Bootloader 时不能默认从零开始 |
| 位/字节顺序 | 直接 DATA[0] 配置通常要求 LSB first;Flash 镜像是否已完成 bit reverse 必须根据生成方式和参考 dump 确认 |
| 擦除范围 | 避免清除同一 Flash 中的参数区或其他镜像 |
| 镜像长度和填充值 | 避免烧录器截断数据或写入无关区域 |
| 校验方法 | 应对烧录后内容做读取校验或校验和验证 |
.hexout 与 .ttf:文本化导出格式¶
.hexout¶
.hexout 使用 Intel HEX 风格的 ASCII 记录表达地址、数据和记录校验和。它适合只能接收十六进制文本文件的编程器或生产工具。
相比 raw binary,Intel HEX 的优势是文件自身带地址信息,空洞区域无需全部展开;缺点是体积更大,而且下游工具必须正确处理扩展地址记录和校验和。
.ttf¶
.ttf 以表格化文本记录编程数据,主要用于特定第三方工具、旧式编程设备或需要人工检查数据的流程。它不是 Quartus Timing Analyzer 的时序文件。
这两种格式是否可用,取决于 Quartus 版本、输出类型和目标器件。现代流程中,如果生产编程器直接支持 .pof、.jic 或 .rpd,通常无需额外转换为文本格式。
.jam、.jbc 与 .svf:描述 JTAG 操作¶
.jam¶
.jam 基于 JAM STAPL,文件中既可以包含数据,也可以包含设备编程所需的流程控制。目标环境运行 JAM Player 后,可在不安装完整 Quartus 的情况下执行相应 JTAG 操作。
.jbc¶
.jbc 是 JAM 的字节码形式,通常比文本形式更紧凑,适合嵌入式控制器或受限的生产环境。它需要兼容的 JBC Player。
.svf¶
.svf 使用一系列 JTAG 状态转换和扫描向量描述操作,具有较好的工具通用性,常用于自动测试设备、边界扫描工具或第三方 JTAG 控制器。
这些文件的共同特点是:它们描述的是“如何通过 JTAG 执行操作”,而不只是裸配置位流。生成后应在目标 JTAG 链拓扑和目标工具上验证;链中器件数量、IR 长度或顺序变化,都可能导致原有文件失效。
.cdf 与 .cof:辅助工程文件¶
.cdf:JTAG 链描述¶
.cdf 保存 Quartus Programmer 当前的器件链、器件顺序、分配的编程文件和操作选项。它便于下次恢复相同的 Programmer 设置,也可用于批处理。
.cdf 本身通常不是 FPGA 配置镜像,不能代替 .sof、.pof 或 .jic。复制 .cdf 到另一台计算机时,还要确保其中引用的文件路径有效。
.cof:格式转换配置¶
.cof 保存 Convert Programming Files 中的输入文件、输出格式、目标器件、地址和相关选项。复杂转换建议保存 .cof,并纳入工程版本管理,使图形界面的转换过程可以重复执行。
命令行示例:
.cof 对自动构建特别重要。只保留最终 .jic 而没有保存生成参数,会使后续人员难以确认 Flash 型号、地址布局和输入 .sof 的对应关系。
典型生成流程¶
流程一:开发阶段临时配置¶
适用于频繁修改和在线调试。重新上电后需要再次下载。
流程二:仅有 FPGA JTAG 接口时固化外部 Flash¶
这是许多 Cyclone 系列开发板的常见固化方式。
流程三:主控在上电后配置 FPGA¶
主控需要管理配置引脚、时钟、错误检测、超时和重试。
流程四:量产烧录外部 Flash¶
量产前应使用真实器件和正式烧录器做首件验证,并保存烧录器工程、镜像哈希值和版本对应关系。
如何选择格式¶
| 需求 | 推荐格式 | 选择理由 |
|---|---|---|
| 在实验室快速验证逻辑 | .sof |
JTAG 直接配置,迭代最快 |
| 断电后由外部串行 Flash 自动启动,板上只方便连接 FPGA JTAG | .jic |
可借助 FPGA/SFL 间接烧写 Flash |
| 直接编程受 Quartus 支持的配置器件、CPLD 或片上非易失区 | .pof |
包含对应非易失器件的编程数据和选项 |
| 由 MCU 或 CPU 在系统启动时配置 FPGA | .rbf |
便于主控按配置接口发送原始位流 |
| 用第三方设备直接烧写配置 Flash | .rpd 或生产设备要求的格式 |
接近 Flash 原始镜像,便于外部工具处理 |
| 生产设备只接受带地址的文本文件 | .hexout |
Intel HEX 记录包含地址和校验和 |
| 在无 Quartus 环境中重放 JTAG 编程操作 | .jam、.jbc 或 .svf |
文件可由相应 Player 或测试设备执行 |
| 保存 Programmer 的器件链设置 | .cdf |
记录链拓扑和文件分配,不是配置镜像 |
| 固化并自动重现复杂转换参数 | .cof |
可通过 quartus_cpf 重复生成输出 |
常见误区¶
把 .sof 当作掉电保存文件¶
.sof 默认写入 FPGA SRAM。若要上电自动运行,应根据硬件启动方案生成并烧写 .jic、.pof 或其他持久化镜像。
把 .jic 直接交给 MCU 加载 FPGA¶
.jic 面向 Quartus 的 JTAG 间接编程流程,通常不是 MCU 配置驱动所期望的原始位流。主控加载通常使用 .rbf 或平台指定的其他格式。
把 .rbf 直接写入 Flash 并假设一定能启动¶
不同启动模式对 Flash 内容布局、位顺序和附加信息的要求不同。应使用适合 Flash 的输出类型,并依据器件配置手册验证。
只按容量选择 .jic 中的 Flash¶
容量相同不代表完全兼容。型号选择错误可能导致无法识别、擦除失败、地址越界,或者表面烧写成功但上电配置失败。
忽略 FPGA 启动模式引脚¶
Flash 烧写正确后,FPGA 仍需处于与镜像匹配的 Active Serial、Passive Serial、FPP 等配置模式。模式引脚、电源时序、时钟和上拉下拉错误都可能导致启动失败。
认为扩展名能够说明全部内容¶
Quartus 版本、转换选项、压缩、加密、多镜像布局和目标器件都会影响文件内容。正式流程应保存转换参数、工具版本和目标硬件信息,并用实际配置结果验证。
验证与发布清单¶
生成前¶
- Quartus 工程中的目标 FPGA 型号与板上实物一致。
- 引脚、配置模式和未使用引脚设置已经确认。
- 外部配置 Flash 型号、容量和供电电压已经确认。
- 已明确上电时由 FPGA 主动加载,还是由 MCU/CPU 被动配置。
生成时¶
-
.jic中的 Flash Loader FPGA 型号正确。 -
.jic、.pof或.rpd的 Flash 地址没有覆盖其他数据区。 - 多镜像、压缩、加密和远程升级选项符合系统设计。
- 保存
.cof、Quartus 版本和输入.sof的版本信息。
烧写后¶
- Programmer 或生产工具报告擦除、编程和校验成功。
- 完全断电后重新上电,确认 FPGA 能独立启动。
- 检查
nSTATUS、CONF_DONE和INIT_DONE等状态信号。 - 验证用户逻辑功能,而不只观察 Programmer 的成功提示。
- 对量产镜像记录文件大小、SHA-256 和对应硬件版本。
可在 PowerShell 中生成镜像哈希值:
与配置文件容易混淆的其他文件¶
| 扩展名 | 用途 | 是否是整片 FPGA 的配置文件 |
|---|---|---|
.qpf |
Quartus 工程入口 | 否 |
.qsf |
器件、引脚和工程设置 | 否 |
.sdc |
时序约束 | 否 |
.mif |
Memory Initialization File,初始化 RAM/ROM 内容 | 否,但其数据可被合并进最终配置 |
.hex |
常用于存储器初始化或软件镜像,语义由使用场景决定 | 不一定 |
.stp |
SignalTap 逻辑分析配置 | 否 |
.sopcinfo |
Platform Designer/Qsys 系统描述 | 否 |
尤其要注意 .hex:它只是一个常用扩展名,可能表示 Intel HEX、存储器初始化数据或软件镜像。必须结合生成工具和使用位置判断,不能只看文件名。
结论¶
Quartus 配置文件的核心区别不在于扩展名本身,而在于“写入谁、通过什么接口写入、上电后由谁加载”。
最常用的选择可以简化为:
JTAG 临时调试 FPGA -> .sof
经 FPGA JTAG 固化外部 Flash -> .jic
直接编程受支持的非易失器件 -> .pof
由 MCU/CPU 配置 FPGA -> .rbf
由第三方编程器烧写 Flash -> .rpd/.hexout
建立正式发布流程时,应同时保存输入 .sof、转换用 .cof、生成工具版本、目标 FPGA/Flash 型号、烧写地址和输出文件哈希值。这样才能保证镜像可追溯、可重复生成,并避免将“能够烧写”误判为“能够可靠上电启动”。
参考资料¶
- Intel FPGA Documentation
- Intel Quartus Prime Programmer User Guide
- Intel Quartus Prime Pro Edition User Guide: Configuration
- 目标 FPGA 系列的 Configuration、Design Security 和 Remote System Upgrade 章节
- 目标配置 Flash 的数据手册及 Quartus 版本兼容列表