尧图精选

FPGA配置文件详解:SOF、POF、JIC的区别与转换

🕒 发布时间:2026/10/1 3:16:25 📁 来源:尧图网络
做FPGA开发的朋友十有八九都被Quartus工程目录下那一堆输出文件搞晕过。明明只是编译了一下结果文件夹里冒出sof、pof、jic、rbf、hex、svf……到底该用哪个去下载哪个才是量产要用的为什么有时下载完断电重启程序就没了这几个问题几乎每个新手都会踩一遍。这篇就把Quartus里最常用的三种文件——sof、pof、jic——一次讲透包括它们各自是什么、有什么区别、怎么互相转换、转换时有哪些坑。这篇文章适合刚接触FPGA和Quartus的初学者也适合那些已经在用Quartus但一直没把配置文件机制理清的朋友。无论你用Quartus II 13.0、13.1还是Quartus Prime 18.1/20.1/25.1这些文件格式的规则基本没变过界面也大同小异放心看。1. 三种文件格式到底各自承担什么角色1.1 SOFJTAG调试用的临时配置文件SOF全称SRAM Object File是Quartus编译成功后默认就会生成的文件。它的本质是把FPGA的配置数据打包成一个可以直接通过JTAG接口写入FPGA内部SRAM的格式。FPGA内部用来存放配置逻辑的SRAM是易失性的掉电就清空。所以SOF文件的作用非常纯粹在你开发调试阶段把编译好的逻辑临时加载到FPGA里跑一跑验证功能是否正确。你改了代码、重新编译、再次下载SOFFPGA里的逻辑就被覆盖成新版本了。这个过程速度快、操作简单非常适合反复迭代。不过这里有个关键点很多人一开始没意识到下载SOF只是“临时生效”。一旦你给板子断电再重新上电FPGA内部就是空的没有任何逻辑之前调好的功能全没了必须重新下载一次。所以如果你看到自己的板子每次上电都要连电脑下载程序才能跑起来那多半就是只下载了SOF没有做固化。1.2 POF上电自动加载的闪存编程文件POF全称Programmer Object File它是针对外部配置Flash芯片的编程文件。跟SOF直接写FPGA内部SRAM不同POF是烧写到板子上那颗独立的SPI Flash比如EPCS系列、EPCQ系列或者通用SPI NOR Flash里的。板子重新上电后FPGA会按照配置模式引脚MSEL设定的方式主动从外部Flash读取配置数据加载到内部SRAM里然后开始运行。这就是所谓的“固化”程序被永久保存在Flash里了断电不丢上电自动运行。所以在项目从调试阶段走向小批量、量产的时候POF才是主角。调试阶段你可以随手用SOF到了要交付、要独立运行的阶段就必须把程序烧进Flash。1.3 JICJTAG间接配置文件JIC全称JTAG Indirect Configuration File名字里的“Indirect”非常传神——它是通过JTAG链路间接地对配置Flash进行编程。它的出现解决了一个很实际的硬件问题很多开发板和自制板卡为了省空间、省成本只保留了JTAG下载接口没有引出的AS接口。AS接口是“Active Serial”主动串行接口是烧写EPCS/EPCQ系列Flash的“直连通道”但并不是所有板子都舍得把这个接口做出来。这时候你要烧Flash怎么办靠JIC。用Quartus Programmer选择JIC文件下载器会通过JTAG链先把一个名为“Flash Loader”的小型配置逻辑临时加载到FPGA里然后由FPGA充当“桥梁”把JIC文件里包含的配置数据写入那颗SPI Flash。整个过程你只需要一根JTAG线不需要AS接口。这就是“间接”两个字的含义。1.4 三者关系的一个通俗类比如果觉得概念太抽象可以这么理解SOF像你往内存条里临时放了一份文档电脑关机就没了POF像把文档存进了硬盘开机自动加载JIC则是你用一根特殊的转接线绕过了直连硬盘的SATA口通过USB口把文档写进硬盘。调试时用SOF、量产时用POF、只有JTAG接口时用JIC——这个大概就是三者的基本定位。2. 三者的本质区别与应用选型2.1 存储介质与易失性差异要真正理解三种文件的区别核心是抓住“文件数据最终写到哪”和“掉电后还在不在”这两个维度。文件格式全称数据写入目标易失性掉电后状态SOFSRAM Object FileFPGA内部SRAM配置单元易失数据丢失FPGA为空POFProgrammer Object File外部配置FlashEPCS/EPCQ等非易失数据保留上电自动加载JICJTAG Indirect Configuration File经FPGA中转写入外部配置Flash非易失数据保留上电自动加载从这个表格能看出来SOF跟另外两个是“不同赛道”的它是调试工具POF和JIC最终效果一样——都是把配置数据固化到Flash里区别只在于烧写路径不同。POF通常配合AS接口直接编程FlashJIC则配合JTAG接口间接编程Flash。2.2 下载方式与硬件接口的关系FPGA的配置方式常见的有JTAG、ASActive Serial主动串行、PSPassive Serial被动串行三种。搞清楚这三种方式文件选型就顺理成章了。JTAG模式优先级最高。无论FPGA里现在跑着什么逻辑只要通过JTAG链连接上位机就能直接控制FPGA。下载SOF时数据通过JTAG直接写入SRAM下载JIC时先通过JTAG加载Flash Loader再由Flash Loader去写Flash。AS模式是FPGA主动从外部Flash读取数据。板子上电后FPGA作为主机按照MSEL引脚配置的模式主动通过串行接口把Flash里的配置数据读进来。烧写这个Flash时如果用AS接口就需要POF文件。PS模式通常由外部控制器比如CPU、单片机主动把配置数据“喂”给FPGAFPGA处于被动接收状态。这个场景下经常用rbf、hex这类二进制或文本格式的配置文件不在本文重点讨论范围。实际开发中绝大多数开发板的设计是“JTAG接口 EPCS/EPCQ Flash”的组合少数会额外引出AS接口。所以你会发现很多板子明明烧SOF没问题但你想用AS模式烧POF时却找不到AS接口——这时候就该用JIC方案。2.3 文件生成方式与典型应用场景SOF文件在每次编译成功后自动生成不需要任何额外设置POF文件可以在工程设置里勾选“Generate POF file”让Quartus在编译时自动生成也可以后续通过转换工具手动生成JIC文件则完全依赖转换工具从SOF或者POF转出来编译本身不会直接产生JIC。从应用场景来说我个人的分法是这样的调试阶段只用SOF改完代码、编译、下载、看波形几分钟一个循环。如果每次都用JIC烧Flash烧写时间比SOF长很多纯属浪费生命。功能验证完毕准备交付或现场演示用JIC或POF固化确保断电重启后程序还在不会出现现场翻车的尴尬。小批量产用JIC或者POF批量烧写Flash。如果板子上有AS接口直接烧POF如果只有JTAG要么用JIC烧写要么用专门的离线烧录器。远程更新、多镜像启动等高级场景需要用到POF/JIC转换过程中的地址偏移、分区等高级选项后面会详细说。3. 转换实操从SOF到POF、JIC的完整流程3.1 转换前的准备工作转换文件之前有几件事必须先确认否则后面会报各种莫名其妙的问题。第一工程必须已经编译成功并且生成了SOF文件。这个文件默认在工程目录下的output_files文件夹里文件名通常是工程名.sof。第二必须知道你板子上配的Flash具体型号。是EPCS4、EPCS16、EPCS64还是EPCQ128、EPCQ256或者是通用的SPI NOR Flash比如W25Q16这个信息会直接影响你后续在下拉菜单里选哪个配置器件。很多板子原理图上会标或者可以直接看板载芯片的丝印。第三确认Quartus版本。我这边用Quartus Prime 18.1举例但Quartus II 13.0、13.1的界面几乎一模一样照着手点就行。打开Quartus软件菜单栏找到File - Convert Programming Files这是转换操作的入口无论是SOF转POF、SOF转JIC、POF转JIC都在这个窗口里完成。3.2 SOF转POF的详细步骤在Convert Programming Files窗口里按下面的步骤操作在Output programming file区域Programming file type下拉框选择Programmer Object File (.pof)。Mode下拉框选择1-bit Passive Serial这是默认选项也最常用部分器件可能默认不同但通常不需要改。在File name区域点击旁边的浏览按钮选择输出POF文件的保存路径和文件名建议命名成和工程一致方便管理。在Input files to convert区域点击Flash Loader这一行再点击右侧的Add Device按钮选择你的FPGA具体型号。这一步不是必须的但对于某些器件组合Quartus会要求在转换时加入Flash Loader信息。在Flash Loader下面的SOF Data这一行点击它然后点击Add File选择你刚才编译生成的.sof文件。如果工程里用了多个SOF文件比如多镜像配置可以继续点击Add File添加如果只有一个添加一次即可。点击OK或Generate按钮Quartus就开始转换。转换完成后在输出路径下就能看到生成的.pof文件。这里要提醒一句POF文件的大小跟配置Flash的容量是对应的。如果你生成POF时选的配置器件是EPCS64而板子上实际焊的是EPCS16那烧写时会报容量错误或者烧进去无法正常加载。所以选配置器件必须和硬件实际型号一致这是第一个坑。3.3 SOF转JIC的详细步骤SOF转JIC是日常用得最多的操作步骤和转POF非常相似但有几个关键选项不一样打开File - Convert Programming Files。Programming file type下拉框选择JTAG Indirect Configuration File (.jic)。Configuration device下拉框选择你的实际Flash型号比如EPCS16或者EPCQ128。这个选项在转POF时通常不需要但在转JIC时是必须选的因为它决定了Flash Loader以什么参数去写Flash。Mode下拉框选1-bit Passive Serial。在File name设置输出路径。在Input files to convert区域先点击Flash Loader这一行再点击Add Device选择你的FPGA型号比如Cyclone IV E系列就选EP4CE开头的型号。在Flash Loader下面的SOF Data这一行点击Add File添加.sof文件。点击Generate生成.jic文件。生成完成后到Quartus Programmer里点击Hardware Setup确认USB-Blaster已经识别点击Add File选择刚才生成的.jic勾选Program/Configure点击Start开始烧写。烧写过程中能看到进度条结束后会有提示。烧写JIC和直接下载SOF有一个很大的区别JIC烧写时间明显更长。因为SOF只是把数据灌进SRAM而JIC要先把Flash Loader加载进FPGA再通过FPGA把数据写进SPI FlashSPI Flash的擦写速度本来就比SRAM慢很多。如果你用的是几百KB甚至几MB的配置数据耐心等一两分钟很正常。3.4 POF转JIC和JIC转POF除了从SOF转换POF和JIC之间也能相互转换。POF转JIC的需求场景是你手里只有POF文件但板子上没有AS接口只有JTAG接口没法直接烧POF。这时可以打开Convert Programming Files窗口Programming file type选JTAG Indirect Configuration File (.jic)然后在Input files to convert区域把Flash Loader下的输入文件类型从SOF Data换成POF Data——操作方式是点击该行后在右侧的文件区域通过Add File添加.pof文件。JIC转POF的需求则相对少见一般是你要把原本通过JTAG间接烧写的JIC数据文件转换成可以直接通过AS接口烧写的POF格式。操作方式类似Programming file type选.pof输入文件类型选JIC Data添加.jic文件生成即可。这些转换本质上是在改“数据容器”的格式配置数据本身的逻辑内容不变但文件头、地址映射、烧写控制指令会根据目标格式重新打包。3.5 转换界面的高级选项地址偏移与分区如果你只是把单个SOF固化成Flash前面几步就够了。但如果涉及多个镜像、远程升级、或者为了安全留出Boot区就需要在Convert Programming Files窗口里设置地址了。在Input files to convert区域选中你添加的SOF Data那一行右键或者点击属性可以看到Properties选项。里面可以设置Address Offset也就是这段配置数据在Flash中的起始地址。举个例子如果你想在Flash地址0开头放一个Boot Loader镜像在0x100000放应用程序镜像就可以添加两个SOF分别设置不同的起始地址。这样FPGA上电后先从0地址加载Boot LoaderBoot Loader再根据条件决定是否跳转到0x100000的应用程序。这个功能在需要远程更新固件的产品里非常实用新固件先下载到备用地址校验通过后再更新启动地址避免升级过程中断电导致设备变砖。不过对绝大多数学习板和简单项目来说默认从0地址开始就足够了不需要动这个设置。4. 转换和烧写中的常见问题与解决技巧4.1 编译后找不到POF文件很多新手编译完在output_files文件夹里翻来翻去只看到.sof就是找不到.pof还以为自己操作有问题。原因很简单Quartus默认只生成SOFPOF需要在工程设置里手动打开。打开方式有两种。第一种在工程主界面菜单栏找到Assignments - Device点击Device and Pin Options切到Configuration标签页勾选Generate POF file。第二种直接用本文说的转换工具手动生成。如果是自己的学习项目我建议直接用转换工具就行不用改工程设置如果项目要频繁出固件还是勾上自动生成方便。4.2 JIC烧写时报“Flash Loader”相关错误烧写JIC时报错常见的有这几种提示Error: Cant recognize silicon ID for device、Error: Flash Loader not found、Error: Device chain broken。先检查Flash Loader里添加的FPGA型号是否和实际芯片一致。比如你的芯片是EP4CE10F17C8在下拉列表里应该选Cyclone IV E对应型号而不是随手选成Cyclone V。选错型号Flash Loader逻辑根本不匹配烧写必然失败。再检查JTAG链。如果板子上串联了多个JTAG设备或者线序有问题Quartus Programmer会识别不到目标设备。这时可以先在Programmer界面点Auto Detect看是否能正确识别出FPGA型号。识别不到就查硬件连接、供电、JTAG引脚有没有被复用。还遇到过一种情况某块板子第一次烧JIC成功第二次开始报错最后查出是Flash芯片虚焊温度一上来接触不良。这种硬件问题比较隐蔽排查时可以用手轻轻按压Flash芯片看是否恢复正常如果按压就正常就是焊接问题重新补焊即可。4.3 JIC烧写成功后上电却不运行这是最让人头大的问题。烧写显示成功断电重启FPGA就是“死”的没有逻辑运行。排查思路按顺序来。第一检查配置器件型号是否选错。比如板子上是EPCS16你在转换JIC时选了EPCS64数据虽然按EPCS64的格式写进去了但FPGA上电后按照EPCS16的方式去读可能读不到正确数据。查看实际芯片丝印重新转换重新烧写。第二检查MSEL引脚。Cyclone系列FPGA的MSEL引脚决定了配置模式如果MSEL被设置成JTAG模式所有MSEL引脚拉高或者某些组合FPGA上电后不会主动从Flash加载配置只会等JTAG指令。要求AS模式启动的话MSEL必须接对应的电平组合。具体电平参考对应器件手册的Configuration章节。这块是硬件设计的问题但如果你的板子是参考设计抄来的要留意有没有抄错。第三检查配置Flash是否真的写入了数据。可以用Quartus Programmer重新读回Flash内容和JIC文件做比对确认烧写过程没有异常。如果读回是全FF说明Flash根本没写入成功可能烧写时选了Program但没有真正执行或者Flash芯片本身有问题。第四检查复位芯片和配置完成信号。FPGA配置完成信号nCONFIG、CONF_DONE、nSTATUS的上拉电阻若缺失也可能导致上电配置不稳定。这个对新手来说排查难度较大可以直接用示波器量CONF_DONE在上电瞬间是否拉高如果一直是低电平说明配置没有完成。4.4 JTAG识别不到设备USB-Blaster插上后Quartus Programmer的Hardware Setup里看不到设备或者显示No hardware。这个问题在Windows系统上非常常见基本都是驱动问题。先确认Quartus自带的USB-Blaster驱动是否安装成功。设备管理器里查看USB-Blaster是否出现在对应端口下如果显示黄色感叹号右键更新驱动手动指向Quartus安装目录下的drivers\usb-blaster文件夹。不同版本路径略有差异但一般都在quartus\drivers\下面。如果驱动正常但依然识别不到检查下载线。USB-Blaster的10针接口方向很容易插反插反不会烧板子但会识别不到。另外下载线过长也会导致信号衰减一般推荐JTAG线长不超过20厘米线越长越可能下载失败。还有一个容易被忽略的问题目标板供电。JTAG下载器本身不提供核心电压如果板子没有单独上电只有USB-Blaster供电FPGA处于未上电状态JTAG链自然无法建立。务必确保目标板已经正常供电。4.5 转换时报“cant find memory”或地址重叠错误在添加多个SOF或设置地址偏移时Quartus可能提示地址重叠或者Flash空间不足。地址重叠的原因是两块配置数据的起始地址和长度存在交叉。检查每个输入文件的Properties里的Address Offset确保各区段不重叠。Flash空间不足则说明你的配置数据总大小超过了所选的Configuration device容量。比如EPCS16容量约16Mbit也就是2MB如果你放了两个各1.5MB的镜像必然超了。这时要么换更大容量的Flash要么精简逻辑减小配置数据。4.6 常见问题速查表现象可能原因解决办法编译后只有SOF没有POF工程设置未勾选生成POFDevice and Pin Options中勾选Generate POF file或手动转换JIC烧写报JTAG链错误Flash Loader型号选错、硬件连接问题重新添加正确FPGA型号检查JTAG连接JIC烧写成功但断电后不运行配置器件型号选错、MSEL错误、Flash虚焊核对Flash丝印、检查MSEL电压、检查焊接USB-Blaster识别不到驱动未装好、线序插反、板子未供电重装驱动、检查接口方向、给板子上电转换时提示Flash容量不足配置数据超过Flash容量换更大Flash或精简逻辑配置下载SOF正常但下载JIC很慢SPI Flash擦写速度慢正常现象耐心等待或改用AS接口直连烧写5. 一点个人经验和建议最后说点我在实际项目里的使用习惯给刚入门的读者参考。调试阶段我从来不用JIC全程SOF。写一段逻辑、编译、下载、跑测试、看SignalTap波形、改代码、再来一轮效率最高。SOF下载一般就几秒钟JIC烧写至少几十秒反复烧JIC只会拖慢节奏。功能稳定、准备把板子交给别人用或者送出去演示时我才转JIC烧一次Flash然后断电重启验证一遍。验证这一步很重要确认不是“调试时好好的一断电就废了”。量产或批量烧写时如果板子上有AS接口我一般用POF加专门的批量烧录工位如果只有JTAG我会生成JIC后用USB-Blaster一台一台烧。量再大的话建议考虑用FPGA的远程更新方案或者离线烧录器效率会高很多。转换文件这个操作本身不难难的是理解每种文件背后对应的数据流和硬件行为。只要把“SOF写SRAM、掉电丢POF写Flash、上电自动加载JIC通过JTAG中转写Flash”这三句话记牢以后遇到任何配置文件相关的问题思路就会很清晰。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →