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 本章知识结构
下面这张图帮你快速梳理三个动机之间的逻辑关系,以及各自对应的设计关注点。
画图时我把级联动机分为三个分支,每个分支下方又带了两个典型特征。你看,扩展容量重点在独立控制与混搭,并行加速关注IO扩宽和时钟约束,而片选/总线权衡的核心就是引脚代价与故障隔离的取舍。这个图你在方案设计阶段可以贴在墙上,随时对照。