跳转至

Quartus II 配置文件格式详解

阅读信息
阅读时间:19 分钟 字符数:9243 有效代码行数:107

本文系统说明 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。

数据路径如下:

Quartus Programmer
        |
        v
     JTAG 下载线
        |
        v
FPGA JTAG + 临时 SFL 桥接逻辑
        |
        v
外部串行配置 Flash

生成 .jic

在 Quartus 中打开:

File -> Convert Programming Files

按以下逻辑配置:

  1. 将输出类型设为 JTAG Indirect Configuration File (.jic)。
  2. 选择板上实际使用的配置 Flash 型号或容量。
  3. 在 Flash Loader 中添加并选择实际 FPGA 型号。
  4. 在 SOF Data 中添加完整编译生成的 .sof。
  5. 根据需要设置配置模式、起始地址和压缩选项。
  6. 生成 .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。
  • 升级包中只保存可由现有加载程序识别的配置负载。

简单转换可使用:

quartus_cpf -c input.sof output.rbf

.rbf 的使用方必须自行完成配置时序和状态检查,包括但不限于:

nCONFIG
nSTATUS
DCLK
DATA 或并行数据总线
CONF_DONE
INIT_DONE(如启用)

被动串行接口的位序

当外部主机直接通过 Cyclone IV 等器件的 Passive Serial 接口向 DATA[0] 发送 .rbf、.ttf 或 .hex 数据时,配置手册通常要求每个字节按 LSB first 发送。这里的 LSB first 是“字节内部的 bit 顺序”,不是把文件中的字节整体倒序。

例如文件中的字节为:

02 1B EE 01 FA

每个字节按 LSB first 串行发送时,对应的 bit 流为:

02 -> 01000000
1B -> 11011000
EE -> 01110111
01 -> 10000000
FA -> 01011111

如果 MCU 的发送外设只能按 MSB first 输出,可以先对每个字节做 bit reverse,再按普通 MSB first 发送:

02 1B EE 01 FA  ->  40 D8 77 80 5F

不要把这种处理误写成以下操作:

整份文件前后倒序
按 16 位或 32 位交换字节
只交换相邻字节

原始二进制不代表可以直接写入任意 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,并纳入工程版本管理,使图形界面的转换过程可以重复执行。

命令行示例:

quartus_cpf -c conversion.cof

.cof 对自动构建特别重要。只保留最终 .jic 而没有保存生成参数,会使后续人员难以确认 Flash 型号、地址布局和输入 .sof 的对应关系。

典型生成流程

流程一:开发阶段临时配置

Quartus 完整编译
        |
        v
      .sof
        |
        v
Programmer + JTAG
        |
        v
FPGA SRAM

适用于频繁修改和在线调试。重新上电后需要再次下载。

流程二:仅有 FPGA JTAG 接口时固化外部 Flash

.sof + FPGA 型号 + Flash 型号
              |
              v
             .jic
              |
              v
JTAG -> FPGA/SFL -> 外部配置 Flash
              |
              v
重新上电,FPGA 从 Flash 主动加载

这是许多 Cyclone 系列开发板的常见固化方式。

流程三:主控在上电后配置 FPGA

.sof -> .rbf -> 主控 Flash/文件系统
                    |
                    v
             MCU/CPU 配置驱动
                    |
                    v
              FPGA PS/FPP 接口

主控需要管理配置引脚、时钟、错误检测、超时和重试。

流程四:量产烧录外部 Flash

.sof/.pof -> .rpd 或 .hexout
                  |
                  v
          离线或在线生产编程器
                  |
                  v
             外部配置 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 中生成镜像哈希值:

Get-FileHash -Algorithm SHA256 .\output_file.jic

与配置文件容易混淆的其他文件

扩展名 用途 是否是整片 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 版本兼容列表