2、NAND Flash 选型(上):SLC/MLC/TLC/QLC 区别与寿命,Page/Block/Plane 结构,读写擦除特性,我踩过的坑:误用TLC做代码存储
大家好,我是老周。今天咱们聊聊NAND Flash选型的上半部分。
说实话,NAND Flash这玩意儿,看着简单,坑是真不少。我见过太多工程师,拿着数据手册随便一翻,选个便宜的TLC就往上怼,结果产品出货三个月,批量返修。嗯,我自己也干过这种蠢事,后面会讲。
2.1 SLC/MLC/TLC/QLC:一字之差,天壤之别
先搞清楚这四种闪存单元的区别。说白了,就是每个存储单元能存几个bit。
- SLC(Single-Level Cell):1个单元存1bit。只有0和1两种状态。
- MLC(Multi-Level Cell):1个单元存2bit。有00、01、10、11四种状态。
- TLC(Triple-Level Cell):1个单元存3bit。八种电压状态。
- QLC(Quad-Level Cell):1个单元存4bit。十六种电压状态。
你想想看,电压状态越多,区分起来就越困难。就像考试,SLC是及格/不及格,MLC是ABCD四档,TLC是八档,QLC是十六档。档位越多,判卷老师越容易看花眼。
这直接决定了它们的寿命和性能。我整理了一个表,大家存一下:
| 类型 | P/E擦写次数(典型值) | 读取速度 | 写入速度 | 成本 | 典型应用 |
|---|---|---|---|---|---|
| SLC | 5万~10万次 | 最快 | 最快 | 最高 | 军工、工业控制、代码存储 |
| MLC | 3000~10000次 | 较快 | 较快 | 中等 | 消费级SSD、高端U盘 |
| TLC | 1000~3000次 | 一般 | 较慢 | 较低 | 普通SSD、大容量存储卡 |
| QLC | 100~1000次 | 慢 | 很慢 | 最低 | 归档存储、冷数据 |
核心结论:SLC的寿命是TLC的50~100倍。这不是线性差异,是数量级的碾压。
为什么会这样?因为每次擦写,电荷穿过氧化层,都会对绝缘层造成损伤。SLC只需要区分两个电压,电压窗口大,损伤容忍度高。QLC要区分十六个电压,窗口窄得像刀锋,稍微有点磨损就读不准了。
2.2 Page/Block/Plane:NAND的三层结构
搞懂了单元类型,还得理解NAND的物理组织方式。很多新手栽跟头,就是没搞明白这三者的关系。
- Page(页):读写的最小单位。一般是4KB、8KB或16KB。你想读一个字节?不行,必须整页读出来。
- Block(块):擦除的最小单位。一个Block包含64页、128页或256页。一般是512KB或1MB。
- Plane(平面):多个Block组成一个Plane。一个Die通常有2个或4个Plane。Plane之间可以并行操作。
我打个比方。Page就像一本书的一页纸,你只能整页翻看。Block就像一章,你想撕掉一章,必须整章撕掉。Plane就像书的上下册,两册可以同时翻看。
这里有个关键点,我在项目中遇到过不止一次:写之前必须先擦除。你不能直接覆盖写,必须先把整个Block擦成全1,然后再写。而且擦除次数有限,这就是P/E cycle的由来。
个人习惯:我每次选型,都会先确认Page大小和Block大小。如果我的日志系统每次只写几十个字节,但Page是16KB,那每次写都要先读整页、改数据、再写回去。效率极低,还浪费寿命。
2.3 读写擦除特性:别把NAND当RAM用
NAND Flash的读写擦除特性,和SRAM、DRAM完全不同。我列几个关键点:
- 读操作:以Page为单位。读一个Page大概几十微秒。读操作不影响寿命。
- 写操作:以Page为单位。写一个Page大概几百微秒到几毫秒。写操作会消耗寿命。
- 擦除操作:以Block为单位。擦除一个Block大概几毫秒。擦除操作消耗寿命最多。
- 写前擦除:写入新数据前,如果目标Block已有数据,必须先擦除。
- 位翻转:NAND天生会有位翻转错误,需要ECC纠错。
嗯,这里要注意:读操作虽然不消耗寿命,但读干扰会导致相邻单元的数据出错。所以长时间只读不写,也得定期搬移数据。这叫读刷新(Read Refresh)。
2.4 我踩过的坑:误用TLC做代码存储
避坑指南:我曾经在一个工业控制项目中,为了省成本,选了TLC NAND来存储固件代码。结果产品运行半年后,批量出现启动失败。查了三个月,最后定位到:TLC的P/E寿命只有1500次,而固件升级系统每次升级都会擦写代码区。客户升级了20次,加上出厂测试,寿命就耗尽了。
教训是什么?代码存储必须用SLC或至少是工业级MLC。代码区是只读的,但升级时会写。而且代码区通常不做磨损均衡,同一个Block反复擦写,死得很快。
我现在的做法是:
- 代码区:用SLC,或者用SPI NOR Flash。NOR Flash虽然容量小,但XIP执行快,寿命长。
- 数据区:根据写入频率选。频繁写入用SLC或MLC,冷数据用TLC甚至QLC。
- 日志区:用SLC,并且做环形缓冲,磨损均衡。
一句话总结:选NAND Flash,先看写入频率,再看容量需求。代码存储,老老实实用SLC。别为了省几毛钱,搭上整个产品的可靠性。
下一章,我会讲NAND Flash的接口协议、ONFI和Toggle标准,以及如何根据主控选型。咱们下期见。