NAND Flash 与 eMMC 控制器:坏块、磨损和 ECC
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」进阶层(intermediate)数字逻辑第一百零九篇。SPI NOR适合存少量固件并 XIP;手机字库、SD/TF 卡、SSD、UFS 里几十 GB~TB 的非易失存储则是 NAND Flash。它便宜密集,但天生不可靠,必须配一个懂坏块、磨损和纠错的控制器。
本文要回答的问题
- NAND 和 NOR 在访问粒度、密度、可靠性上差在哪?
- 为什么 NAND 出厂就有坏块、擦写还有寿命?SLC/MLC/TLC/QLC 什么关系?
- FTL 做什么:逻辑块地址怎么映射到物理页,坏块管理、磨损均衡、垃圾回收是什么?
- 为什么没有强 ECC(BCH/LDPC)就没法用现代 NAND?
- eMMC/UFS 把哪些复杂性封进了芯片,对外是什么接口?
一、NAND 的脾气:按页读、按块擦、会出错
- 访问粒度:读/写以页(2/4/8/16KB)为单位,擦除以块(几十~几百页)为单位;不能随机改写,写前该块必须先擦(同 NOR,只能 1→0);
- 密度/成本:单元串并联、面积小,容量和成本远优于 NOR,但不能直接按字节取指(无 XIP);
- 不可靠:电荷随时间泄漏(retention)、读相邻页会轻微扰动(read disturb)、擦写次数有限(SLC 最高、MLC/TLC/QLC 逐代降低,QLC 仅数百~数千次),且出厂就允许有一定坏块。
每页带一块 OOB/ spare 区存 ECC 校验字节、坏块标记和元数据。主控读出整页后必须用 OOB 里的码做纠错,原始误码(RBER)随擦写次数和温度上升。
二、ECC:从汉明到 BCH/LDPC
- 1 位级错误早期用汉明码(纠 1 检 2),远不够;
- BCH 码可按需要纠 t 位(如每 KB 纠 24/40/80 位),是 MLC/早期 TLC NAND 主流,编码为线性反馈、解码用求因式(关联 LFSR/CRC);
- 3D TLC/QLC 误码率更高,用 LDPC 软判决迭代译码:先硬判决,失败再读多次「软信息」迭代纠错,纠错能力更强但延迟大;控制器常做「硬解码→软解码→调整读电压重读→仍失败则搬到好块」的降级重试流水。
三、FTL:让「会坏的 NAND」看起来像一块好磁盘
裸 NAND 有坏块、要先擦后写、寿命有限,主机不想管这些。**FTL(Flash Translation Layer,闪存转换层)**在控制器固件/硬件里维护:
- 地址映射:把主机的逻辑块地址 LBA 映射到任意物理页(全映射或块映射),使「原地改写」变成「写到新页再改映射表」,免去大块擦除;
- 坏块管理 BBM:出厂坏块在坏块标记表中登记、运行中擦写失败的块也剔除,用预留的**冗余块(over-provisioning)**替换;
- 磨损均衡 wear-leveling:动态把冷数据挪到擦写次数高的块,让所有物理块擦写次数接近,避免少数热点块先磨穿;
- 垃圾回收 GC:有效数据散落在旧块时,把它们搬到新块、再整块擦除腾空间(这正是 SSD 空闲时的后台写放大来源);
- 掉电保护:映射表更新要原子化,靠电容/日志防止中途断电损坏。
四、eMMC 与 UFS:把 NAND+控制器打包
多数应用不直接碰裸 NAND,而是买封装好的器件:
- eMMC:把 NAND 阵列 + 控制器(FTL/ECC/坏块全做掉)封进一颗 BGA,主机走 MMC 并行接口(CMD 命令线 + 4/8 位 DATA + CLK),协议和 SD 卡同源、带命令响应/数据块/CRC、多分区和 boot 分区,主控只需发「读/写逻辑扇区」;成本低、广泛用于中低端手机和工控;
- UFS:面向高端的高速串行、全双工、带命令队列(SCSI 命令集、类似 M-PHY 的 LVDS 串行),比半双工并行 eMMC 快且并发好;
- SD/TF 卡和 SSD 内部也是「NAND + 控制器 + FTL」,只是接口和性能档不同(SD 的 SPI 模式见该篇,裸 NOR 见 SPI NOR)。
设计控制器时数据通路是「NAND 接口时序 + 页缓冲 + BCH/LDPC 编解码流水 + DMA/AXI」,控制面跑 FTL;芯片量产还要配合 MBIST/BISR思路做阵列测试与冗余替换。
与现有篇目的衔接
- 前置:SPI NOR Flash/XIP、片上存储分类、汉明 ECC
- 配套:SD 卡 SPI(卡内即 NAND+FTL)、CRC/LFSR(BCH 基础)、MBIST/BISR 冗余修复
- 相关:DMA/AXI 数据通路、SRAM/灵敏放大、OTP/启动配置
总结
一句话总结:NAND Flash 以页读写、按块擦除、不能原地改写,但单元密度高成本低,因而成为 SD 卡、eMMC、UFS、SSD 等大容量存储的核心,代价是天生不可靠——出厂就存在坏块、电荷随时间泄漏、读相邻页有读扰动、擦写寿命按 SLC/MLC/TLC/QLC 逐代下降,每页的 OOB 备用区用来放纠错码和坏块标记;因此必须有控制器用强 ECC 兜底:汉明码只能纠一位远远不够,主流用可纠多位的 BCH,3D TLC/QLC 更采用 LDPC 软判决迭代译码并配合调读电压重读、失败块搬迁的降级流水;FTL 闪存转换层进一步用 LBA 到物理页的映射把改写重定向到新页,做坏块表与冗余块替换、让擦写均匀分布的磨损均衡、搬有效数据后整块擦除的垃圾回收以及掉电保护,使会坏的 NAND 对主机呈现为一块可靠的逻辑磁盘;eMMC 把 NAND 和含 FTL/ECC 的控制器封进单颗 BGA、经与 SD 同源的并行命令/数据总线提供按逻辑扇区的读写和 boot 分区,UFS 则升级为全双工高速串行和命令队列,控制器数据通路是 NAND 时序加页缓冲加 BCH/LDPC 编解码流水加 DMA/AXI,量产测试与冗余替换还借用 MBIST/BISR 思想。