配置 Flash 容量怎么选:从比特流字节数到 QSPI/BPI 选型与配置时间估算
很多人第一次自己画 FPGA 板子,选配置 Flash 的方法是「照着开发板抄一颗同容量的」。开发板能抄对,是因为它的 FPGA 型号、比特流规模和你恰好一样的概率极低——一旦器件换大一号、逻辑塞满、或者产品要求在线升级,「差不多大」的 Flash 就会在最尴尬的时刻(量产前、现场升级时)暴露问题。本篇回答的核心问题就是配置 Flash 容量怎么选:先搞清楚要存的比特流到底多少字节,再乘上镜像份数与余量,最后用配置时间反推总线位宽和速度等级。
本篇是 FPGA 配置机制簇的容量/带宽分册:配置通道与主从模式见 FPGA 配置方式有哪几种,上电时间轴见 FPGA 上电配置时序,golden/update 双区机制见 FPGA 在线升级与 multiboot,烧录操作步骤见 FPGA 入门 32:比特流下载与固化。
这张对比卡是全篇的结论先行:左栏不是假想的稻草人,而是无数第一版板子的真实做法——功能调通、单份镜像烧进去能启动,于是选型被默认通过,直到第一次远程升级或器件升级才还债。右栏多出来的不是浪费,而是给「镜像会变大、升级会失败、器件会换代」这三件必然发生的事预留的位置。
本文要回答的问题
- 比特流大小由什么决定?为什么同一颗 FPGA,不同工程烧进去的字节数也不同?
- 真实的字节数去哪查?数据手册和实现工具报告分别看哪张表、哪一行?
- 单镜像、golden/update 双镜像、元数据各占多少,容量余量留多少才算够?
- x1/x2/x4 与 BPI 并行总线怎样影响上电配置时间,Flash 速度等级怎么和 CCLK 配合?
- bitstream compression 能省多少,为什么压缩了反而可能配置得更慢?
一、选错 Flash 会怎样:三种典型麻烦
先讲「不按方法选」的后果,后面所有计算都是为了避开它们。
第一种:容量差一点点,镜像烧不进去。 这是最直接的形态。比特流文件随工程迭代单调增长——今天刚好用满 16 Mbit(2 MB)的器件,下一版加了协议栈或换了更大的 FPGA 封装兼容型号,比特流长出几十 KB,烧录工具在写满整片后报地址越界。SPI NOR Flash 的密度是跳档供应的(常见 16/32/64/128/256 Mbit……),没有「大一点点」的料,补救要么换料改 BOM、要么临时砍功能。
这里必须先排掉一个经典单位坑:Flash 厂商标称常用 Mbit(兆比特),比特流文件大小常用 MB 或 MiB(兆字节),两者差 8 倍。256 Mbit 的 Flash 只能装 32 MB 数据。把 Mbit 当 MB 读,是「抄开发板选型」最常见的翻车方式。
第二种:装得下,但启动慢到不能接受。 容量够不代表带宽够。同样的比特流走 x1 单线和 x4 四线,搬数时间相差接近四倍。对「上电即工作」的设备(电机保护、流水线控制、车载模块),配置时间往往有硬性上限,选了低速等级的 Flash 又只接 x1,启动时间可能从预期的几百毫秒变成数秒。
第三种:单区装得下双镜像,却没有分区的地址空间。 做在线升级时,golden 与 update 两份镜像物理隔离是硬性要求(机制见 multiboot 篇),两份镜像加元数据至少是单镜像的两倍出头。Flash 贴着单镜像选的板子,到要做远程升级时才发现连「变砖安全绳」的空间都没有,只能整机召回。
二、比特流大小由什么决定
要算 Flash 容量,先得知道要装的东西多大。比特流不是设计文件的压缩包,而是 FPGA 内全部配置存储单元的 0/1 映像按帧排列而成,所以它的大小首先由芯片本身的配置点总量决定,其次才由工程内容影响。
| 决定因素 | 怎么影响比特流大小 | 选型时的含义 |
|---|---|---|
| 器件规模(LUT/FF/BRAM/DSP 数量) | 配置点总量随资源规模增长,是比特流大小的主项 | 换大一号 FPGA,先查新器件的比特流长度,别默认 Flash 还够 |
| 配置帧结构(帧长 × 帧数) | 厂商按行列组织配置帧,帧内有固定开销位,未用资源也在帧里 | 比特流大小基本由器件定,与工程是否「只用了一半 LUT」几乎无关 |
| BRAM 初始值/嵌入式处理器固件 | 部分器件把存储初始化内容放进比特流 | 片内 RAM 初始内容多、软核固件大,文件会明显增大 |
| 配置选项(压缩、加密、总线宽度预设) | 压缩与加密改变最终落 Flash 的字节数 | 选型计算必须按「实际选项生成的文件」而非原始长度 |
| 文件封装格式 | .bit 带头部信息,.bin/.mcs 是烧录形态 | 估算容量以实际烧进 Flash 的数据长度为准,不要直接看 .bit 文件大小 |
关键认知是第二条:比特流长度主要是器件属性,不是工程属性。你的设计只占用了 30% 的 LUT,比特流也不会缩短到 30%——因为每一帧的结构由芯片行列尺寸决定,未使用的配置位照样要被写成默认值。工程内容主要通过 BRAM 初始值、是否压缩等次要因素让字节数在器件基准值附近浮动。
所以「比特流多大」不能问同系列的别人,必须查你这颗具体型号的数据,下一节讲查表路径。
三、真实字节数去哪查:手册表与工具报告两条路
任何凭印象、凭开发板、凭网传数字的容量估算都不可靠,真值只有两个权威来源。
来源一:器件数据手册/配置用户指南的 Configuration 章节。 主流厂商的数据手册在配置相关章节都有一张按器件型号逐行列出配置参数的表,表里会给出每个型号的配置帧长度、总帧数或直接给出比特流长度(不同家族列名不同,常见写法是 configuration bits、bitstream size 之类)。查表时注意三点:确认是你所用精确型号与封装温度档对应的行(同家族不同密度行不同);确认单位是 bit 还是 byte;留意脚注里是否已包含配置命令与填充字节,没有的话要自己加上这部分开销。
来源二:实现工具生成比特流后的报告。 比特流生成步骤(Vivado 的 write_bitstream、Quartus 的 Assembler)完成后,日志与报告中会打印本次产物的大小;工具同时会给出压缩选项开启前后的对比信息。这是对你这颗器件、这份工程、这套选项最精确的字节数,也是容量计算应该采用的输入。.bit 文件头部有若干字节的头信息(字段随工具版本变化),不写进 Flash 的部分要扣除;最终以烧录文件(.bin 或转换后的 .mcs)长度为准。
读这张决策流程图跟随颜色:灰色是入口,蓝色是信息收集与预算动作,两个红色节点是必须做的分叉判断(要不要在线升级、配置时间够不够),橙色是选定密度档与提速动作,绿色是定型。下面四节逐一展开图里的每一步算法。
四、容量预算:单镜像、双镜像与余量
把 Flash 上要存放的内容逐项列出,容量需求是一个求和问题,而不是一个感觉问题。
| 组成 | 字节数取值 | 单镜像板 | 双镜像板 |
|---|---|---|---|
| 工作镜像 | 烧录文件实际长度 B | 1 份 | 1 份(update) |
| 黄金镜像 | 通常刻意做小,但按最坏情况取全长 B | 不需要 | 1 份(golden) |
| 镜像间隔离与扇区对齐填充 | 每个分区边界向上对齐到擦除扇区产生的间隙 | 少量 | 两处边界都要留 |
| 元数据区(版本号/CRC/计数) | 至少一个独立擦除扇区 | 不需要 | ≥1 扇区,建议双副本轮换 |
| 增长余量 | 工程迭代与器件兼容换型的空间 | ≥20% | ≥20% |
双镜像的算术结论很硬:需要 multiboot 的板子,Flash 容量预算至少是 2×B 起步,再叠加扇区对齐间隙、元数据扇区和增长余量,实际选型常落在 2.3–2.5 倍 B 附近。golden 镜像虽然可以刻意裁剪(只留通信口和 Flash 写控制),容量估算时仍建议按全长预留——这样未来 golden 功能调整不会反过来挤压分区表。分区地址的扇区对齐、golden 必须落在默认起始地址等设计纪律,见 FPGA 在线升级与 multiboot。
余量除了给工程迭代,还有两个隐蔽用途:一是引脚兼容的器件换型,同封装升级更大 FPGA 时比特流会变长,Flash 若同板更换更大密度档即可不动 PCB;二是压缩选项的回退空间,万一未来某版工程压缩效果差或需要关闭压缩,未压缩镜像也要放得下。
对 BPI 并行 NOR 还有一个额外检查项:FPGA 侧 BPI 地址总线的可寻址范围必须覆盖 Flash 全容量。地址线根数在器件族层面有上限,选了远超寻址范围的大 Flash,高地址扇区永远读不到。SPI 模式没有这条限制(地址随命令串行发送),这也是新设计偏向 QSPI 的原因之一。
五、带宽与配置时间:位宽、CCLK 与速度等级
容量解决「装不装得下」,带宽解决「多久能装好」。一次配置的纯搬数时间可以用一个简单算式估算:
配置时间 ≈ 镜像字节数 × 8 ÷(CCLK 频率 × 每拍有效位数)算式本身是普适的;下面给一个纯算术示例,数字均为假设,不对应任何真实器件:假设实现报告给出烧录文件长度 B = 4 MiB,配置时钟 CCLK = 50 MHz,SPI x4 模式每个有效时钟拍传 4 位,则搬数时间约为 4 × 1048576 × 8 ÷(50 × 10⁶ × 4)≈ 0.17 秒;同一镜像改走 x1,则约 0.67 秒。实际配置时间还要加上清存储器、命令/等待周期、CRC 校验与 STARTUP 序列的固定开销,所以算式用于横向比较与上限估算,不要当成精确预测;真实总时长以上电实测为准,逐拍时间轴见 FPGA 上电配置时序。

按这张思维导图逐项压榨配置时间。关于「每拍有效位数」有两个工程细节:其一,QSPI 启动时控制器通常先以 x1 发读命令与地址、再切换到 x4 连续读数据,命令相位不享受四倍带宽,所以 x4 的实际加速比略小于 4,镜像越短固定开销占比越高;其二,x2/x4 模式在比特流生成选项里声明(同时约束 FPGA 发出的读命令与引脚接法),选项与板级接线必须一致,接了四线 Flash 却按 x1 生成镜像,带宽白白浪费。
CCLK 能不能往上提,受两个条件钳制。Flash 速度等级是标称的最高可靠时钟频率(不同厂商标注方式不同,常见以可支持的最大 MHz 或后缀数字表示),Flash 跑在超出等级的时钟下会出现读取误码,表现为偶发、温度相关的 CRC 失败。选型时让 Flash 标称频率覆盖你打算使用的 CCLK 档位,并留裕量。板级信号完整性是第二个条件:CCLK 和四线数据是上电阶段最早翻转的高速信号,走线无参考平面、飞线过长会逼着你降速换稳定。工业级、车规场景还要同时核对温度等级与擦写寿命(P/E cycles):普通 SPI NOR 的十万次量级擦写对「每天升级一次」绰绰有余,但元数据区若按页频繁追加写入,要单独核算磨损。
六、压缩:省的是容量,不一定省时间
主流厂商的比特流生成步骤都提供压缩选项(bitstream compression)。原理是配置数据里存在大量规律模式(大片默认值、重复帧),压缩后落盘字节数明显变小,FPGA 配置控制器内部带有解压电路,读入压缩流时在芯片内部实时展开再写配置帧——Flash 里全程只存压缩形态,不需要任何外部器件参与解压。
关于压缩能省多少,本文只给定性结论:压缩比随设计内容波动,没有固定数字。未用资源多、初始化数据规律的工程压缩效果显著;初始内容随机(如软核固件、随机查找表)占比高的工程压缩效果有限。选型时唯一正确的做法是:用开启压缩后工具报告里的实际压缩字节数重新代入第四节的容量算式,而不是采用任何经验比例。
更反直觉的是压缩与配置时间的权衡:压缩让要搬的字节变少,却引入了解压环节。配置控制器每个时钟拍能吐出的解压后数据位数有上限,当总线带宽(x4 + 高 CCLK)远大于解压吞吐时,瓶颈会从 Flash 读取转移到片内解压,配置时间不再随位宽线性改善,极端情况下压缩镜像的配置时间甚至可能略高于未压缩镜像。因此决策顺序应是:容量紧张时开压缩救容量;带宽紧张时实测开/关压缩两种配置时间,以实测数据为准,不要默认「文件小就一定启动快」。
七、工厂烧录与现场升级:两种生命周期对选型的不同要求
同一片 Flash,在产品生命周期不同阶段面对的约束完全不同,选型时要两头都照顾到。
| 维度 | 工厂烧录(产线) | 现场升级(在役设备) |
|---|---|---|
| 执行者 | 烧录器/治具,可整片擦写 | 板上 FPGA 逻辑自己擦写 |
| 耗时敏感度 | 低,节拍按秒计可接受 | 高,升级窗口与断电风险都要考虑 |
| 擦除扇区/页编程的影响 | 直接决定烧录节拍:整片擦除加分扇区分页编程耗时随容量上升 | 影响升级耗时与掉电窗口,但不影响每次上电启动——启动只读不擦写 |
| 失败恢复 | 治具重烧即可 | 必须靠 golden/update 双区与 fallback 兜底 |
| 对 Flash 的额外要求 | 通用标准指令、主流烧录器支持,便于贴片前预烧 | 同型号全生命周期供货、元数据扇区、支持应用侧擦写命令 |
表中第三行是初学者最常混淆的一点:Flash 的扇区擦除时间、页编程时间只影响「烧写」动作,完全不影响「启动配置」。上电时 FPGA 只执行读操作,读访问时间由速度等级决定,擦写快慢与启动时间无关。现场升级场景下,擦写时长的真正意义是定义了「半截掉电」风险窗口的长度——窗口越长越要靠双区布局保护,这与第五节的带宽计算是两套独立算术。
工厂侧还要考虑预烧流程:贴片前用通用烧录座预烧的产线,倾向选指令集标准、烧录器原生支持的主流型号;贴片后经板载 JTAG 烧录的产线则要确认烧录夹具与 FPGA 侧烧录端口。现场侧则要求 Flash 型号供货周期覆盖产品维护年限,避免几年后换料时分区表、页大小、命令集对不上而被迫改固件。
最后给一份可直接用于原理图评审的选型核对清单:
- 烧录文件实际字节数 B 已从工具报告抄录,单位 bit/byte 已核对;
- 容量 ≥(镜像份数 × B + 元数据 + 对齐间隙)× 1.2,且标称档(Mbit)换算无误;
- multiboot 双区地址空间已在 Flash 地址图上画死,边界按扇区对齐;
- 比特流选项中的 x1/x2/x4 与原理图接线一致,Flash 速度等级覆盖目标 CCLK 并留裕量;
- 已按第五节算式估算最不利情况下的配置时间(含压缩开/关两版);
- BPI 模式已核对 FPGA 地址线根数覆盖全容量;
- 温度等级、擦写寿命、供货周期满足产品寿命要求。
这一篇在知识体系里的位置
本篇属于 FPGA 配置机制簇,只负责「Flash 容量、带宽与配置时间计算」这一个决策面。配置通道(JTAG/Master SPI/BPI/SelectMAP)的主从机制与引脚差异,读 FPGA 配置方式有哪几种;从上电、POR 到 DONE/STARTUP 的逐拍时间轴,读 FPGA 上电配置时序;双区 Flash 布局、WBSTAR/IPROG 跳转与 CRC 失败回退,读 FPGA 在线升级与 multiboot;生成 .bit/.mcs 与 Hardware Manager 烧录的操作步骤,读 FPGA 入门 32:比特流下载与固化;烧不进去、Flash 自启动失败的现场排查,读 Flash 启动失败复盘;产线烧录夹具与量产组织,读 FPGA 量产与烧录。
总结
配置 Flash 容量怎么选,答案是一条完整的计算链:先从数据手册 Configuration 表取器件基准、再用比特流生成报告确认你这份工程在实际选项下的烧录字节数(比特流长度主要由器件规模与帧结构决定,未用资源不会让它变短,且务必区分厂商标称的 Mbit 与文件的 MB);容量按「镜像份数 × 字节数 + 元数据扇区 + 扇区对齐间隙,再留两成以上余量」求和,需要在线升级就按 golden/update 双镜像 2 倍起步;配置时间用「字节数 × 8 ÷(CCLK × 每拍有效位数)」估算,靠 x4 位宽、更高 CCLK 和匹配的 Flash 速度等级压缩;bitstream compression 由 FPGA 内部电路实时解压、只省容量不一定省时间,压缩后必须按报告实测字节数和实测配置时间复核;最后记住擦除扇区与页编程只影响烧写、不影响只读的启动过程,并让 Flash 的供货周期与双区布局覆盖设备的整个维护生命周期。