Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第二章 Flash的物理本质——一块硅的自我修养

2.1 浮栅晶体管——一盏不会灭的灯

你手里有一个水桶,但它不漏

想象你手里有一个密封的水桶。你把水倒进去,盖上盖子,把它扔进储藏室。一年后你回来,打开盖子——水还在。

这个水桶不服从你日常生活的物理直觉。你的水杯敞口会蒸发,你的水管接头会渗漏,你的塑料瓶放久了水会变味。但这个水桶,一滴都不漏。

因为它不用“堵住“来防止泄漏。它用的是一个物理定律——量子力学隧穿效应——来创造一个“进去需要条件、出来也需要条件“的势阱。

这就是浮栅晶体管。

在Flash诞生之前,所有的非易失性存储都是有代价的:EPROM(紫外线可擦除可编程只读存储器)需要用紫外光照射20分钟才能擦除,而且你得把芯片上的石英窗口对准紫外灯;EEPROM(电可擦除可编程只读存储器)可以电擦除,但每一个单元需要两个额外的选择晶体管,面积巨大,容量极小,成本极高。

1984年,东芝的舛冈富士雄发明了Flash存储器。他的核心创新是:利用Fowler-Nordheim隧穿效应,让电子在高压下“穿越“绝缘层,不需要紫外线,不需要每个单元两个额外晶体管,结构简单,密度极高。

Flash的中文翻译是“闪存“。“闪“这个词来自他的同事有泉正二的描述——擦除过程“像照相机的闪光灯一样快”。在此之前,EPROM擦除需要20分钟,而Flash擦除只需要1秒。

从那一刻起,非易失性存储进入了“闪“时代。


被遗忘的前辈:EEPROM

在Flash诞生的前夜,EEPROM(Electrically Erasable Programmable Read-Only Memory)统治了嵌入式存储世界二十多年。EEPROM的基本原理与Flash几乎一样——浮栅晶体管加F-N隧穿——但有一个关键区别:EEPROM可以按字节擦除。

这意味着你可以直接修改EEPROM中的任意一个字节,不需要擦除整个扇区。听起来很完美?

问题出在结构上。EEPROM的每个单元需要两个晶体管:一个存储晶体管存放电荷,一个选择晶体管负责字节级寻址。而Flash的每个单元只需要一个晶体管——舛冈富士雄的精妙之处就在于,删掉了那个选择晶体管

EEPROM vs Flash 的结构差异
=======================

EEPROM 单元:
  每个单元有两个晶体管:
    ┌───┐    ┌───┐
    │存储│    │选择│   ← 选择晶体管用于字节级寻址
    │单元│    │管  │      使每个字节可以独立擦除
    └───┘    └───┘
  
  代价:面积 × 2(两个晶体管 vs 一个)
       每bit成本远高于Flash

Flash 单元:
   ┌───┐
   │存储│        ← 单晶体管单元,面积最小
   │单元│        但擦除必须以扇区为单位
   └───┘

选择晶体管虽然解决了"字节级擦除"的问题,
但让EEPROM永远无法在成本上战胜Flash。
这是工程中最常见的取舍:灵活性 vs 成本。

EEPROM至今仍然存在,用在需要少量、频繁修改的数据存储场景——比如车载ECU的里程数、配置参数、故障码。它的典型容量是几KB到几十KB。而Flash用“放弃字节级擦除“的代价,换来了百倍以上的容量优势。

你的ECU可能同时有一片EEPROM(存运行参数)和一片NOR Flash(存固件和大块数据)。EEPROM处理需要频繁修改的小数据,Flash处理固件和日志——各司其职,各自为自己的物理选择承担后果。


打开一颗浮栅晶体管

浮栅晶体管的结构,本质上是一个带有两个栅极的MOSFET:

浮栅晶体管物理结构和电路符号
=====================================

  结构截面图:                          电路符号(简化):

     控制栅 CG ──────────┐              
  ┌──────────────────────┐                ┌─── Drain
  │═══ ONO 绝缘层 ══════││ ← 阻挡电子逃逸        │
  ├──────────────────────┤              │  ┌──── CG
  │   ★浮栅 FG ★        ││ ← 电子监狱        ├──┤
  ├──────────────────────┤              │  └──── FG(隐式)
  │══ 隧道氧化层(~8nm)══││ ← 量子隧道        │
  ├────────┬─────────────┤              └─── Source
  │ N+源极 │ N+漏极       │
  │  (S)  │   (D)        │
  └────────┴─────────────┘
      P型衬底(沟道区)

五层结构,从底往上:

  1. P型硅衬底——这是地基。掺了硼的硅,空穴导电。源极和漏极是N+重掺杂区,像两个岛屿嵌在P型海洋里。
  2. 隧道氧化层——约8nm厚的二氧化硅。够薄,电子在高压下能量子隧穿过去;够厚,在常压下电子没有足够的能量穿越。这是整个器件的“单向通道“。
  3. 浮栅(Floating Gate)——多晶硅导带。它被ONO和隧道氧化层上、下、左、右、前、后完全包裹,没有任何电学连接。这是一个绝对的“孤岛“。电子一旦进去,就困在里面。
  4. ONO叠层(Oxide-Nitride-Oxide)——约15nm厚的SiO₂/Si₃N₄/SiO₂三层绝缘结构。ONO的泄漏电流比纯SiO₂小三到四个数量级。它确保浮栅里的电子几十年都不会从上面跑掉。
  5. 控制栅(Control Gate)——多晶硅电极,外接字线(Word Line)。它通过电容耦合“间接“控制浮栅电位,因为在物理上,CG和FG是隔开的——中间隔着15nm的ONO。

关键就在这里:CG和FG在物理上是隔离的,在电学上却是耦合的。

这意味着你可以通过控制CG上的电压,“隔着ONO“改变FG的电位——进而控制沟道的导通状态。而FG上的电荷量,由于没有任何放电通道,可以在没有外电压的情况下保持数十年。


写入:量子隧穿——电子正在“穿墙“

写入,在Flash的术语里叫编程(Program)。它的目的是把电子送进浮栅。

但浮栅周围全是绝缘体——所有方向上都是氧化物。按照经典物理,电子根本不可能穿越氧化物势垒(SiO₂的禁带宽度约9eV,电子的热运动能量只有0.026eV——差了三百多倍)。

量子力学给了一条路:Fowler-Nordheim隧穿(F-N Tunneling)

在经典物理中,一个能量为E的电子遇到一个高度为V₀的势垒(V₀ > E)时,一定会被弹回来。就像你往墙上扔一个网球——墙比你扔的力量大,球一定会弹回来。

但在量子力学中,电子不是一个小球,而是一个波函数。波函数在势垒中不会瞬间衰减到零,而是指数递减。如果势垒足够薄,波函数从势垒的另一侧“漏“出来——电子就穿越了。

F-N隧穿原理示意
=================

  (a) 无偏压:                         (b) 加正高压到CG:
  
  能量 ↑                              能量 ↑
       │    ┌─────────────┐                │    ┌─────────────┐
       │    │  势垒 (V₀)   │                │    │  势垒(变薄!)│
       │    │             │                │    │  ┌──────┐   │
  ─────┤    │             │           ─────┤   /│ │隧穿!│   │
  Eₑ   │→  │             │           Eₑ   │→ / │ │  →   │   │
  ─────┤    │             │           ─────┤  /  │ └──────┘   │
       └────┤   隧道氧化层  │                └────┤           │
            │  (SiO₂ 8nm) │                     │           │
            └─────────────┘                     └─────────────┘
  
  电子能量 < 势垒高度 → 电子被弹回      高压让势垒"倾斜变薄" → 电子隧穿通过!

FLASH编程时的做法是:在控制栅上加+10V到+20V的高压(具体电压取决于工艺),源极和漏极接地。这个高压通过电容耦合让浮栅的电位也升高,在浮栅和沟道之间形成一个极强的电场(约10MV/cm级别!)。

在这个电场下,隧道氧化层的能带发生倾斜——势垒从矩形变成一个三角形。三角形的底部宽度比原来的8nm薄得多。沟道中的电子有足够高的概率隧穿这个变薄的势垒,进入浮栅。

一旦高压撤掉,势垒恢复原来的形状和高度。浮栅里的电子被困住了——它们没有足够的能量再次隧穿出去。

电子进去了,门关了。


擦除:把电子赶出来

擦除是把浮栅里的电子赶出来。同样利用F-N隧穿,但方向相反。

NOR Flash的擦除方式是在源极加高压、控制栅接地(或负压):

擦除过程
=========

         CG = 0V (或负压)
    ┌──────────────────────┐
    │═══ ONO ═════════════││
    ├──────────────────────┤
    │   ★▉▉▉▉▉▉★         ││ ← 浮栅里的电子
    ├──────────────────────┤
    │══ 隧道氧化层 ═══════││
    ├────────┬─────────────┤
    │ S=+12V │  D=浮空/0V   │
    │ ↑高压   │             │
    │ 电子从浮栅隧穿回源极→  │
    └────────┴─────────────┘
    
    电子路径:浮栅 → 隧道氧化层 → 源极

在源极加高压(+12V左右),控制栅接地。浮栅-源极之间的强电场让隧道氧化层的能带再次倾斜——这次电子从浮栅侧隧穿回源极。

注意:NOR Flash擦除是按扇区(Sector) 进行的——通常4KB到64KB一组,一次性擦除。你不可能只擦除一个字节。这是因为擦除电压需要施加到整个扇区所有单元的源极线上,而源极线是共用的。

这就是NOR Flash的特性之一:写入快,擦除慢(擦除一片4KB扇区可能需要100ms)。


读取:猜水桶的重量

读取不进也不出电子。它只是“称一下浮栅的重量“——看里面有没有电子。

具体做法是:在控制栅上加一个介于擦除态阈值电压和编程态阈值电压之间的读取电压V_read,在漏极加一个小电压(~1V)。

读取原理
=========

           ┌─ V_read ───┐
           │  CG         │
  ┌────────┼─────────────┼──┐
  │  ONO                  │
  │         ★FG★          │ ← FG电荷量 = ?
  │ 隧道氧化层             │
  │  ┌─────┬─────┐        │
  │  │ S   │ D   │  Vd=1V │
  │  │     │     │←───────┤
  │  │     │ 读!  │        │
  │  └─────┴─────┘        │
  │      P-sub            │
  └────────────────────────┘
  
  擦除态(FG无电子):  Vth低 → V_read > Vth → 沟道导通 → 读"1"
  编程态(FG有电子):  Vth高 → V_read < Vth → 沟道截止 → 读"0"
  
  注意:NOR Flash逻辑中,"擦除态=1, 编程态=0"

浮栅里没有电子时,阈值电压Vth很低(比如说3V)。你把V_read设成5V——5V > 3V,沟道导通,漏极有电流流出。读“1“。

浮栅里有电子时,那些电子产生的电场会抵消一部分控制栅的电场,阈值电压Vth变高(比如说7V)。你V_read还是5V——5V < 7V,沟道不导通,漏极没有电流。读“0“。

读取不消耗、不改动浮栅里的电荷。所以Flash可以无限次读取——读取寿命几乎是无限的。


水桶比喻:为什么“不漏“是奇迹

把浮栅想象成一个密封的水桶:

  • 编程 = 往水桶里灌水(注入电子)。你通过F-N隧穿,用高压把电子从沟道“压“进浮栅——桶里有水了。
  • 擦除 = 把水桶倒过来,从同一个入口把电子排出去。你不能只倒一滴——必须整桶清空。
  • 读取 = 称水桶的重量。桶里有电子→重→阈值电压高→读“0“。桶里没电子→轻→阈值电压低→读“1“。称重不改变桶里的水量——所以读取寿命是无限的。
  • 磨损 = 桶壁变薄。每次灌水和倒水,电子穿越隧道氧化层时都会破坏一些Si-O键,形成陷阱态——微小的泄漏点。陷阱态越多,泄漏越厉害。最终桶壁穿孔——这个桶就废了。

这个水桶已经在漏了。只是漏得极慢——慢到你以为它不漏。

你可能会问:既然一个晶体管只能区分“有水“和“没水“两种状态,能不能精确控制水量,在一个单元里存更多比特?当然可以。但每多一个比特,感测裕度就压缩一档——这个问题贯穿了从SLC到QLC的全部物理困境,后面会有专门一节展开。

而现在,我们先放下“一个单元存几个比特“的问题,问一个更基础的问题:几十亿个这样的单元,在硅片上怎么连接?


一盏不会灭的灯

你合上手心里那颗Flash芯片的外壳。硅片被黑胶封装在内部,你看不到任何东西。但你知道——那里面有几十亿个浮栅晶体管,每一个都是一盏小小的灯。

这些灯不需要电源来维持。你写进去的0和1,是浮栅里有没有电子。电子在那8nm的氧化层监狱里,如果没有人给高压开门,它们可以待几十年。

这不违反热力学第二定律。这是一个亚稳态——就像山顶上的石头没有立刻滚下来,但不是永远不滚下来。滚下来需要一点初始的扰动——对浮栅来说,那个扰动就是氧化层里的陷阱态。陷阱态足够多时,石头的“坡度“就变得足够大,电子就漏了。

但你不管这些。你只知道,在你写下一行代码、一条短信、一个密码的那一瞬间,几十亿个电子被赶进了几十亿个小小的量子监狱里。它们就静静地待在那里,日日夜夜,等待未来的某一天被读取出来。

你要么读取,要么擦除。除此之外,它们就在时间中沉默地亮着。


下集预告

浮栅晶体管讲完了:一个存储单元如何捕获电子、如何释放电子、如何读取状态。但一颗芯片上有几十亿个这样的单元——你怎么把它们组织起来?是每个单元独立引出一条位线(NOR),还是把几十个单元串联成一串共享一条位线(NAND)?

这个选择,决定了读取延迟、芯片面积、每比特成本,以及——你的固件能不能直接从Flash上执行(XIP)。

下一节,存储世界的两条路。

悬念留给:NOR的读取延迟是70纳秒,NAND的读取延迟是25微秒——差了357倍。这357倍,来自它们在硅片上的连接方式。