3. 多片级联的动机:扩展容量、并行读取加速、独立片选与共享总线权衡

聊到多片QSPI Flash级联,很多人第一反应就是“为了更大容量”。没错,这是最直接的需求。但如果你只这么想,那可能会错过更重要的设计考量。实际项目中,我见过不少方案写着“为了省成本把两片拼在一起”,结果读性能反而不如单颗,调试还多花了两周。嗯,这背后其实藏着好几个动机,而且每个动机都对应着完全不同的电路结构和控制策略。

我个人习惯把级联动机分成三类:容量扩展、并行加速、独立片选与总线共享的权衡。这三类没有好坏,但应用场景差别很大。下面我们一条条拆开讲。

3.1 扩展容量:最朴素的动机

单颗QSPI Flash容量上限摆在那。市面上主流器件最大也就2Gb(256MB),再大就要换协议了。但有些场景,比如FPGA配置存储、固件备份日志、GUI素材库,动不动就要512MB甚至1GB。怎么办?级联。

最简单的做法是共用QSPI总线,通过独立片选信号(CS#)来区分芯片。举个例子:你手头有4片128MB的Flash,每片一根CS#接到FPGA的GPIO。读写时,先拉低目标片的CS#,然后通过同一组IO发送指令。操作完再拉高。

这种方案的好处是——电路改动极小。我曾在某款工业相机项目里就是这么干的,需求是存30秒的全高清视频循环缓冲区,单颗实在装不下。四片128MB搞定,BOM成本只多了三颗Flash的钱,PCB面积也没增加多少。

关键点:容量扩展模式下,QSPI总线的时钟频率、IO宽度都不变。性能瓶颈不在Flash,而在片选切换的延迟。如果你频繁交错操作不同片,CS#的建立/保持时间会吃掉不少带宽。

3.2 并行读取加速:追求吞吐量

有时候你需要的是更快的读取速度,而不是更大的容量。比如,FPGA要从Flash加载配置,传统单颗QSPI只能跑四线,算一下:200MHz时钟,四线DDR,理论顶天也就200MB/s。但有些高速FPGA要求配置加载速度超过400MB/s。怎么办?并行读取。

把多片Flash的IO并联,组成更宽的数据位宽。例如,两片四线Flash并联就是8位,四片并联就是16位。读取指令同时发给所有芯片,数据通过同一组IO并行打出。这样带宽翻倍甚至翻四倍。

我记得有个SSD控制器项目,需要XIP(eXecute In Place)执行代码。单颗QSPI的随机读延迟和带宽都拖后腿。设计团队把两片128Mb Flash并联成8位总线,时钟跑150MHz,实际读吞吐量从75MB/s飙到150MB/s。配合缓存预取,CPU几乎感觉不到Flash的存在。

警告:并行读取有个大坑——所有芯片的IO必须同进同出,指令和数据完全同步。这就对时钟偏斜、PCB走线等长提出了要求。我曾经有个项目,因为两片Flash的DQ线长度差了3cm,结果高速模式下数据毛刺不断,降频才稳。后来全部等长布线才解决。

3.3 独立片选 vs 共享总线:核心权衡

这两个方案是级联设计里绕不开的选择题。说白了,你要在“灵活性”和“引脚代价”之间做取舍。

3.3.1 独立片选方案

每片Flash各自独占一根CS#线。控制器有多少个占用GPIO?取决于片数。这种方案的好处是:

  • 芯片之间完全隔离,指令独立发送,互不干扰
  • 支持不同容量、不同厂商的器件混用
  • 单颗故障不影响其他芯片操作

代价是:FPGA或者MCU的引脚资源吃紧。一个8片级联的方案,光片选就要占8个GPIO。再加上QSPI本身四根IO线,整套下来12个引脚。有些小封装芯片根本扛不住。

3.3.2 共享总线方案

所有Flash共用一组QSPI总线(IO0-IO3,CLK,CS#)。注意这里的CS#也是共用的。那么如何区分操作对象?靠软件协议。比如发指令时在前面加地址头,或者用菊花链模式。

好处显而易见——引脚开销极小,无论几片Flash,固定6根线(四线模式)搞定。但代价也不小:

  • 所有芯片同时响应同一个指令,无法独立操作
  • 如果有芯片损坏,整个QSPI总线都可能故障
  • 由于没有片选隔离,上电初始化时序要格外小心

我的建议:如果项目对引脚数量敏感(比如TQFP封装),而且所有Flash容量、型号一致,用共享总线方案会更省资源。但如果你需要在线更新其中一片、同时保留其他片的数据,那独立片选更保险。

3.4 三种方案的对比一览

我整理了一个表格,方便你在方案选型时快速对比:

对比维度 容量扩展(独立CS) 并行读取(并联IO) 共享总线(无独立CS)
核心目的 增加存储容量 提升读取吞吐率 节省引脚
引脚开销 高(每片+1 CS) 中(IO线翻倍) 低(固定6根)
读写性能 单颗单颗操作,总带宽不变 多片并行,带宽倍增 单颗操作,无带宽增益
灵活度 高(可混搭不同型号) 低(所有芯片必须一致) 中(必须统一协议)
典型场景 固件备份、日志存储 高速配置加载、XIP执行 低成本小系统
故障隔离能力 强 弱(一片故障影响全局) 弱(总线故障全挂)

你从表格能看出来,每种方案都有明确的取舍。举个例子,我在做嵌入式AI推理加速器时,需要同时存多个模型。独立CS方案让可以随时切换加载不同芯片上的模型,而不用擦写整个Flash。但如果追求极致读吞吐,我一定选并联IO方案。

3.5 本章知识结构

下面这张图帮你快速梳理三个动机之间的逻辑关系,以及各自对应的设计关注点。

多片QSPI Flash级联动机 级联动机 扩展容量 并行读取加速 片选 & 总线权衡 独立CS控制 混搭不同型号 IO并联扩宽 同步时钟约束 节省GPIO资源 故障隔离弱 选择哪种动机,取决于你的核心瓶颈 是容量、带宽还是引脚。没有银弹。

画图时我把级联动机分为三个分支,每个分支下方又带了两个典型特征。你看,扩展容量重点在独立控制与混搭,并行加速关注IO扩宽和时钟约束,而片选/总线权衡的核心就是引脚代价与故障隔离的取舍。这个图你在方案设计阶段可以贴在墙上,随时对照。