2. NAND Flash物理结构:浮栅晶体管原理,SLC/MLC/TLC/QLC差异,Page/Block/Plane/LUN层级
好,咱们今天来聊聊NAND Flash的物理结构。说实话,这章是整个存储控制器设计的基石。你如果不懂Flash里面长什么样,后面写驱动、调时序、做坏块管理,那基本就是瞎蒙。
我个人习惯,讲任何硬件之前,先搞清楚它的最小单元。NAND Flash的最小单元,就是浮栅晶体管。
2.1 浮栅晶体管原理
先看一张经典的浮栅晶体管结构图(我这里用文字描述一下):
控制栅 (Control Gate)
|
绝缘层 (Oxide)
|
浮栅 (Floating Gate) ← 存电子的地方
|
绝缘层 (Oxide)
|
源极 (Source) —— 沟道 (Channel) —— 漏极 (Drain)
说白了,它比普通的MOS管多了一层——浮栅。这层浮栅被二氧化硅绝缘层包裹着,电子一旦进去,就跑不掉了。
怎么写入?
在控制栅上加高电压(比如20V),沟道里的电子会穿过绝缘层,隧穿到浮栅里。这就是Fowler-Nordheim隧穿效应。电子进去了,阈值电压就升高了。
怎么擦除?
反过来,在衬底上加高电压,把电子从浮栅里拉出来。阈值电压又降回去了。
怎么读取?
在控制栅上加一个中间电压(比如5V)。如果浮栅里有电子,阈值电压高,管子不导通,读出"0";如果浮栅里没电子,阈值电压低,管子导通,读出"1"。
关键点: 擦除操作是把所有位变成"1",写入操作是把"1"变成"0"。所以NAND Flash的编程(Program)其实是写"0"。
我的经验: 我在项目中遇到过一位同事,调试驱动时发现数据总是写不进去。查了半天,原来是他把编程和擦除搞反了——先编程再擦除,结果浮栅里的电子刚进去又被拉出来了。嗯,这种低级错误,犯一次就记住了。
2.2 SLC/MLC/TLC/QLC差异
浮栅里存多少电子,决定了它能表示几个比特。这就是SLC、MLC、TLC、QLC的区别。
| 类型 | 每单元比特数 | 阈值电压分布 | 典型寿命(P/E) | 读取速度 |
|---|---|---|---|---|
| SLC | 1 bit | 2个电平 | 10万次 | 最快 |
| MLC | 2 bits | 4个电平 | 1万次 | 较快 |
| TLC | 3 bits | 8个电平 | 3000次 | 较慢 |
| QLC | 4 bits | 16个电平 | 1000次 | 最慢 |
SLC(Single-Level Cell):一个浮栅只存1个比特。要么有电子(0),要么没电子(1)。简单粗暴,速度快,寿命长。但容量小,成本高。现在基本只用在军工、航天这些不差钱的地方。
MLC(Multi-Level Cell):存2个比特。需要把阈值电压分成4个区间:11、10、01、00。你想想看,4个区间意味着读取时要精确判断电压落在哪个范围,这就比SLC复杂多了。
TLC(Triple-Level Cell):存3个比特,8个电平区间。现在消费级SSD的主流。我刚开始做TLC项目时,最头疼的就是电压分布太密了,稍微有点干扰就读错。
QLC(Quad-Level Cell):存4个比特,16个电平区间。说实话,QLC的寿命和速度都不太好看,但容量大、成本低。用在移动硬盘、U盘这些场景还行。
避坑指南: 我曾经在一个项目里选了QLC做嵌入式存储,结果产品在高温环境下连续写入,不到半年就出现了大量坏块。后来换成TLC才解决问题。所以,选型时别只看容量,一定要评估你的写入频率和环境温度。
2.3 Page/Block/Plane/LUN层级
好,现在我们把视角拉大。单个浮栅晶体管太小了,NAND Flash是按层级组织的:
- Cell(单元):一个浮栅晶体管,存1~4个比特。
- Page(页):多个Cell组成一行。典型大小是4KB、8KB、16KB。Page是读写的最小单位。
- Block(块):多个Page组成一个Block。典型大小是128页、256页、512页。Block是擦除的最小单位。
- Plane(平面):多个Block组成一个Plane。同一个Plane内的操作可以并行。
- LUN(Logical Unit Number):一个独立的NAND Flash芯片。包含多个Plane。LUN是独立执行命令的最小单位。
我画个简单的层级关系:
LUN (芯片)
├── Plane 0
│ ├── Block 0
│ │ ├── Page 0
│ │ ├── Page 1
│ │ └── ...
│ ├── Block 1
│ └── ...
├── Plane 1
└── ...
为什么Page是读写单位,Block是擦除单位?
这个问题我面试时经常问。原因在于浮栅晶体管的物理特性:
- 读/写操作只影响一个Page内的Cell,可以精确控制。
- 擦除操作需要把整个Block的浮栅电子全部拉出来,没办法只擦一个Page。因为擦除电压是加在整个衬底上的,所有Cell一起受影响。
Plane的作用:多个Plane可以并行操作。比如你可以在Plane 0读数据,同时在Plane 1写数据。这样能大幅提升吞吐量。我在做控制器设计时,特别喜欢利用Plane并行来优化性能。
LUN的独立性:每个LUN有自己的寄存器、状态机、控制逻辑。你可以给不同的LUN发不同的命令,它们互不干扰。现代NAND Flash控制器通常支持多LUN交错操作,说白了就是流水线作业——一个LUN在忙,另一个LUN可以接着干。
我的习惯: 在写驱动时,我会先确认芯片的LUN数量、每个LUN的Plane数量、每个Block的Page数量。这些参数决定了你的调度策略。比如,如果芯片有4个LUN,每个LUN有2个Plane,那你理论上可以同时处理8个操作。嗯,充分利用起来,性能能翻好几倍。
2.4 总结一下
这一章的内容,说白了就是让你理解NAND Flash的物理本质:
- 浮栅晶体管是存储的根基,电子存进去就出不来(除非擦除)。
- SLC/MLC/TLC/QLC是容量和寿命的权衡,选型要谨慎。
- Page/Block/Plane/LUN的层级关系,决定了你怎么读写、怎么擦除、怎么并行。
下一章,我们会深入NAND Flash的接口协议,看看芯片之间是怎么通信的。到时候你会用到今天讲的这些概念,尤其是Page和Block的区别——因为命令里到处都是它们的身影。
好,今天就到这里。有什么问题,咱们群里聊。