多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

从浮栅到FN隧穿:NAND Flash存储单元的物理原理与编程擦除机制

从浮栅到FN隧穿:NAND Flash存储单元的物理原理与编程擦除机制 1. 阅读背景为什么第2章从2.1开始才是真正的“硬核”《Inside NAND Flash Memories》这本书在存储圈里算是少见的“能把原理讲到根上、又没飘到物理课本那么远”的读物。我当初入手的时候纯粹是被NAND Flash调了太多次参手上翻车了一堆板子后来才意识到自己缺的不是“某个芯片的寄存器表”而是对存储单元本身的底层理解。这本书的第2章正好从最底层的存储单元讲起其中2.1到2.2.1这一小节被我翻了三遍每翻一遍都有新的体会。很多人可能和我一样日常工作里接触的是SPI NOR、eMMC、SSD主控、甚至NAND Flash编程器但一说到“NAND Flash到底靠什么存数据”大多只能背出“浮栅”“隧穿”“阈值电压”这些名词真要画图解释就卡壳了。这一章节恰恰就是把这些名词的物理含义、电压条件、单元结构逐层剥开讲清楚。如果你从事嵌入式开发、数据恢复、存储维修、主控固件调试或者只是想把编程器用得更明白拆这一章都非常值得。2.1到2.2.1这个范围核心解决的是三个问题NAND存储单元是什么结构、电荷是怎么放进去的、以及单个单元层面的读/写/擦除是怎么发生的。这三个问题搞懂了后面再看阵列布局、页/块组织、坏块管理、ECC策略就全是顺理成章的事反过来如果这三个问题没搞懂后面看再多芯片手册也只是一堆寄存器的堆砌。2. 2.1节拆解浮栅单元与存储单元的物理模型2.1 普通MOS管和Flash管到底差在哪先说说最基础的结构差异。普通MOSFET的栅极就是一层加电压形成沟道导通与否由栅压决定。而NAND Flash的存储单元本质是一个“带浮栅的MOS晶体管”栅极区域有两层底下是浮栅Floating Gate上面是控制栅Control Gate两层之间有一层绝缘介质通常是ONOOxide-Nitride-Oxide复合层。浮栅这层是悬浮的和任何电极都不直接相连外面被高质量的二氧化硅包裹。好处是电子一旦进入浮栅就被困在里面断电也不会跑掉这就是非易失性的来源。你完全可以把这一层想象成“保险柜里的现金”控制栅就是从外面操作保险柜的按钮但要动现金必须穿过多层防护。这个结构决定了Flash单元的核心参数——阈值电压Vt。Vt指的是让这个晶体管开始导通所需的最低控制栅电压。普通MOS管的Vt是制造时掺杂决定的出厂后就固定了Flash单元则不一样因为浮栅里的电子数量可以改变Vt会随之发生明显偏移。2.2 电荷怎么进去的FN隧穿机制2.1节里反复强调的一个机制是FN隧穿Fowler-Nordheim tunneling这也是NAND Flash写入和擦除的共同物理基础。它的本质并不神秘当氧化层两侧的电场强度足够大时电子会直接“穿过”绝缘层而不是翻越它。这在经典物理里很难理解但在量子力学里电子是有概率穿过势垒的只是概率极低当电场把势垒拉伸到足够薄的时候这个概率就变得可观了。编程Program时控制栅上加高压比如典型的16V到20V衬底和源漏接地。这样一来氧化层两侧形成强电场大约每厘米几百万伏的数量级沟道里的电子通过FN隧穿进入浮栅浮栅里的电子增多Vt升高。擦除时正好相反把衬底或者P阱加高压、控制栅接地电子从浮栅隧穿回衬底Vt回落。这里有个关键点很多人刚学时都会绕晕NAND Flash的写入操作是把阈值电压往高了拉而擦除是往低了拉。所以未编程的原始状态一般叫擦除态反而是Vt较低的“1”状态编程后的状态是Vt较高的“0”状态。这和NOR Flash类似但和EEPROM那套“写1就是没变化”的逻辑放在应用层很容易搞混。2.3 阈值窗口SLC/MLC/TLC的底层差异同一个单元能分辨的Vt窗口数量越多单颗芯片容量就越大。SLCSingle-Level Cell只有“低Vt”和“高Vt”两种状态也就是一个bitMLCMulti-Level Cell把Vt窗口切成四段存两个bitTLC切八段三个bitQLC切十六段四个bit。这个切换过程牵一发动全身窗口越多两个相邻状态之间的电压间隔就越小读写时对噪声、电荷泄漏、干扰就越敏感所以主控才需要复杂的ECC算法和磨损均衡。2.1节用大量篇幅强调Vt分布和窗口设计其实就是在为整本书后续的可靠性部分埋根。你以后遇到“这盘掉速掉得厉害”或者“数据放久了读不出来”本质上都是Vt分布展宽、相邻状态区分困难导致的。3. 2.2.1节拆解单个单元层面的读写擦操作3.1 编程操作一步步把Vt顶上去先说编程。2.2.1节如果没有记错应该是从单个存储单元的操作条件开始讲。编程的基本配置是控制栅接高电压Vpp典型值在18V到20V之间源极、漏极、衬底全部接0V。此时沟道里有电子而这些电子在强电场作用下穿过隧穿氧化层进入浮栅让单元的Vt升高。这里必须注意一个细节编程虽然电压高但它实际上是一个“慢过程”的可控操作。为了把Vt精确控制在目标窗口内现代NAND Flash都用一种叫ISPPIncremental Step Pulse Programming的方式即增量步进脉冲编程先施加一个短脉冲然后立刻做一次校验读如果Vt不够就把电压往上加一个固定步长再打一个脉冲循环往复直到达标。这种“边打边查”的思路在2.2.1部分已经能看出雏形为后面章节讲写入状态机做了铺垫。编程精度直接决定数据可靠性。如果你试图一次性把电压打满不同单元之间的Vt离散度会非常大靠近窗口边界的单元很容易在读操作时被误判。这也是为什么NAND编程总比读操作慢好几个数量级因为它在反复“试探”最优电压。3.2 擦除操作整块归零的底层原因擦除操作的电压极性正好拧过来衬底或者说P阱接高电压比如20VWord Line字线全部接0V源漏浮空。在这种条件下浮栅里的电子获得足够能量隧穿回衬底单元Vt回落。擦除有一个物理特性会让所有NAND设计者头疼擦除只能以块为单位进行。为什么因为所有单元共用同一个P阱只要给井加高压这一整块里的所有单元的浮栅电子都会同时被往外吸没法单独擦除某一个单元。这就是“擦除最小单位是块、编程最小单位是页、读最小单位也是页”的底层原因。不看这一节后面理解块管理、垃圾回收、写放大都是空中楼阁。擦除还有个概念叫“过擦除”就是说电子抽得太多Vt变得过低甚至负值会让这个单元在未被选中时保持导通从而干扰整个NAND串的读取。主控层面解决这个问题依靠的是“软编程”或者“预编程”也就是在擦除后用一个较低的编程电压把Vt拉回一个合理的负值范围。这些内容在后面章节会反复出现但原理的根全在2.2.1。3.3 读操作不改变电荷的“试探”读操作不需要高电压控制栅上加一个中间值参考电压Vread漏极加一个小电压比如0.5V左右然后检测有没有电流流过。如果浮栅电子多、Vt高控制栅电压不足以让单元导通就没电流读出“0”如果浮栅电子少、Vt低单元导通有电流读出“1”。所以读操作本质上是一个无损检测它不往浮栅里注入电子也不会把电子抽出来。但是耐不住量大啊同一根字线上的单元在读取时都处于偏置状态天长日久会造成读干扰Read Disturb让邻近单元的Vt发生偏移。2.2.1虽然只讲单个单元但已经隐含了后面的干扰问题这就是这本书编排的妙处。4. NAND阵列结构为什么非得这么串联4.1 NAND串的构成和选通管从单个单元到阵列2.2节开头部分一定会把NAND串String摆出来几十个甚至上百个存储单元串联成一条“链”这条链的两头分别接两个选通管一个管上面叫串选管SGDString Select Drain一个管下面叫地选管SGSString Select Source。整条链的漏端接位线BL源端接公共源线。这个串联结构是NAND和NOR最大的分水岭。NOR Flash每个单元都单独接位线虽然随机读取快但单元面积大容量做不高NAND Flash把一堆单元串成一条链位线数量急剧减少单元密度成倍提高代价是访问的时候必须整串操作随机读性能明显偏弱只能靠“先读一整页再筛”的策略来找补。4.2 为什么同一字线上的所有单元构成一页在NAND串里所有单元的控制栅都横着连出去形成字线WL一条字线横跨成百上千条位线这些被同一条字线选中的单元在编程和读操作时会被同时操作它们在一起就叫一页。你写入数据的时候Flash内部其实是先把整页数据搬到页缓存里然后一次性对所有选中单元做编程脉冲和校验。页的大小不是固定的普通2D NAND常见的是每页8KB、16KB3D NAND的页容量更大再加上备用区Spare Area实际型号规格可能更多。对于用编程器做数据恢复的人来说选错页大小是最常见的翻车原因之一后面实操部分我会详细说。4.3 局部自举效应NAND串防干扰的精妙设计NAND串能正常工作的一个关键机制是“未选中串的自动截止”。当你想编程某一条位置线上的单元时同一字线上其他串的单元也得承受编程电压但它们并不希望被写入否则数据就乱了。解决方案在于给未选中串的沟道“充上电”让沟道电位浮空升高这样即使字线加了20V高压氧化层两侧的电位差也不够大隧穿不会发生。这个效应叫Channel Boosting也叫沟道自升压。它解释了为什么NAND串的选通管在设计上那么讲究SGD/SGS的阈值电压、漏电特性都会直接影响干扰幅度。如果你以后调试闪存驱动的操作时序这一步会体现在“先激活选通管、再拉高字线、再送位线电压”这个先后顺序上顺序错了数据分分钟写飞。5. 从原理到实操用编程器读NAND时脑子里该想什么5.1 拆开芯片看引脚先别急着插适配器我经常看到新手拿一颗TSOP48封装的NAND FlashBGA转接板一插就直接点“Read”。我先不评价这种做法对不对只想强调一点如果读之前的“芯片识别”步骤是跳过的后面所有读出来的数据都可能是错乱的。原因很简单NAND的读操作依赖一整套偏置条件选错Vcc就会让芯片进入未知状态。以beeprog2这类独立NAND Flash编程器为例操作流程通常是选择芯片型号或厂商ID、设定Vcc1.8V还是3.3V、设定页大小/块大小/冗余区大小、关闭或开启ECC、然后才开始读。每一步背后都是这一章讲的基础知识在起作用。比如Vcc选3.3V去读一颗1.8V的颗粒轻则ID读不出来重则直接烧毁内部电路这在维修圈里是踩烂了的坑。5.2 读出来的镜像为什么总有“坏块”假设你已经成功读取了一颗NAND打开镜像文件会发现某些页全FF某些区块明明有数据却读出来是乱的。这不是编程器的Bug而是NAND的正常状态。晶圆出厂时就有坏块使用过程中还会产生新坏块坏块表会把这些区域标记出来。很多人第一次用NAND时都会问为什么我不能像读SPI NOR那样直接拿到一个连续镜像因为NAND天生依赖坏块管理和ECC原始数据在物理上就不是连续无空洞的。你在编程器上勾选“跳过坏块”或者“Bad Block Skip”时实际是在用串结构里“页地址自动往前跳”的逻辑去拼出一个逻辑连续镜像。如果不了解块/页组织你都不知道这个选项勾上之后镜像的地址映射是怎么重排的。5.3 实操中的电压条件和时序观察我在实际使用中会拿示波器去抓编程时的Vpp波形。你会发现写脉冲的顶部不是平的而是带斜坡的递进台阶每往上一级就对应一次校验读。这颗芯片采用的是就是ISPP策略和你从2.2.1部分学到的增量编程完全吻合。另外还有不少刚入门的人会把“读NAND时的UB (Unused Block) 标志”等同于“坏块”其实不是一回事。UB标志在很多芯片里是“this block is invalid”的意思但它不等于坏块表中记录的Bad Block有些UB是出厂之前故意设置的主要是为了做测试记录。要分清楚靠的是“块地址偏移坏块标记字节位置”的知识而不是盲目相信软件自动跳过。6. 原理没学明白时踩过的坑以及我能分享的避坑经验6.1 把NOR的思维套到NAND上这是最典型的一种翻车。NOR Flash可以随机读取任意字节芯片手册上给你的是“读ID、写状态寄存器”这种偏器件级的命令。NAND呢它默认是按页操作一个命令周期走完你要等R/B引脚拉低再拉高才算完成一次编程/擦除。很多人上来就用读NOR的习惯去操作NAND结果就是等不到数据或者读到全是FF。用一句话概括NOR是更像RAM的外设NAND是更像磁盘的存储介质。只要记住这个应用层怎么设计调度就有方向了。6.2 页大小和块大小选错带来的连环问题用不熟悉的NAND芯片做数据恢复我最怕的就是手册上同时标注了“Page Size: 204864”这种带冗余区的参数而编程器软件默认选项却是2048没勾上Spare区。结果读出的镜像每页都少了最后64字节数据恢复软件分析FAT或者ext4分区时全部错位。这个问题的根源还是对“页可用数据区冗余区”这个结构理解不够。冗余区不只是放ECC校验还可能存放逻辑块地址映射表、坏块标志、上电计数等元数据。读全了才能拼出完整的逻辑视图。6.3 对“擦除后是1还是0”的记忆模糊我见过有人在设计校验流程时默认擦除态是0导致一开机就以为整颗芯片全是数据整体擦一遍还没发现问题。实际上擦除态是Vt低的“1”只有被编程的单元才是“0”。这个基础概念要是搞反了后面的坏块扫描、空白检查全都会反过来问题在量产现场非常难排查。6.4 电压窗口和电荷损失的经验把数据写入NAND后放几个月再读有时会掉个别bit这就是电荷泄漏导致的Vt漂移。原理很简单浮栅里电子多了氧化层两侧总有微弱的漏电流高温、高湿环境下更是明显。工程上应对手段无非这几种——加强ECC、定期刷新Read Retry/Refresh、预留更宽的Vt窗口。理解了2.1和2.2.1你至少能在现场判断到底该调ECC强度还是换存储介质而不是一股脑地堆冗余。另外还有个小技巧把NAND芯片放编程器上做“Blank Check”之前最好先执行一次“Erase All”并验证擦除后的电压分布看看是否有单元擦不干净。如果擦完还有大量bit为0大概率是颗粒寿命到头了这种芯片拷出来的镜像即使能读后续使用中也极不稳定。在维修设备时提前排除这种芯片能省掉后期一堆售后问题。7. 一些个人体会和扩展思考我自己读这个章节最大的收获是把“电压”和“数据”之间的映射关系想通了。以前在电路上看到那些十几伏的编程电压总觉得是“电源的事”跟我写固件没什么关系现在再看编程电压的每次抬升、每个脉冲宽度都对应着浮栅里几百几千个电子的进进出出对应着数据是否能稳定保存。这种视角一旦建立再看SD卡、SSD、U盘、eMMC这些设备的主控行为会很容易猜出它们在背后忙什么。比如你往SSD里写大量小文件看到它偶尔出现一次较长时间的卡顿不用急着骂主控垃圾那很可能是在做垃圾回收把某个块的有效页先搬出来再整块擦掉——因为擦除只能按块来。再用这一章的思路想下就会发现这完全是NAND物理特性向软件层面传导的必然结果。如果你手头有编程器建议找一颗老旧的NAND颗粒把“读整片”和“按块读”都跑一遍对比一下无坏块跳过和有坏块跳过得到的镜像差异。再有条件的话抓一下编程时Vpp的波形看看那个阶梯状的ISPP曲线你会对“写入为什么慢”有更直观的感受。第2章后面还有阵列偏置、干扰模型、可靠性分析这些内容但2.1到2.2.1已经把最核心的物理基础打牢了。后面再学哪怕再复杂的3D NAND、QLC、多平面交错技术都会发现只是在这个骨架上不断加肉而已。
返回列表