有业界的朋友问:“我一直认为闪存里的数据是通过测存储单元的电流来判断Vt的,电流大的是1,电流小的是0。为什么你这里说的,是在同一个Id电流下寻找Vg,Vg大的是0,Vg小的是1?这和我以前的认知不同。”这其实是非常好的问题,问的很在点上,而且这个理解在实际操作中也是正确的。闪存的定义看Vt,闪存的操作看Id − 定义只是定义,实操没有按定义来做。原因很简单,因为在Id-Vg曲线上,Vg是自变量,Id是应变量;或者说Vg是函数的输入,Id是函数的输出。所以如要确定一个存储单元的Vt,就需要扫描Vg;直到输出的Id等于预设值It,才能获得这个存储单元的Vt (参考本系列的第一篇:“闪存的阈值电压(Vt)是什么”)。然而“扫描”就意味着需要对这个存储单元做多次操作,这在性能和可靠性上都是不可取的。所以闪存实际的读取,以SLC为例,只用了一个Vg电压,通过Id电流来判断存储单元里的数据。如图所示:

假设有两个SLC存储单元,分别用红色实线和蓝色实线表示;还有一个比较电压,用黑色虚线表示。1.如要通过判断Vt的方法来判别两个存储单元是擦除态还是编程态,就需要通过多次操作,找到Vt1和Vt2,然后将他们与Vref做比较来得出结论,这在性能和可靠性上是不可取的。2.更简单的方法是,在所有存储单元的栅极上加一个Vref电压,一次性获得这些存储端元的Id。Id大于It的,就是擦除态的单元;反之就是编程态的单元。因为只操作了一次,所以性能和可靠性更优。Id的比较则有多种方法。在NOR闪存上,因为Id电流较大(uA级),且NOR需要百纳秒级的读取速度,因此一般直接用分压的方法将Id转为电压作比较。简图如下,

两个分压电阻的阻值是相同的,而待判断存储单元的栅极电压是Vref。因此只要该单元的输出电流比It大,则分压电阻的分压就大,反之则分压就小。通过右侧的比较放大器就能获得0/1结果。NAND闪存的Id判断则困难些,因为NAND的Id通常在nA级别,分压往往不能获得精确结果,且NAND的读取在十微秒级别即可,因此现在的手段都是通过对位线(Bit Line, BL)的充放电来实现闪存单元的数据读取。流程大体如下1.将位线看作是一个电容 − 由于NAND闪存的位线很长,所以容值不小。3.打开待测存储单元的选择管,连接待测单元所属串(string)与位线4.在待测存储单元的栅极加上Vref,对位线电容放电5.如果待测存储单元是编程态,则位线电容放电慢;是擦除态,则放电快6.读出放大器(Sense Amplifier)读出位线放电后的结果

上面的电路,不论是NOR还是NAND的读出电路,都已经非常简化,比如在NAND的示意图上没有画出相同串上的未选择单元(Unselected Cells)等等。实际读出电路要复杂得多,但中心思想还是一致的,即把闪存单元看成是一个源极接地的NMOS管。这个NMOS就是最简单的放大器,其输入是栅极电压、其输出是漏极电流;它完成了将电压转化为电流的工作。转换出来的电流,在放大器端又被转换成电压,再次放大,这个放大的结果就是逻辑电平0和1,代表着闪存单元里的数据。这个过程可以画成流程图,

在真正的使用过程中,这些电路上的电压怎么加,时序怎么控制,都是闪存的核心知识产权。各位有兴趣的话,可以找一些论文看一下,作为科普性质的文章,就不一一列举了。这之后的几篇,会介绍一些闪存读取过程中可能会遇到的、相对“非常规”的、对读出的Vt分布有影响的话题,希望对大家理解闪存能有所帮助。
常见问题解答
闪存读取时为什么不直接测量阈值电压Vt?
直接测量Vt需要扫描栅极电压Vg,直到输出电流Id等于预设值It,这涉及多次操作,会严重影响闪存的读取速度和可靠性。因此实际读取中,闪存不直接按定义测Vt,而是采用更高效的间接方法,通过单次施加固定电压并比较电流大小来判断存储状态。
闪存实际读取时是如何通过电流判断数据的?
以SLC闪存为例,读取时在所有存储单元的栅极施加一个固定的比较电压Vref,然后一次性测量每个单元的漏极电流Id。将Id与预设的参考电流It比较:若Id大于It,则判定为一种状态(如擦除态),若Id小于It,则判定为另一种状态(如编程态)。这种方法只需一次操作,兼顾了性能与可靠性。
闪存定义中看Vt和实际读取看电流有什么区别?
定义上,闪存的状态由阈值电压Vt决定,但Vt是Id-Vg曲线上的间接参数,需扫描Vg才能获取。实际操作中,为了快速读取,闪存不测Vt,而是直接在固定Vg下测量Id电流。由于Id与Vt存在对应关系,通过比较Id与参考电流即可等效判断Vt的高低,从而确定存储单元的数据,避免了多次扫描带来的性能损耗。