有业界的朋友问:“我一直认为闪存里的数据是通过测存储单元的电流来判断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分布有影响的话题,希望对大家理解闪存能有所帮助。