新闻详情

新闻详情

首页 / 资讯中心 / 详情

FPGA烧写和固化还分不清?从bit文件到Flash上电启动一次讲透

发布时间:2026/9/27 5:23:19来源:尧图网络
FPGA烧写和固化还分不清?从bit文件到Flash上电启动一次讲透
做FPGA这些年被问得最多的问题不是“怎么把逻辑写出来”而是“bit文件都生成了下载到板子上能跑断电再上电就白屏怎么办”。答案往往就是一句话你只做了烧写没做固化。Vivado里这两个词经常被混着用但实际是两条完全不同的路径。烧写Program/Configure是把bitstream临时加载到FPGA内部的SRAM配置区掉电就丢主要用来调试固化则是把程序写进外部FlashQSPI Flash、BPI Flash、SD卡等上电后由FPGA自己从Flash加载这才是真正能交付、能批量生产的形态。很多人卡在“为什么我下载没问题一上电就白屏”“为什么烧写Flash报错”“为什么校验失败”本质都是没把这条链路理顺。这篇文章我是按“从原理到操作、从纯FPGA到Zynq再到MicroBlaze、从成功到翻车”的顺序写的。包括flash镜像格式怎么选、Vivado图形界面和Tcl命令怎么配合、Zynq的BOOT.BIN怎么生成、软核场景下bit和elf怎么合并、以及我整理过很久的报错速查表。适合所有用Vivado开发、正在被“烧写/固化”折磨的工程师和学生。1. 先别急着点Program搞清楚你要写到哪里去1.1 临时加载是调试用的断电就没FPGA的配置原理其实不复杂。芯片内部有一块SRAM用来存放LUT、FF、BRAM的配置内容上电后这块SRAM是空的必须把bitstream灌进去逻辑才能跑起来。Vivado的Hardware Manager里点Program Device走的是JTAG口把数据一条一条写进这块SRAM。这个过程很快几秒钟就能看到结果适合每改一次代码就验证一下。但这个模式有两个天然缺陷一是断电后SRAM内容清零重新上电又变回“白屏”二是JTAG口只在调试阶段连着交付给现场的设备不可能拖着一根下载线跑。所以但凡你的板子要脱离电脑独立运行就必须走固化的路子。我见过不少新手开发板调了半个月天天上电都要先插下载线load一下还以为是正常流程其实是绕过了固化这个环节。1.2 固化才是“能出货”的形态固化的本质是把配置文件写到板载的非易失存储器里常见有QSPI NOR Flash、BPI Flash、SD卡、eMMC。上电后FPGA会按照模式引脚M[2:0]的配置主动从Flash里读出配置数据并加载自己完全不需要电脑参与。注意这个“主动加载”是FPGA硬件自带的启动流程不是软件启动所以哪怕你的逻辑里有个时钟都没起来加载过程照样会执行只要Flash里的镜像格式对、启动模式拨对了它就能跑起来。用表格直观对比一下对比项临时加载烧写/调试固化写入Flash存储位置FPGA内部SRAM外部非易失Flash掉电行为丢失重新上电为空永久保存上电自动加载修改方式重新点Program即可需要重新擦除、写入Flash使用场景RTL调试、在线验证产品交付、批量生产、独立运行操作入口Hardware Manager - Program DeviceHardware Manager / SDK / U-Boot所以你的第一步不是打开Vivado乱点而是先问自己我现在是只调逻辑还是要把程序“装”到板子上让它独立跑前者只需要bit流后者必须做固化。后面所有内容都以这个区分为前提。2. 固化前必须搞懂的三个文件格式bit、bin、mcs2.1 bit不是拿来直接写Flash的很多新人第一次固化时直接在Hardware Manager里把.bit文件当成Flash的写入文件用然后发现要么选不了、要么写完上电白屏。原因在于.bit文件是Vivado给JTAG/调试用的原始配置流它头部带了一堆额外信息包括同步字、时间戳、设备ID码、寄存器初始化段这些是为“下载到SRAM”设计的。Flash启动时FPGA要的是从首地址开始连续、紧凑、符合自己启动协议的配置数据所以必须先做格式转换。一句话总结bit是“工程中间产物”bin/mcs才是“Flash能识别的东西”。这个认知能帮你省掉后面一大半的报错。2.2 bin和mcs到底有什么区别bin是纯二进制镜像从Flash起始地址开始一个字节接一个字节的原始数据没有任何帧结构。mcs是Intel Hex格式的变体也被称为HEX记录它把数据按地址分段每段都带地址信息和校验值。换句话说bin是“没地址的裸数据”mcs是“带地址地图的数据包”。从使用场景看用Vivado图形界面固化mcs最省心。你在Add Configuration Memory Device里选择型号时Vivado会自动把bit转成mcs并写入不用手工处理地址。用write_cfgmem命令生成镜像bin更通用。bin文件可以被第三方烧录器、U-Boot、SD卡启动等直接使用尤其是Zynq场景下U-Boot里加载的BOOT.BIN本质就是bin的变体。板卡用的Flash若大于16MB128Mb一般需要带4字节地址模式的bin或mcs普通地址模式会寻址溢出这个后面细说。2.3 版本差异和命名误区Vivado不同版本对配置文件格式的处理差不多但菜单位置变过。2019.2以后SDK逐渐被Vitis替代Hardware Manager的界面也调整过2023.1以后Hardware Manager汉化不到位很多按钮还是英文。这些都不要紧重要的是你脑子里的链路不能乱bit转bin/mcs再写Flash再校验再上电验证。无论工具怎么改这条链永远是死的。3. 纯FPGA固化全流程实操从图形界面到命令行3.1 硬件准备与连接检查先确认几件事下载器是Xilinx Platform Cable USB II还是Digilent HS3/HS2驱动是否装好JTAG链上有没有多个器件板卡烧写时要供上电尤其是配置Bank的电压通常1.8V或3.3V具体看原理图Flash型号要查清楚最好看板卡原理图确认具体型号和封装别靠猜。连接好之后打开Vivado点击Open Hardware ManagerOpen Target正常情况下能看到JTAG链上的设备。如果这里就识别不出来后面全白搭。识别不到的原因八成是驱动、线序或者供电先解决这个再继续。3.2 方法一图形界面烧写mcs最稳但最慢这是我最推荐新手走的第一步因为每一步都有图形提示报错也直观。操作路径是Hardware Manager里右键设备 - Add Configuration Memory Device弹窗里搜索你的Flash型号。以常见的Spansion/Cypress S25FL128、Winbond W25Q128为例选好型号后在Configuration File那一栏填入你的.bit文件。Vivado会自动生成一个.mcs和一个.prm文件然后弹出一个烧写窗口里面默认勾选了Erase、Blank Check、Program、Verify四步。我的建议是默认全勾不要偷懒只选Program和Verify。Blank Check能提前发现Flash里有没有残留的坏块或者锁定位Verify在写完后再读一遍对比数据防止写的瞬间出错。整个流程下来128Mb Flash大概需要几分钟耐心等。烧写完成后把板子断电、重新上电观察你的功能是否正常。如果白屏先别急着怀疑Flash回头检查启动模式拨码开关SPI/QSPI挡位。很多板卡上电不启动不是没写成是FPGA根本没处于“从SPI加载”的模式。3.3 方法二Tcl命令行生成bin批量交付神器图形界面适合单板调试但你要是做了十块板子还要一块块开GUI去点效率太低。这时候建议直接在Vivado Tcl Console里用write_cfgmem一次性生成bin镜像后续检查对着bin的CRC/大小就行。以Artix-7、QSPI x4、Flash容量128Mb为例命令是write_cfgmem -force -format bin -interface spi4x1 -size 128 -loadbit data 0x0 top.bit top_boot.bin逐个参数说-format bin生成二进制镜像要生成mcs就把这里改成mcs。-interface spi4x1Flash挂在哪个接口。Artix-7常见的QSPI Flash如果是x1启动用spi1x1支持x4模式就用spi4x4或spi1x4具体看你的原理图和IP配置。选错接口会导致上电加载时序不匹配白屏。-size 128这个参数的单位是Mb不是MB。128就是128Mb对应16MB。如果你用256Mb Flash就是256别把MB换算进去这是很多人踩的坑。-loadbit data 0x0 top.bit表示从Flash地址0x0开始加载bit文件。如果你的板卡还需要在0x0之前放一段配置头这里可以相应调整地址偏移。生成之后你可以用第三方烧录器如ChipProg、研华等直接把这个bin写进Flash批量产线基本都这么干。或者如果你只有一根JTAG下载线把这个bin给同事让他用Vivado图形界面烧写时选择这个bin文件效果一样。3.4 时钟和DRC报错RTSTAT-2到底在说什么很多人在implement阶段就会遇到一个和固化强相关的DRC报错代码是[DRC RTSTAT-2]。这个报错出现时综合和布局布线结果还在但它会挡住bit生成导致你根本没有可烧的文件更谈不上固化。RTSTAT-2核心问题是Configuration Bank的状态不满足要求。最常见的原因是配置时钟CCLK频率设置得非标、配置Bank电压和CFGBVS引脚的电平不匹配、或者模式引脚对应的I/O标准不对。解决办法是回头检查工程约束里的配置属性set_property BITSTREAM.CONFIG.CONFIGRATE 30 [current_design] set_property BITSTREAM.CONFIG.CONFIGVOLTAGE 1.8 [current_design]第一句把CCLK设成30MHz第二句把配置电压设为1.8V。这两个数值要和你板卡的Flash实际工作电压、你给FPGA配置Bank的供电对得上。如果你的Flash是3.3V供电而这里写成1.8V烧写的时候可能能写进去但上电加载会出错。遇到RTSTAT-2我的排查顺序是先看CFGBVS引脚接法再看配置Bank电压最后看CONFIGRATE是否在5~50MHz之间的标准值。3.5 几个纯FPGA固化的经验技巧第一次烧写前先做一个“最小验证”把板卡拨码开关拨到QSPI模式找一个验证过的bit固化一遍断电上电能跑起来再开始搞你真正的逻辑。这样能区分“固化流程有问题”和“你的工程有问题”。Flash型号一定要选对一个常见翻车现场是板卡用的是S25FL256S但Vivado里搜出来S25FL256L型号后一个字母不同指令集和扇区结构就可能有差异写进去校验通过上电却白屏。选型号时对着原理图、对着Flash丝印、对着Vivado支持的列表一个个核对别嫌麻烦。如果你的Flash容量超过16MBVivado生成镜像时要选带“4 Byte Address”的interface比如spi4x4、spi2x4否则地址高字节写不进去加载时只能访问到低16MB程序跑飞。4. Zynq和MicroBlaze场景下的固化不是同一个玩法4.1 Zynq平台BOOT.BIN才是灵魂Zynq的固化跟纯FPGA有一个本质区别Zynq的启动顺序是先由BootROM代码读取启动设备里的BOOT.BINBOOT.BIN里包含FSBLFirst Stage Boot Loader、PL的bitstream、以及用户应用PS侧的elf。所以你不能像纯FPGA那样只写一个bit进Flash你得把整个BOOT.BIN烧进去。生成BOOT.BIN的路径是先写好FSBLSDK会自动生成一个模板工程然后准备一个bif描述文件用bootgen工具打包。bif内容大致如下the_ROM_image: { [bootloader]fsbl.elf [destination_devicepl]system.bit [destination_cpups7_cortexa9_0]app.elf }然后执行命令bootgen -image boot.bif -o i BOOT.BIN -w on-w on表示强制覆盖同名文件。如果你的工程是Zynq UltraScaledestination_cpu要改成ps0_cortexa53_0如果PL侧不需要逻辑可以不写system.bit那一行。注意BOOT.BIN里的顺序是有讲究的FSBL必须写最前面否则BootROM识别不了。4.2 把BOOT.BIN写进QSPI的三种路径Zynq烧写BOOT.BIN的方式比纯FPGA多种我按推荐程度排序。第一种用Vivado Hardware Manager直接烧QSPI Flash。在Hardware Manager里选中Zynq的PL设备或者PS设备节点Add Configuration Memory Device选你板上的QSPI型号然后选择BOOT.BIN作为烧写文件。这种方式最简单但速度慢适合小批量。第二种用XSCT工具走JTAG间接烧写。在Vivado的XMD/XSCT下先把FSBL加载进DDR再通过FSBL的驱动把PC端的镜像写到QSPI。SDK里有一个Program Flash向导选好FSBL、选好BOOT.BIN它会自己走这个流程。这种方式比直接写Flash可靠因为Flash接口时序由FSBL初始化好了不会出现PN电压不匹配的问题。第三种用U-Boot烧写适合批量产线和现场升级。板子先在SD卡/QSPI里跑起来U-Boot然后通过tftp从服务器拉BOOT.BIN在U-Boot命令行执行setenv ipaddr 192.168.1.10 setenv serverip 192.168.1.100 tftp 0x03000000 boot.bin sf probe 0 0 0 sf erase 0x0 0x400000 sf write 0x03000000 0x0 0x400000注意sf erase的地址和大小要和sf write一致文件多长就擦多长不要贪多也不要少擦。擦除长度算错是最常见的“烧完还是旧程序”的根源因为新程序写了但没覆盖干净老代码残留在后半段。4.3 串口烧写失败到底该查什么热词里有个“串口烧写失败”我猜你遇到的情况多半是通过U-Boot的串口命令行执行烧写或者通过SDK的Program Flash串口模式传输镜像结果传一半卡死、或者校验失败。先说结论串口只适合看打印不适合传大文件能走网络就走网络。如果是U-Boot下用loadb/loady从串口接收然后写Flash先看波特率是否匹配115200是默认但有人改过环境变量就没同步过来。再看PC端串口工具是否占用了COM口多个工具同时打开会导致数据字节被截断。最后是流控DTR/RTS开不开会影响部分USB转串口芯片的行为导致写入的镜像和原文件比对不一致。如果是SDK的Program Flash通过JTAG串口组合操作失败多发生在加载FSBL之后串口跳线没切换PC端没有正确选择对应端口。总之烧写镜像的文件完整性是第一位的建议烧完后用sf read把Flash内容读回来做个md5sum和PC端文件比对一致性是王道。4.4 MicroBlaze软核场景updatemem把elf合并进bitMicroBlaze这种软核真正跑起来的程序除了FPGA逻辑还有一段软核要执行的C代码。裸机时代码在BRAM/DDR里如果把bit单独固化上电后MicroBlaze里是空的把elf单独固化FPGA逻辑没有代码无处运行。所以要先合并。Vivado工程里会生成一个MMI文件memory map file记录BRAM在系统地址空间的映射。用updatemem命令把elf嵌进bitupdatemem -meminfo system.mmi -data app.elf -bit system.bit -proc system_i/microblaze_0 -out download.bit从Vivado 2018.3及之后版本一直可以用。合并完后把download.bit按前面第3章的流程转成bin/mcs烧进Flash。上电后MicroBlaze会自动从BRAM起始地址取指执行。有人会问为什么不用bootgen直接打包elf和bit因为纯FPGA的启动机制不解析elf软核程序的入口地址必须通过MMI映射写死在配置流里。4.5 PL-only和PS-only烧写的区别很多人分不清“PL程序烧写”和“PS烧写”。PL可编程逻辑烧写就是普通FPGA固化的流程把bit转bin/mcs写Flash全程不涉及Linux/U-BootPS处理系统烧写在Zynq上通常指把FSBL、U-Boot、内核、rootfs等写到SD卡/eMMC/QSPI里。如果你只有PL逻辑不需要在Flash里塞内核那就不要用BOOT.BIN直接用纯FPGA的流程即可。如果你要Linux跑起来BOOT.BIN只是启动链的第一环后面的image.ub、rootfs也要正确落盘任何一个环节缺了都起不来系统。5. 烧写报错排查速查表与我的避坑经验5.1 “检测不到设备”和“IDCODE不匹配”的排查这是最靠前的一道关。JTAG链上识别不出设备检查顺序是下载器供电是否正常Platform Cable USB II经常因为USB口供电不足导致灯都不亮JTAG连接线是否插反TCK/TMS/TDI/TDO一一对应板卡是否有独立供电Windows下设备管理器里有没有识别到下载器设备Digilent的要装ADEAdaptive Digital Entertainment? 不对是Adept RuntimeXilinx的要看驱动装好没有Linux下用lsusb看有没有对应USB设备。IDCODE不匹配通常是JTAG链上接触不良或者你选的器件型号和板卡实际芯片型号不一致。排查方法就是看Hardware Manager里扫描到的IDCODE和芯片datasheet上的JTAG ID是否一致。不一致的话大概率是线没接好或者板卡上有其他器件干扰也可能是下载线质量太差换根好的线立马解决问题。5.2 Flash校验失败和型号选错的典型症状烧写过程中Program通过Verify失败是最迷惑人的情况。我遇到过的原因按概率排序Flash型号选错导致扇区大小、写命令时序不匹配。Vivado写入时用的是它认为的扇区结构实际芯片扇区不一致写进去的数据自然对不上。Flash的WP写保护引脚没有被拉高。很多板卡把WP默认接地导致芯片处于保护状态读出来全是FF校验必挂。看原理图确认WP和HOLD引脚有没有被正确上拉。CCLK/写入时钟太高。图形界面烧写时默认不让你改但通常15MHz以下更安全。如果Flash是老型号写太快会丢位。板卡电源纹波大写入瞬间电压跌落导致数据位错乱。这个在产线上最常见换个稳定的适配器就好了。5.3 上电不加载DONE不拉高的几种原因固化完成后上电白屏这是“烧写成功但启动失败”。先从硬件上量DONE引脚如果上电后DONE一直是低说明FPGA根本没能完成配置加载。常见原因启动模式拨码开关拨错位置FPGA没有选择QSPI启动模式而是等了JTAG或者选了别的无效模式。7系列常见Master SPI模式对应的M[2:0]组合取决于板卡设计一定要对着原理图核对不要凭记忆。Flash布局和生成镜像时的interface不匹配。你生成bin时用的spi4x4但板子的Flash只接了x1或者反过来。重新按硬件实际连接生成正确的bin。bitstream里配置了加密或DCI模式Flash加载时序和普通模式不一样需要专门的配置头没有配置头就会卡住。5.4 常见问题速查表现象大概率原因排查/解决办法Open Target搜不到设备下载线驱动、USB供电查驱动、换USB口、换线IDCODE不匹配JTAG接触不良重新插拔检查TDI/TDOImplement报DRC RTSTAT-2配置Bank电压/CFGBVS/时钟非标设CONFIGRATE和CONFIGVOLTAGE核对引脚烧写Flash慢到怀疑人生使用图形界面写大容量Flash改用write_cfgmem出bin产线走烧录器Verify失败型号错、写保护、时钟太高核对型号、查WP/HOLD、降速上电白屏且DONE低启动模式拨错、镜像接口错拨码开关查原理图重新生成镜像U-Boot下sf probe失败Flash未上电或qspi驱动未初始化确认电源先执行qspi init或dm probe串口烧写卡死波特率/流控/端口占用统一波特率关闭无关串口工具禁用流控Zynq烧完BOOT.BIN不起机BIF顺序错、FSBL缺失核对BOOT.BIN内部顺序重新bootgen5.5 比报错更可怕的“假成功”还有一种情况最坑固化时报All Operations Completed断电上电功能也正常但过了几天批量产的时候发现有一小部分板子不行。这种“假成功”多半是写入时序余量不够或者Flash型号混料同一丝印批次不同。我的建议是少量调试时可以用图形界面慢慢写但一旦要量产所有镜像必须用write_cfgmem统一生成参数固定同时在产线上增加Verify步骤不要省。省一次的代价是批量返工。另外提一个容易被忽视的点Flash也有擦写寿命反复烧写调试时最好轮流用几块板卡别逮着一块使劲造。QSPI NOR的擦写次数通常是十万次级别但频繁整片擦除还是会有损耗特定扇区写多了会坏。调试阶段建议只在0x0开始的镜像区域操作别动不动全片擦除。6. 最后分享几个我自己的土办法做到现在这个阶段大部分问题你都应该能自己定位了。我最后再啰嗦几句实操层面的习惯都是踩过坑换来的。第一工程里永远保留一条Tcl脚本把bit生成和bin生成串起来。改完代码跑一遍脚本自动输出top_boot.bin。这样无论你后面是用图形界面、第三方烧录器还是U-Boot升级手里的镜像都是最新的不会出现“烧的是昨天的旧程序”这种笑话。第二板子上的启动模式拨码开关一定要画在原理图阶段就想好。量产板建议做两个版本开发板可以保留拨码交付板直接焊死到QSPI模式省去现场误拨开关导致设备起不来的麻烦。第三Zynq场景长期维护建议维护一个工程目录把每一次烧写的BOOT.BIN、对应bif文件、改动说明存成一个带时间戳的文件夹。固化这块出问题最难排查的就是“到底哪个镜像对应哪次改动”目录整理清楚了五分钟就能定位。我个人几年的经验是绝大部分固化问题都不是FPGA难为你而是文件格式、启动模式、硬件连接这三件事没对齐。把这三件事当常识记在心里烧写固化这事真的就“看这一篇就够了”。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

天空西游引擎实战:jsc 解密与客户端秘钥提取 2026/9/27 6:17:37

天空西游引擎实战:jsc 解密与客户端秘钥提取

天空西游引擎实战:jsc 解密与客户端秘钥提取 引言 天空西游(西游类商业端)在手游架设圈的地位很特殊:商业端功能全、双端齐,但它的客户端逻辑被编译加密成 jsc 文件,直接打开全是乱码——想改 IP、改配置&…

阅读更多 →
可做产品预售的网站对比评测:避开挂马陷阱的UI与代码实战 2026/9/27 6:17:37

可做产品预售的网站对比评测:避开挂马陷阱的UI与代码实战

可做产品预售的网站对比评测:避开挂马陷阱的UI与代码实战 昨晚接到一个客户电话,声音都在抖:“网站被黑挂马了,首页全是博彩广告,流量全废了,不知道怎么办?” 我让他先别慌,把服务器日志发过来。…

阅读更多 →
贝加莱PLC电机调试五步法:从AS4.10报错到稳定运行 2026/9/27 6:17:31

贝加莱PLC电机调试五步法:从AS4.10报错到稳定运行

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
数学建模降落伞选择:参数估计与约束优化实战 2026/9/27 6:17:31

数学建模降落伞选择:参数估计与约束优化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
外贸公司经营范围大全:避坑指南与建站注意事项 2026/9/27 6:17:25

外贸公司经营范围大全:避坑指南与建站注意事项

外贸公司经营范围大全:避坑指南与建站注意事项 改个需求建站公司拖一周,这种憋屈感谁懂?我见过太多初创外贸团队,因为前期没把 外贸公司经营范围大全…

阅读更多 →
点云Transformer全解析:从自注意力原理到PointTransformer V1/V2/V3实战选型 2026/9/27 6:17:24

点云Transformer全解析:从自注意力原理到PointTransformer V1/V2/V3实战选型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉