本申请要求由Gerrit Jan Hemink于2008年10月24日提交的题为“Programming Non-Volatile Memory With Variable Initial Programming Pulse”的美国临时申请No.61/108,124的权益,该申请通过引用并入本文。
具体实施方式
闪速存储器系统的一个示例使用NAND结构,其包括布置串联的多个晶体管,夹于两个选择栅极之间。串联的晶体管和所述选择栅极被称为NAND串。图1是示出一个NAND串的俯视图。图2是其等效电路。图1和图2中所示的NAND串包括串联且夹在第一(漏极侧)选择栅极120与第二(源极侧)选择栅极122之间的四个晶体管100、102、104和106。选择栅极120通过比特线接触126将NAND串与比特线连接。选择栅极122将NAND串与源极线128连接。通过将适当的电压施加到选择线SGD控制选择栅极120。通过将适当的电压施加到选择线SGS控制选择栅极122。晶体管100、102、104和106中的每一个具有控制栅极和浮置栅极。例如,晶体管100具有控制栅极100CG和浮置栅极100FG。晶体管102包括控制栅极102CG和浮置栅极102FG。晶体管104包括控制栅极104CG和浮置栅极104FG。晶体管106包括控制栅极106CG和浮置栅极106FG。控制栅极100CG连接到字线WL3,控制栅极102CG连接到字线WL2,控制栅极104CG连接到字线WL1,且控制栅极106CG连接到字线WL0。
注意,虽然图1和图2示出在NAND串中有四个存储器单元,但是使用四个存储器单元仅为示例。NAND串可具有少于四个存储器单元或多于四个存储器单元。例如,一些NAND串会包括八个存储器单元、16个存储器单元、32个存储器单元、64个存储器单元、128个存储器单元,等等。本文的讨论并不限于NAND串中任何特定数量的存储器单元。一个实施例使用具有66个存储器单元的NAND串,其中64个存储器单元用于存储数据,而两个存储器单元由于不存储数据而被称为哑元存储器单元。
使用NAND结构的闪速存储器系统的典型架构包括若干NAND串。每一NAND串通过其受选择线SGS控制的源极选择栅极而连接至共同源极线,并且通过其受选择线SGD控制的漏极选择栅极而连接至其所关联的比特线。每一比特线以及经由比特线接触部连接到该比特线的相应NAND串包括存储器单元阵列的列。多个NAND串共享比特线。通常,比特线在垂直于字线的方向上在NAND串的顶部走线,并且连接到感测放大器。
在以下美国专利/专利申请中提供了NAND型闪速存储器的有关示例及其操作:第5,570,315号美国专利;第5,774,397号美国专利;第6,046,935号美国专利;第6,456,528号美国专利;以及美国专利公开No.US2003/0002348,所有这些专利/专利申请通过引用并入本文。
除了NAND闪速存储器之外,也可以使用其它类型的非易失性存储设备。例如,也可以由使用电介质层用于存储电荷的存储器单元制造非易失性存储器器件。使用电介质层,而不是先前描述的导电性浮置栅极元件。这种使用电介质存储元件的存储器器件已由Eitan等人在“NROM:A Novel Localized Trapping,2-Bit Nonvolatile Memory Cell”(IEEE Electron Device Letters,卷21,第11号,2000年11月,第543-545页)加以描述。ONO电介质层延伸跨过源极扩散与漏极扩散之间的沟道。用于一个数据比特的电荷位于与漏极相邻的电介质层,而用于另一个数据比特的电荷位于与源极相邻的电介质层。第5,768,192号美国专利和第6,011,725号美国专利公开一种具有夹置于两个二氧化硅层之间的陷阱电介质的非易失性存储器单元。通过单独读取电介质中在空间上分离的电荷存储区域的二进制状态,可实现多状态数据存储。还可以使用基于MONOS或TANOS型结构或纳米晶体的非易失性存储器。也可以使用其他类型的非易失性存储器。
图3示出存储器器件210,该器件具有用于对一页(或其他单位的)存储器单元(例如,NAND多状态闪速存储器)进行并行读取和编程的读取/写入电路。存储器器件210可包括一个或多个存储器管芯或芯片212。存储器管芯212包括:存储器单元的(二维或三维)阵列200、控制电路220以及读取/写入电路230A和230B。在一个实施例中,通过各种外围电路对存储器阵列200的存取是以对称方式(在该阵列的相对两侧)实现的,使得每侧的存取线和电路的密度减少一半。读取/写入电路230A和230B包括多个感测块300,所述感测块允许并行读取存储器单元的页面或者对其进行编程。存储器阵列200可经由行解码器240A和240B由字线寻址以及经由列解码器242A和242B由比特线寻址。字线和比特线是控制线的示例。在典型实施例中,控制器244与一个或多个存储器管芯212包括在同一存储器器件210(例如可移动存储卡或封装)中。命令和数据经由线232在主机与控制器244之间传输并且经由线234在控制器与一个或多个存储器片212之间传输。
控制电路220与读取/写入电路230A和230B协作,以对存储器阵列200执行存储器操作。控制电路220包括状态机222、片上地址解码器224和功率控制模块226。状态机222提供存储器操作的芯片级控制。片上地址解码器224提供由主机或存储器控制器使用的地址与由解码器240A、240B、242A和242B使用的硬件地址之间的地址接口。功率控制模块226控制在存储器操作期间供应给字线和比特线的功率和电压。在一个实施例中,功率控制模块226包括一个或多个电荷泵,所述电荷泵可形成比电源电压高的电压。控制电路220提供通向行解码器240A、240B以及列解码器242A和242B的地址线ADDR。列解码器242A、242B通过被标记为“数据I/O”的信号线向控制器244提供数据。
在一个实施例中,控制电路220、功率控制电路226、解码器电路224、状态机电路222、解码器电路242A、解码器电路242B、解码器电路240A、解码器电路240B、读取/写入电路230A、读取/写入电路230B和/或控制器244中的一个或其任何组合可以被称为一个或多个管理电路。该一个或多个管理电路执行本文描述的处理。
图4描述存储器单元阵列200的示例性结构。在一个实施例中,存储器单元阵列划分为大量的存储器单元块(例如,块0-1-23,或另一数目的存储器单元块)。对于闪速存储器系统,通常,块是擦除的单位。也就是说,每个块包含被一起擦除的最小数量的存储器单元。也可以使用其他擦除单位。
块包含可通过比特线(例如,比特线BL0-BL69,623)和字线(WL0,WL1,WL2,WL3)访问的NAND串集合。图4示出串联以形成NAND串的四个存储器单元。尽管图中示出在每个NAND串中包含4个单元,但是可以使用更多或更少的单元(例如,在NAND串上可使用16、32、64、128或其它数量的存储器单元)。NAND串的一个端子通过(连接至选择栅极漏极线SGD的)漏极选择栅极连接至对应的比特线,而另一个端子通过(连接至选择栅极源极线SGS的)源极选择栅极连接至源极线。
每个块通常划分为多个页面。在一个实施例中,页面是编程的单位。也可以使用其它的编程单位。通常,在一行存储器单元中存储一个或多个页面的数据。例如,在连接至共同字线的存储器单元中可存储一个或多个数据页面。页面可存储一个或多个扇区。扇区包括用户数据和开销数据(也称为系统数据)。开销数据通常包括头部信息和从扇区的用户数据计算出的纠错码(ECC)。当数据被编程到阵列中时,控制器(或其它部件)计算ECC,并且当从阵列中读取数据时也对ECC进行检查。或者,ECC和/或其它开销数据存储在与其所属的用户数据不同的页面或甚至不同的块中。用户数据扇区通常是512字节,对应于磁盘驱动器中扇区的大小。大量的页面形成块,例如为从8个页面直至32、64、128或更多个页面中的任何数量。也可以使用不同大小的块、页面和扇区。另外,块可具有多于或少于69624个比特线。
图5是单个感测块300的框图,该感测块被分区为核心部分(称为感测模块480)和公共部分490。在一个实施例中,关于每一比特线具有单独的感测模块480且关于多个感测模块480的集合具有一个公共部分490。在一个示例中,感测块将包括一个公共部分490和八个感测模块480。在组中的每个感测模块将经由数据总线472与关联的公共部分通信。在美国专利申请公布2006/0140007中具有一个示例,该申请通过引用全部并入本文。
感测模块480包括感测电路470,其确定连接的比特线中的传导电流是大于还是小于预定电平。在一些实施例中,感测模块480包括通常称为感测放大器的电路。感测模块480还包括比特线锁存器482,其用于设置关于所连接的比特线的电压状况。例如,比特线锁存器482中锁存的预定状态将导致所连接的比特线被拉到指出编程禁止的状态(例如Vdd),以锁定存储器单元不被编程。公共部分490包括处理器492、数据锁存器494的集合和耦合在数据锁存器494的集合与数据总线420之间的I/O接口496。处理器492执行计算。例如,其功能之一在于,确定感测到的存储器单元中存储的数据,并且将确定的数据存储在数据锁存器的集合中。数据锁存器494的集合用于在读取操作期间存储由处理器492确定的数据比特。其还用于在编程操作期间存储从数据总线420导入的数据比特。导入的数据比特代表要被编程到存储器中的写入数据。I/O接口496在数据锁存器494与数据总线420之间提供接口。
在读取或感测期间,系统的操作受状态机222控制,该状态机222控制将不同控制栅极电压供应给寻址到的存储器单元。随着遍历与存储器所支持的不同存储器状态对应的各预定控制栅极电压,感测模块480可在这些电压之一处跳变,并且将从感测模块480经由总线472向处理器492提供输出。此时,处理器492通过考虑感测模块的跳变事件以及关于从状态机通过输入线493施加的控制栅极电压的信息确定所得存储器状态。然后计算存储器状态的二进制编码并将所得数据比特存储在数据锁存器494中。在核心部分的另一实施例中,比特线锁存器482具有双重职责,既作为用于对感测模块480的输出进行锁存的锁存器,又作为如上所述的比特线锁存器。
可以想到,一些实现方式可包括多个处理器492。在一个实施例中,每一处理器492包括输出线(图5中未示出),使得每一输出线是线或(wired-OR)在一起的。在一些实施例中,输出线在连接到线或的线之前被反转。因为接收该线或的线的状态机能够确定被编程的所有比特何时已达到期望电平,所以这种配置使得能够在编程验证处理期间快速确定编程处理何时已完成。例如,当每一比特均已达到其期望电平时,会向线或的线发送关于该比特的逻辑0(或数据1被反转)。当所有比特输出数据0(或反转的数据1)时,于是状态机获知要终止编程处理。在每一处理器与八个感测模块通信的实施例中,状态机可能(在一些实施例中)需要八次读取线或的线,或者在处理器492中添加逻辑以累加关联的比特线的结果,使得状态机仅需读取线或的线一次。
数据锁存器栈494包含对应于感测模块的一组数据锁存器。在一个实施例中,针对每个感测模块480具有三个(或者四个或另一数量的)数据锁存器。在一个实施例中,锁存器各自为一个比特。
在编程或验证期间,待编程的数据来自数据总线420并存储在数据锁存器494的集合中。在验证处理期间,处理器492相对于期望的存储器状态来监视被验证的存储器状态。当这二者吻合时,处理器492设置比特线锁存器482,从而使得该比特线被拉到指出编程禁止的状态。这样,即使耦合到该比特线的存储器单元在其控制栅极上受到编程脉冲,也能禁止该单元被进一步编程。在其它实施例中,处理器在初始时加载比特线锁存器482,且感测电路在验证处理期间将其设置为禁止值。
在一些实现方式中(但不要求),数据锁存器被实现为移位寄存器,从而其中存储的并行数据被转换为用于数据总线420的串行数据,反之亦然。在一个优选实施例中,与存储器单元的读取/写入块对应的所有数据锁存器可被链接在一起以形成块移位寄存器,从而数据块可通过串行传送而输入或输出。具体地说,调整一排读取/写入模块,从而其数据锁存器集合中的每一个会仿佛它们为整个读取/写入块的移位寄存器的一部分那样将数据依次移入或者移出数据总线。
在(1)2004年3月25日公开的题为“Non-Volatile Memory And Method With Reduced Source Line Bias Errors”的美国专利申请公布No.2004/0057287,(2)2004年6月10日公开的题为“Non-Volatile Memory And Method with Improved Sensing”的美国专利申请公布No.2004/0109357,(3)美国专利申请公布No.20050169082,(4)2005年4月5日提交的题为“Compensating for Coupling During Read Operations of Non-Volatile Memory”(发明人为Jian Chen)的美国专利公布No.2006/0221692,以及(5)2005年12月28日提交的题为“Reference Sense Amplifier For Non-Volatile Memory”(发明人为Siu Lung Chan和Raul-AdrianCernea)的美国专利申请公布No.2006/0158947中具有关于读取操作和感测放大器的更多信息。所有这五个刚列出的专利文献通过引用而全部并入本文。
在成功编程过程(带有验证)结束时,存储器单元的阈值电压根据情况应当在被编程的存储器单元的阈值电压的一个或多个分布之内或者在被擦擦的存储器单元的阈值电压的分布之内。图6示出在每个存储器单元存储两比特数据时存储器单元阵列的示例性阈值电压分布(与数据状态对应)。但是在其它实施例中,对于每个存储器单元可使用多于两比特数据或少于两比特数据(例如,每个存储器单元三比特数据、四比特数据或更多比特的数据)。
图6示出关于被擦擦的存储器单元的第一阈值电压分布E。另外还示出关于被编程的存储器单元的三个阈值电压分布A、B、C。在一个实施例中,在分布E中的阈值电压是负值,而在分布A、B、C中的阈值电压是正值。图6中每个不同的阈值电压分布与数据比特集合的预定值对应。在被编程至存储器单元中的数据与该存储器单元的阈值电压电平之间的特定关系取决于为存储器单元采用的数据编码方案。例如,第6,222,762号美国专利与美国专利申请公布No.2004/0255090描述了用于多状态闪速存储器单元的多种数据编码方案,该专利与专利申请公布通过引用而全部并入本文。在一个实施例中,使用格雷码分配将数据值分配给阈值电压范围,使得如果浮置栅极的阈值电压错误地偏移至其相邻的物理状态,仅有一个比特会受影响。在一个示例中,将“11”分配给阈值电压范围E(状态E),将“10”分配给阈值电压范围A(状态A),将“00”分配给阈值电压范围B(状态B),以及将“01”分配给阈值电压范围C(状态C)。但是,在其它实施例中未使用格雷码。尽管图6示出四个状态,但是本发明也可以与其它多状态结构、包括多于四个状态或少于四个状态的多状态结构一起使用。
图6示出用于从存储器单元读取数据的三个读取参考电压Vra、Vrb和Vrc。通过测试指定存储器单元的阈值电压是在Vra、Vrb和Vrc之上还是之下,系统能够确定该存储器单元所处的状态。图6还示出三个验证参考电压Vva、Vvb和Vvc。在将存储器单元编程至状态A时,系统会测试这些存储器单元是否具有大于或等于Vva的阈值电压。在将存储器单元编程至状态B时,系统会测试这些存储器单元是否具有大于或等于Vvb的阈值电压。在将存储器单元编程至状态C时,系统会测试这些存储器单元是否具有大于或等于Vvc的阈值电压。在一个称为全序列编程的实施例中,能够将存储器单元从被擦擦状态E直接编程至任一被编程状态A、B或C。例如,可首先擦擦要进行编程的一组存储器单元,使得该组中的所有存储器单元处于被擦除状态E。然后,使用编程处理将存储器单元直接编程至状态A、B或C。虽然有些存储器单元从状态E被编程至状态A,但是其他存储器单元可从状态E被编程至状态B和/或从状态E被编程至状态C。
图7示出对多状态存储器单元进行编程的双阶段技术的一个示例,该多状态存储器单元存储用于两个不同页面(即,下页面和上页面)的数据。其中示出了四个状态:状态E(11)、状态A(10)、状态B(00)和状态C(01)。对于状态E,两个页面均存储“1”。对于状态A,下页面存储“0”而上页面存储“1”。对于状态B,两个页面均存储“0”。对于状态C,下页面存储“1”而上页面存储“0”。注意,尽管为每个状态指定了特定的比特模式,但是也可以指定不同的比特模式。在第一编程阶段,根据要被编程至下逻辑页面中的比特,设置存储器单元的阈值电压电平。如果该比特为逻辑“1”,则由于各存储器单元因为已被预先擦除而处于适当状态,所以阈值电压不变。但是,如果要被编程的比特是“0”,则将存储器单元的阈值电压提升至状态A,如箭头504所示。至此,第一编程阶段结束。
在第二编程阶段,根据被编程至上逻辑页面的比特,设置存储器单元的阈值电压电平。如果上逻辑页面比特要存储逻辑“1”,则由于存储器单元处于状态E和状态A之一(这取决于下页面比特的编程),其中状态E和状态A均携带为“1”的上页面比特,所以不进行编程。如果上页面比特要成为逻辑“0”,则使阈值电压偏移。如果第一阶段导致存储器单元保持在被擦除状态E,则在第二阶段中对存储器单元编程,使得阈值电压被提升至状态C内,如箭头502所示。如果存储器单元已由于第一编程阶段而被编程至状态A,则存储器单元在第二阶段中被进一步编程,使得阈值电压被提升至状态B内,如箭头506所示。第二阶段的结果是在未改变下页面的数据的情况下将存储器单元编程至被指定来将逻辑“0”存储于上页面的状态。
在一个实施例中,可将系统建立成:如果写入足够数据以填满整个页面,则执行全序列写入。如果对于完整的页面而言未写入足够的数据,则编程处理可用接收的数据执行下页面编程。当接收到后续数据时,系统于是会对上页面编程。在又一实施例中,系统能够在开始时以对下页面编程的模式写入,并在后续接收到足够数据来填满整个(或大部分)字线的存储器单元时转换成全序列编程模式。在美国专利申请2006/0126390中公开了这样的实施例的更多细节,该专利申请通过引用全部并入本文。
图8A-图8C描述用于对非易失性存储器编程的另一多阶段编程处理。对于任一特定存储器单元,通过在针对在先页面写相邻存储器单元之后关于特定页面写该特定存储器单元,图8A-图8C的处理降低浮置栅极与浮置栅极的耦合。在图8A-图8C所示处理的实现方式的一个示例中,非易失性存储器单元使用四个数据状态在每个存储器单元存储两比特数据。例如,假设状态E为被擦除状态而状态A、B和C为被编程状态。状态E存储数据11。状态A存储数据01。状态B存储数据10。状态C存储数据00。由于在相邻的状态A与B之间两个比特均发生变化,所以这是非格雷码编码的示例。也可以使用将数据编码至物理数据状态的其他方式。每个存储器单元存储两个数据页面。出于标记目的,这些数据页面将被称为上页面和下页面;但是,也可以赋予这些页面以其他标记。关于图8A至图8C所示处理的状态A,上页面存储比特0而下页面存储比特1。关于状态B,上页面存储比特1而下页面存储比特0。关于状态C,上、下页面均存储比特数据0。图8A至图8C所示编程处理为双阶段编程处理;但是,图8A至图8C所示处理也可用于实现三阶段处理、四阶段处理,等等。在第一阶段中,对下页面进行编程。如果下页面是要保持数据1,则存储器单元状态保持状态E。如果该数据要被编程为0,则升高存储器单元的电压阈值,使得存储器单元被编程至状态B’。因此,图8A示出将存储器单元从状态E编程至状态E’。图8A所示的状态B’是中间状态B;因此,验证点被示为Vvb’,其低于Vvb。
在一个实施例中,在存储器单元从状态E被编程至状态B’后。于是相对于其下页面对其在NAND串中(在字线WLn+1上的)的相邻存储器单元进行编程。在对相邻存储器单元编程后,浮置栅极与浮置栅极的耦合作用可提升前一被编程的存储器单元的表观阈值电压。这会具有将状态B’的阈值电压分布展宽至如图8B中的阈值电压分布520所示的作用。当对上页面编程时,阈值电压分布的这种明显展宽会得到补偿。
图8C示出对上页面编程的处理。如果存储器单元处于被擦除状态E且上页面要保持处于1,则存储器单元会保持于状态E。如果存储器单元处于状态E且其上页面数据要被编程至0,则会提升存储器单元的阈值电压使得存储器单元处于状态A。如果存储器单元处于中间阈值电压分布520中且上页面数据要保持于1,则存储器单元会被编程至最终状态B。如果存储器单元处于中间阈值电压分布520中且上页面数据要变为数据0,则会提升存储器单元的阈值电压使得存储器单元处于状态C。因为仅相邻存储器单元的上页面编程会对指定存储器单元的表观阈值电压有作用,所以图8A至图8C的处理会降低浮置栅极与浮置栅极的耦合作用。交替状态编码的示例是在上页面数据为1时从分布520移至状态C,而在上页面数据为0时移至状态B。
尽管图8A至图8C提供关于四个数据状态和两个数据页面的示例,但是图8A至图8C指出的构思可应用于具有多于或少于四个状态以及除两个以外的页面的其他实现。在第7,196,928号美国专利中具有更多关于图8A至图8C所示编程处理的细节,该专利通过引用并入本文。
图9A至图9C提供多阶段编程处理的另一示例。图9A示出四个阈值电压分布:E、A、B和C。阈值电压分布E表示被擦除的存储器单元。阈值电压分布A、B和C表示被编程的存储器单元。在初始时,所有存储器单元被擦除至阈值电压分布E。在第一编程阶段中,要被编程至阈值电压分布C的存储器单元被编程至阈值电压分布C。图9B示出第一编程阶段。在第二编程阶段中,要被编程至阈值电压分布A和B的存储器单元被编程至适当的分布,如图9C所示。
在图9A至图9C所示处理的一些实施例中,在针对第一存储器单元集合执行第一阶段之后且在针对该第一存储器单元集合执行第二阶段之前,对第二存储器单元集合执行该第一阶段。在一个实现中,第一存储器单元集合连接至第一字线,且第二存储器单元集合连接至第二字线。
图10A至图10D示出对连接至共同字线的存储器单元编程且能够以与图9A至图9C所示处理类似的方式使用的另一多阶段编程处理。图10A至图10D所示处理的第一阶段包括:首先将目标为阈值电压分布B和C的存储器单元编程至中间阈值电压分布B’,如图10A中的阈值电压分布530所示。然后,对相邻字线执行该第一阶段,这使得该中间阈值电压分布由于来自邻近浮置栅极的耦合而展宽(见图10B)。第二编程阶段包括:对目标为从阈值电压分布B’到阈值电压分布C的存储器单元进行编程(见图10C)。该编程处理的第三阶段包括:对存储器单元从分布E编程至分布A以及从分布B’编程至分布B(见图10D)。
图11A和图11B描述另一个双阶段编程处理。在第一阶段中,以全序列将存储器单元从被擦除状态E同时编程至中间状态A*、B*和C*(见图11A)。在第二阶段中,处于中间状态A*的存储器单元被编程至状态A,而处于中间状态B*的存储器单元被编程至状态B,并且处于中间状态C*的存储器单元被编程至状态C(见图11B)。关于状态A、B和C的验证点Vva、Vvb和Vvc高于状态A*、B*和C*的验证点。因此,在第一阶段期间,第一存储器单元集合被编程至相比最终目标阈值电压更低的较低阈值电压。在第二编程阶段期间,该第一存储器单元集合将其阈值电压提升至最终目标阈值电压。在一个实施例中,在针对第一存储器单元集合的第一阶段之后,且在针对第一存储器单元集合的第二阶段之前,对与第一存储器单元集合连接至相同字线或者与第一存储器单元相比连接至不同字线的第二存储器单元集合执行该第一阶段。在一个示例中,第一阶段为粗略阶段,而第二阶段为精细阶段,因此,中间状态A*、B*和C*可比最终目标状态A、B和C更宽。
图12A至图12D公开用于对非易失性存储器编程的三阶段处理。图12A至图12D的处理是针对每个存储器单元存储三比特数据的非易失性存储器单元执行的。在编程之前,所有存储器单元被擦擦至状态S0(见图12A)。图12B示出第一阶段,该第一阶段包括将最终要被编程至状态S4-S7的存储器单元编程至状态S4’。图12C示出第二阶段,该第二阶段包括从状态S4’编程至状态S4-S7。在一个实施例中,由于来自在第一阶段与第二阶段之间被部分或全部编程的、相邻字线上的存储器单元的耦合,在图2C中S4’更宽。图12D示出第三阶段,该第三阶段包括从状态S0编程至状态S1、S2和S3。当根据图12A至图12D的处理对第一存储器单元集合编程时,在关于第一存储器单元集合的各阶段之间,可全部或部分地对其他存储器单元(与第一存储器单元集合连接至相同字线或连接至一个或多个不同字线的存储器单元)编程。
图13A至图13D示出用于对每个存储器单元存储四比特数据的存储器单元编程的三阶段编程处理。因此,最终的存储器单元集合可被分成16个阈值电压分布。在三阶段编程处理的第一阶段(图13A至图13B)期间,存储器单元被编程至四个中间阈值电压分布E2、A2、B2和C2之一。于是在第二阶段期间,存储器单元从这四个中间阈值电压分布被编程至16个分布0-F(图13B至图13C)。在第三阶段(图13C至图13D)中,将这16个分布0-F中的每一个紧缩。在根据图13A至图14D的处理对第一存储器单元集合编程时,在关于第一存储器单元集合的各阶段之间,可全部或部分地对其他存储器单元(与第一存储器单元集合连接至相同字线或连接至一个或多个不同字线的存储器单元)编程。
图14是描述用于操作非易失性存储器(诸如图3的系统,或者其他系统)的处理的一个实施例的流程图。在步骤600中,接收数据编程请求。该请求可来自主机,另一器件或控制器。该请求可在控制器、控制电路、状态机或其他器件接收。响应于该请求,控制器、控制电路、状态机或其他器件会在步骤602中确定使用哪个闪速存储器单元块来存储数据。在步骤604中,使用任一上述编程处理(或其他编程处理)将数据编程至所确定的块中。在步骤606中,一次或多次读取所编程的数据。因为在步骤604与步骤606之间可经历不可预知的时长,所以在这两个步骤之间具有虚线,并且步骤606并非是响应于步骤604而执行的,而是响应于读取该数据的请求或其他事件而执行的。
图15是描述用于对块中的存储器单元进行编程的编程处理的流程图。图15是图14的步骤604的一个实施例。在步骤632中,在编程之前(以块为单位或以其他单位)擦除存储器单元。在一个实施例中,通过在源极和比特线浮置时将p阱提升至擦除电压持续足够的一段时间并且将所选择的块的字线接地,擦除存储器单元。因此,所选择的存储器单元的隧道氧化物层被施加强电场,并且随着浮置栅极的电子通常通过Fowler-Nordheim隧穿机制被发射到衬底侧,所选择的存储器单元被擦除。随着电子从浮置栅极被传送到p阱区域,被选择的存储器单元的阈值电压降低。可以对整个存储器阵列、单独的块或另一单位的存储器单元执行擦除。也可以使用其他的擦除技术。在步骤634中,执行软编程以将被擦除的存储器单元的阈值电压分布变窄。由于该擦除处理,一些存储器单元可处于比所需更深的擦除状态。软编程可施加编程脉冲以将被更深擦除的存储器单元的阈值电压移至仍处于该擦除状态的有效范围内的较高阈值电压。在步骤636中,如本文所述对块中的存储器单元编程。图15所示处理的执行可由状态机、控制器或者状态机与控制器的组合来指导。例如,控制器可向状态机发出命令和数据以对该数据编程。作为响应,状态机可操作上述电路以执行编程操作。
图16是说明用于对连接至共同字线的存储器单元编程的处理的一个实施例的流程图。图16在图15的步骤636期间执行。在一个实施例中,图16的处理用于对连接至共同字线的所有存储器单元编程。在其它实施例中,图16的处理用于对连接至共同字线的存储器单元的子集进行编程。因此,对于包括多个字线的存储器块,图15的步骤636包括:针对每个字线执行图16的处理一次或多次,以对块中的存储器单元编程。
在一个示例中,对存储器单元根据包括如下的顺序进行编程:对连接至WL0的存储器单元编程,然后对连接至WL1的存储器单元编程,然后对连接至WL2的存储器单元编程,等等。也可以使用其它顺序。
在其它实施例中,对连接至第一字线的第一存储器单元集合进行多阶段编程处理的一部分阶段,接着对连接至第二字线的第二存储器单元集合进行该多阶段编程处理的一部分阶段,接着可对连接至第一字线的第一存储器单元集合进行该多阶段编程处理的一个或多个其它阶段。在这样的实施例中,在图15的步骤636期间,针对该多阶段编程处理的每个阶段,每存储器单元集合执行图16的处理一次。
在图16的步骤660中,系统会读取所存储的、初始编程脉冲的幅值(在下文中称为“Vpgm_vstart”,其可能基于前一编程值或默认值)的标识。如上所述,编程处理包括:每个脉冲的幅值增加的编程脉冲集合。例如,图17示出包括编程脉冲集合的编程电压的示例,其初始编程脉冲的幅值由Vpgm_vstart表示,而代表脉冲之间的增量的步长大小由ΔVpgm表示。在步骤660中读取第一脉冲Vpgm_vstart的幅值。在一个实施例中,根据一个或多个在先编程处理确定该幅值。如果这是首次进行编程,则可从寄存器读取Vpgm_vstart的默认值。初始编程脉冲的幅值Vpgm_vstart也可以存储在闪速存储器阵列、ROM或其他地方。
图16的处理使用两个不同的步长大小:ΔVpgm1和ΔVpgm2。在一个实施例中,ΔVpgm1大于ΔVpgm2。通过这种方式,图16的编程处理以较大的步长大小ΔVpgm1开始,使得编程的执行较快。当预定数量的存储器单元达到用于图16所示处理的相应性能的中间结果或条件时,则针对图16所示处理的剩余部分,所述处理切换至较小的步长大小以更加精确地继续将存储器单元编程至关于图16所示处理的特定性能的目标条件。例如,图18示出包括编程脉冲集合的编程电压,该编程脉冲集合具有初始编程脉冲幅值Vpgm_vstart,并且在初始时具有步长大小ΔVpgm1。在第6个脉冲之后,步长大小变为ΔVpgm2。在一个实施例中,如下所述,未预先确定步长大小发生改变时的脉冲。在预定数量的存储器单元达到中间条件(从而引起步长大小发生改变)时的编程脉冲的值用于精细调整初始编程脉冲的幅值Vpgm_vstart,用于进一步编程。也就是说,存储器单元的当前行为(例如,当该预定数量的存储器单元达到中间条件时)用于设置初始编程脉冲的幅值以在不引起过度编程的情况下增加编程处理的速度。在一个实施例中,ΔVpgm1等于ΔVpgm2。
回到图16,在步骤662中,关于该特定页面或字线加载数据。在步骤664中,将第一编程脉冲的幅值设置为在步骤660中读取的Vpgm_vstart的值。另外,将编程步长大小ΔVpgm设置为ΔVpgm1,且编程计数器PC被初始化为零。在步骤666中,施加第一编程脉冲。如上所述,在一个实施例中,通过图16所示处理进行编程的存储器单元被连接至共同字线,从而在它们各自的控制栅极接收相同的编程脉冲。在编程脉冲之后,在步骤668中对照电压Vvstart验证存储器单元。该电压值Vvstart是根据器件特征选择的,使得在一个(或其他不同数量的)编程脉冲之后经过Vvstart的任何存储器单元被认为是快速存储器单元。Vvstart的阈值电压电平是上述中间条件的一个示例。如果不到N个被进行编程的存储器单元具有大于Vvstart的阈值电压(步骤670),则在步骤671中,确定编程计数器是否小于20(或其他适当的值)。如果编程计数器不小于20,则已进行了太多的重复,且编程处理已失败。如果编程计数器小于20(或其他适当的值),则在步骤672中,编程电压递增ΔVpgm1,且编程计数器PC递增1。注意,在一些实施例中,可能优选将编程计数器增加不同于1的值,以反映更大的步长大小。例如,如果较大的步长大小是较小的步长大小的两倍大,则循环计数器可增加2。在步骤672后,所述处理环回到步骤666并且施加下一编程脉冲。重复步骤666-672,直到至少N个存储器单元具有大于Vvstart的阈值电压。在一个实施例中,N的值可以是15个存储器单元,在其它实施例中,N可以小于15(例如1或另一个数)或大于15。在一些实现中,可使用器件特征或其它仿真来确定适当的N值。但是,N的值可以是比进行编程的存储器单元总数更小的数。
在步骤670中,当确定N个或更多存储器单元具有大于Vvstart的阈值电压时,则所述处理进到步骤678,在该步骤678,将(前一)刚刚施加的编程脉冲的幅值存储在寄存器、闪速存储器位置中或其他地方,以用作用于后续编程的初始编程脉冲的幅值Vpgm_vstart或者用于确定用于后续编程的初始编程脉冲的幅值Vpgm_vstart。在一个实施例中,将刚刚施加的编程脉冲的幅值用作用于后续编程的初始编程脉冲的幅值Vpgm_vstart。在另一实施例中,将偏移量(正偏移量或负偏移量)加到刚刚施加的编程脉冲的幅值上以确定用于后续编程的初始编程脉冲的幅值Vpgm_vstart。在一些实施例中,在步骤678中存储刚刚施加的编程脉冲的幅值,稍后施加偏移量。在其它实施例中,对刚刚施加的编程脉冲的幅值使用该偏移量,并且在步骤678中存储该结果。在其它实施例中,关于用于后续编程的初始编程脉冲使用的值Vpgm_vstart基于刚刚施加的编程脉冲的幅值的数学函数或者刚刚施加的编程脉冲的序列号。所有上述这些实施例中,与刚刚施加的编程脉冲相关联地确定用于后续编程的初始编程脉冲的幅值Vpgm_vstart。回到图17,如果在第6个编程脉冲之后,确定出N个存储器单元具有大于Vvstart的阈值电压,则在步骤678中存储第6个编程脉冲(V_at_vstart)的幅值或该脉冲的其它相关指标(带偏移量会不带偏移量)。
在步骤680中,编程计数器PC被重置为0,并且所述处理进到步骤692,此时,对照用于不同编程状态的不同目标验证电平,验证所有的存储器单元。如果所有存储器单元经验证已达到其期望目标电平(步骤682),则所述处理完成并且状态被设为“通过”(步骤684)。在一些实施例中,如果并非所有存储器单元都达到其期望目标,该编程处理也可能成功完成。例如,在一些实施例中,如果几乎所有存储器单元都达到其期望的目标(例如,不超过预定数量的存储器单元来达到其目标),则该处理成功。未达到其目标的存储器单元可在读取操作期间使用纠错来纠正,或者,如果太多的存储器单元无法达到其目标,则数据可能被编程至存储器阵列中的其它地方。
如果并非所有存储器单元经验证(其很可能是首次执行步骤692),则已达到各自的目标阈值电压的存储器单元被锁定不进行进一步编程。在一个实施例中,如本领域所知的那样,通过施加足够大的比特线电压(例如Vdd),锁定存储器单元不对其进一步编程。
在一个实施例中,Vvstart被设置为足够低,使得当步骤670由于多于N个存储器单元已达到Vvstart而通过且所述处理从步骤670进入步骤678时,在施加至少一个其它附加编程脉冲之前,没有一个存储器单元已达到其目标电平。通过这种方式,在任何存储器单元被锁定不进行编程之前,编程步长大小ΔVpgm从ΔVpgm1变为ΔVpgm2。
如果并非所有存储器单元经验证,则在步骤686中确定编程计数器是否小于20(或另一适当的值)。如果编程计数器为20(或任何其他适当的值)或更大,则已执行太多的步骤并且所述处理失败(步骤694)。如果编程计数器仍小于20(或另一其他适当的值)或更大,则在步骤688中,编程电压递增ΔVpgm2且编程计数器递增1。在步骤690中,施加另一编程脉冲并且所述处理进入步骤692,对存储器单元进行验证。在一些实施例中,在步骤688中编程计数器可递增不同于1的值,以考虑步长大小的差异。注意,ΔVpgm2是比ΔVpgm1更小的步长大小。因此,与步骤690-688的循环期间较慢的编程电压Vpgm上升相比,在步骤666-672的循环期间,编程电压Vpgm增加快得多。
在一个实施例中,在步骤680中不重置编程计数器。在这样的实施例中,可改变步骤680中的测试,以确定编程计数器是否比高于20的数目小。
在一个示例中,图16所示处理与图6的全序列编程方案一起使用。在该实施例中,Vva可用作Vvstart,或者小于Vva的值可用作Vvstart。
存在以如下方式对第一存储器单元集合进行操作的多阶段编程处理,在该方式中,在对第一存储器单元集合进行操作的多阶段编程处理的阶段之间,可对第二存储器单元集合进行编程。但是,在一个实施例中,一旦针对一组存储器单元开始图16的处理,则在图16的处理结束之前,不会对其他存储器单元编程。
在步骤692的验证操作和步骤606的读取操作期间,选择的字线连接至一电压,该电压的电平是针对每个读取操作和验证操作而特别指定的(例如,参见图6的读取比较电平Vra、Vrb和Vrc,图6的验证电平Vva、Vvb和Vvc),以确定所关注的存储器单元的阈值电压是否已达到这样的电平。在施加字线电压后,测量存储器单元的传导电流,以确定存储器单元是否相应于施加至字线的电压而导通。如果测量出该传导电流大于特定值,则认为存储器单元导通且施加至字线的电压大于存储器单元的阈值电压。如果测量出传导电流不大于该特定值,则认为存储器单元未导通且施加至字线的电压不大于存储器单元的阈值电压。
存在许多方式用于在读取操作或验证操作期间测量存储器单元的传导电流。在一个示例中,通过存储器单元对感测放大器中的专用电容器放电或充电的速率,测量存储器单元的传导电流。在另一示例中,选中的存储器单元的传导电流使得(或无法使得)包括该存储器单元的NAND串使相应的比特线放电。在一段时间后测量该比特线上的电压,以查看该比特线是否已被放电。应当注意,这里描述的技术能够与本领域中已知的用于验证/读取的不同方法一起使用。在以下通过引用而全部并入本文的专利文献中有更多关于验证/读取的信息:(1)美国专利申请公布No.2004/0057287;(2)美国专利申请公布No.2004/0109357;(3)美国专利申请公布No.2005/0169082;以及(4)美国专利申请公布No.2006/0221692。上述擦除、读取和验证操作可根据本领域已知的技术执行。因此,本领域技术人员可修改这里描述的很多细节。也可以使用本领域中已知的其他擦除、读取和验证技术。
图19-26是说明用于实现图15的步骤636、对存储器单元编程、使用图16的处理的不同实施例的流程图。
图19描述用于实现多阶段编程处理(或者多个编程处理)的实施例,该多阶段编程处理包括任一上述多阶段编程处理。在图19的实施例中,Vpgm_vstart在多阶段编程处理的第一阶段期间更新,并且同一多阶段编程处理的其它阶段使用来自第一阶段的Vpgm_vstart。在步骤702中,执行该多阶段编程处理的第一阶段,包括执行根据图16所示的处理。如上所述,执行图16的处理包括:在图16的步骤678中更新Vpgm_vstart的值。在步骤704,执行该多阶段编程处理的第二阶段,包括执行图16的处理,其中用于初始编程脉冲的幅度Vpgm_vstart的值为(或者基于)在步骤702中更新和存储的值。在执行步骤704时,修改图16的处理以省略步骤678,使得如果多于N个存储器单元具有大于Vvstart的阈值电压,则所述处理从步骤670进入步骤692(或者,在一些实施例中,进入步骤680)。通过这种方式,在步骤704的执行期间不更新Vpgm_vstart。在步骤706中,执行多阶段编程处理的第三阶段,包括执行图16的处理,其中用于初始编程脉冲的幅度Vpgm_vstart的值为(或者基于)在步骤702中更新和存储的值。在执行步骤706时,修改图16的处理以省略步骤678,使得如果多于N个存储器单元具有大于Vvstart的阈值电压,则所述处理从步骤670进入步骤692(或者,在一些实施例中,进入步骤680)。通过这种方式,在步骤706的执行期间不更新Vpgm_vstart。
在步骤708中,执行多阶段编程处理的第四阶段,包括执行图16的处理,其中用于初始编程脉冲的幅度Vpgm_vstart的值为(或者基于)在步骤702中更新和存储的值。在执行步骤708时,修改图16的处理以省略步骤678,使得如果多于N个存储器单元具有大于Vvstart的阈值电压,则所述处理从步骤670进入步骤692(或者,在一些实施例中,进入步骤680)。通过这种方式,在步骤708的执行期间不更新Vpgm_vstart。在图19的流程图中,在多阶段编程处理中示出四个阶段。但是,通过增加另外的步骤例如步骤708,图19的处理能够扩展至多于四个阶段。或者,通过仅仅执行步骤702、704和706,图19的处理能够与具有仅仅三个阶段的多阶段编程处理一起使用。通过仅仅执行步骤702和704,图19的处理能够与具有仅仅两个阶段的多阶段编程处理一起使用。应当注意,在一些实施例中,可针对多阶段编程处理的每个阶段改变ΔVpgm2的值。在其它实施例中,每个阶段使用相同的ΔVpgm2。类似地,在一些实施例中,可针对多阶段编程处理的每个阶段改变ΔVpgm1的值。在其它实施例中,每个阶段使用相同的ΔVpgm1。
在另一实施例集合中,步骤702包括执行图16所示处理并且为Vpgm_vstart存储新的值。但是,步骤704、706和708会执行图19A的处理,而不是图16的处理。图19A与图16类似,但是不执行步骤666、668、670、671、672、678和680。步骤660和662与图16中的相同。在步骤664a中,ΔVpgm设置为ΔVpgm2,然后所述处理进入步骤690并且施加编程脉冲。步骤682、684、686、688、690、692和694与图16中的相同。利用该实施例,由于早已找到最优Vpgm_vstart,所以不存在用于搜索最优Vpgm_vstart的时间。注意,在一些实施例中,可针对多阶段编程处理的每个阶段改变ΔVpgm2的值。在其它实施例中,每个阶段使用相同的ΔVpgm2。
在一个示例中,图19的处理与图7的编程方案一起使用。在该实施例中,Vra或低于Vva的另一个值可用作Vvstart。当图19的处理与图8的编程方案一起使用时,可将低于Vvb’的值用作Vvstart。当将图19的处理与图9A-9C的编程方案一起使用时,在将数据编程至C状态时可将Vva、低于Vva的值或低于Vvc的值用作Vvstart。当将图19的处理与图10A-10D的编程方案一起使用时,在将数据编程至B’时可将低于Vvb’的值用作Vvstart。当将图19的处理与图11A-11B的编程方案一起使用时,在将数据编程至A*、B*或C*时可将位于或低于Vva*的值用作Vvstart。当将图19的处理与图12A-12E的编程方案一起使用时,在将数据编程至S4’时可将低于Vvs4’的值用作Vvstart。当将图19的处理与图13A-13D的编程方案一起使用时,在将数据编程至A2、B2和C2时可将位于或低于VvA2的值用作Vvstart。另外,也可使用其他用于Vvstart的值。这些Vvstart值也可与以下描述的其他实施例一起使用。
图20描述用于实现多阶段编程处理(或者多个编程处理)的实施例,该多阶段编程处理包括任一上述多阶段编程处理。在图20的实施例中,Vpgm_vstart在多阶段编程处理的每一阶段期间更新。在步骤724中,执行该多阶段编程处理的第一阶段,包括执行图16的处理。如上所述,执行图16的处理包括:在图16的步骤678中更新Vpgm_vstart的值。在步骤726中,执行该多阶段编程处理的第二阶段,包括执行图16的处理,其中用于Vpgm_vstart的值为(或者基于)在步骤724中更新和存储的值。步骤726可包括更新图16的步骤678中的Vpgm_vstart的值。在步骤728中,执行多阶段编程处理的第三阶段,包括执行图16的处理,其中用于Vpgm_vstart的值为(或者基于)在步骤726中更新和存储的值。步骤728可包括在图16的步骤678中更新Vpgm_vstart的值。在步骤730中,执行多阶段编程处理的第四阶段,包括执行图16的处理,其中用于Vpgm_vstart的值为(或者基于)在步骤728中更新和存储的值。步骤730可包括在图16的步骤678中更新Vpgm_vstart的值。
在图20的流程图中,在多阶段编程处理中示出四个阶段。但是,通过增加与步骤730类似的另外的步骤,图20的处理能够扩展至多于四个阶段。或者,通过仅仅执行步骤724、726和728,图20的处理能够与具有仅仅三个阶段的多阶段编程处理一起使用。通过仅仅执行步骤724和726,图20的处理能够与具有仅仅两个阶段的多阶段编程处理一起使用。
图21描述用于实现多编程处理的另一实施例。在图21的实施例中,在对第一页面编程时更新Vpgm_vstart,并且对以后页面的编程使用在对第一页面编程时确定的Vpgm_vstart。在步骤760中,使用图16的处理对第一数据页面编程,包括在图16的步骤678中更新Vpgm_vstart的值。在步骤762中,使用图16的处理对第二页面编程,其中用于Vpgm_vstart的值为(或者基于)在步骤760中更新和存储的值。在执行步骤762时,修改图16的处理以省略步骤678,使得如果多于N个存储器单元具有大于Vvstart的阈值电压,则所述处理从步骤670进入步骤692。通过这种方式,在步骤762的执行期间不更新Vpgm_vstart。在步骤764中,使用图16的处理对第三页面编程,其中用于Vpgm_vstart的值为(或者基于)在步骤760中更新和存储的值。在执行步骤764时,修改图16的处理以省略步骤678,使得如果多于N个存储器单元具有大于Vvstart的阈值电压,则所述处理从步骤670进入步骤692。通过这种方式,在步骤764的执行期间不更新Vpgm_vstart。如果需要对更多的数据页面编程,则以与步骤764类似的步骤继续所述处理,但是是对不同的数据页面进行操作。如果仅仅对两个数据页面编程,则仅仅需要执行步骤760和762。在另一实施例中,通过使用来自步骤760的Vpgm_vstart,步骤762、764和用于其它页面的步骤基于图19A的处理(而不是上述经修改的图16的版本)进行编程。
图22描述用于实现多编程处理的另一实施例。在图19的实施例中,在每个数据页面的编程期间更新Vpgm_vstart。在步骤782中,使用图16的处理对第一数据页面编程,包括在图16的步骤678中更新Vpgm_vstart的值。在步骤784中,对第二数据页面编程,包括执行图16的处理,其中,用于Vpgm_vstart的值为(或者基于)在步骤782中更新和存储的值。步骤784可包括在图16的步骤678中更新Vpgm_vstart的值。在步骤786中,对第三数据页面编程,包括执行图16的处理,其中,用于Vpgm_vstart的值为(或者基于)在步骤784中更新和存储的值。步骤786可包括在图16的步骤678中更新Vpgm_vstart的值。如果需要对更多的数据页面编程,则以与步骤786类似的步骤继续所述处理,但是是对不同的数据页面进行操作。如果仅仅对两个数据页面编程,则仅仅需要执行步骤782和784。
图23描述用于实现多个编程处理的实施例。在图23的实施例中,在对连接至第一字线的存储器单元编程时更新Vpgm_vstart,且对其它字线上的存储器单元的编程使用在对连接至第一字线的存储器单元编程时确定的Vpgm_vstart。在步骤800中,使用图16的处理对连接至第一字线的存储器单元编程,包括在图16的步骤678中更新Vpgm_vstart的值。在步骤802中,使用图19A的处理或图16的处理对连接至第二字线的存储器单元编程,其中,用于Vpgm_vstart的值为(或者基于)在步骤800中更新和存储的值。在使用图16的处理执行步骤802时,修改图16的处理以省略步骤678,使得如果多于N个存储器单元具有大于Vvstart的阈值电压,则所述处理从步骤670进入步骤692。通过这种方式,在步骤802的执行期间不更新Vpgm_vstart。在步骤804中,使用图19A的处理或图16的处理对连接至第三字线的存储器单元编程,其中,用于Vpgm_vstart的值为(或者基于)在步骤800中更新和存储的值。在使用图16的处理执行步骤804时,修改图16的处理以省略步骤678,使得如果多于N个存储器单元具有大于Vvstart的阈值电压,则所述处理从步骤670进入步骤692。通过这种方式,在步骤804的执行期间不更新Vpgm_vstart。如果需要对更多的字线编程,则以与步骤804类似的其他步骤继续所述处理,但是是对不同的字线进行操作。如果仅仅对两个字线编程,则仅仅需要执行步骤800和802。
在一些实施例中,也可以针对偶数字线和奇数字线单独确定初始编程脉冲赋值。如果由于制造处理不同而导致偶数字线和奇数字线具有不同的编程特征,则该方案是有益的。
图24描述用于实现多个编程处理的实施例。在图24的实施例中,周期性更新Vpgm_vstart。在更新之间,使用先前确定的Vpgm_vstart的值。在步骤820中,使用图16的处理对存储器单元编程,包括在图16的步骤678中更新Vpgm_vstart的值。在下次需要对数据编程时,在步骤822中,系统确定从存储最近确定的Vpgm_vstart值时开始经过的时间是否大于预定时间段。如果不大于预定时间段,则接下来的步骤824编程处理使用图16的处理,但不更新Vpgm_vstart。也就是说,修改图16的处理以省略步骤678,使得如果多于N个存储器单元具有大于Vvstart的阈值电压,则所述处理从步骤670进入步骤692。或者,能够通过执行步骤19A的处理实施步骤824。如果在步骤822中确定从存储最近确定的Vpgm_vstart值时开始经过的时间大于预定时间段,则在步骤826中,使用图16的方法执行下一编程处理,包括在图16的步骤678中更新Vpgm_vstart的值。
图25描述用于实现多个编程处理的实施例。在该实施例中,在试验编程期间,在执行图16的处理时更新Vpgm_vstart的值。在试验编程中,不对用户数据编程。相反,使用图16的处理对哑元数据和/或哑元存储器单元进行编程,并且在该处理期间更新Vpgm_vstart。接着,在编程用户数据时,使用图16的处理,其中,Vpgm_vstart为(或者基于)基于试验编程的值,并且在对用户数据编程期间不更新Vpgm_vstart。例如,在步骤840中,(通过使用图16的处理)执行试验编程并且更新Vpgm_vstart。在步骤842中,使用图16的处理以及基于试验编程的Vpgm_vstart对用户数据编程。在步骤842期间不更新Vpgm_vstart。也就是说,修改图16的处理以省略步骤678,使得如果多于N个存储器单元具有大于Vvstart的阈值电压,则所述处理从步骤670进入步骤692。在步骤844中,使用图16的处理以及基于试验编程的Vpgm_vstart对用户数据编程。在步骤844期间不更新Vpgm_vstart。也就是说,修改图16的处理以省略步骤678,使得如果多于N个存储器单元具有大于Vvstart的阈值电压,则所述处理从步骤670进入步骤692。在不更新Vpgm_vstart的情况下,也可以执行对用户数据编程的其他步骤。在一些实施例中,在步骤842后可停止图25的处理。在可替选实施例中,可通过执行图19A的处理(包括不更新Vpgm_vstart)而不是对图16所示处理的上述修改实现步骤842和844。
应当注意,本文描述的用于执行多个编程处理的方法可用于执行一个或多个多阶段编程处理的多个阶段。
图26描述用于实现多阶段编程处理(包括任一上述多阶段编程处理)的另一个实施例。在图26的实施例中,在多阶段编程处理的第二阶段中更新Vpgm_vstart。在步骤846中,使用不更新Vpgm_vstart的图16的处理执行多阶段编程处理的第一阶段。也就是说,修改图16的处理以省略步骤678,使得如果多于N个存储器单元具有大于Vvstart的阈值电压,则所述处理从步骤670进入步骤692。或者,可使用图19A的处理。在步骤848中,使用图16的处理执行多阶段编程处理的第二阶段,其中更新Vpgm_vstart。在步骤850中,使用图16的处理执行多阶段编程处理的第三阶段,其中,用于Vpgm_vstart的值为(或者基于)在步骤848期间执行的步骤678中存储的值。在一些实施例中,步骤890可包括更新Vpgm_vstart,而在其他实施例中,在步骤890中不会更新Vpgm_vstart。在图26的处理中可添加类似步骤890的其他步骤。
通常,粗略/精细编程包括双阶段编程方式。第一阶段为粗略阶段,其中,重点在于快速编程,所需精度较低。第二阶段为精细阶段,其中,重点在于精确地编程。在一个实施例中,粗略阶段包括编程至一个或多个粗略验证电平,而精细阶段包括编程至一个或多个精细验证电平,其中,精细验证电平对应于用于编程的目标电平。
上述图11A和图11B提供了使用两个阶段的粗略/精细编程的一个示例。在第一趟(图11A)中实现粗略阶段。在第二趟(图11B)中实现第二阶段。图27和图28包括的曲线示出使用仅仅一个阶段的粗略/精细编程的实施例,在该一个阶段期间,粗略阶段和精细阶段两者均执行。
图27A、27B和27C示出快速存储器单元的行为,该快速存储器单元的阈值电压在同一脉冲中通过粗略验证电平和精细验证电平两者,使得该存储器单元不进入精细模式。图28A、28B和28C示出参与粗略模式和精细模式两者的较慢存储器单元。图27A和图28A示出施加到正被编程的存储器单元控制栅极的编程脉冲Vpgm。注意,图27A和图28A彼此相邻地示出编程脉冲,以使得曲线更易于读懂。但是,在编程脉冲之间实际上具有脉冲,以允许实现验证操作。图27B和图28B示出正被编程的存储器单元的比特线电压Vbl。图27C和图28C示出正被编程的存储器单元的阈值电压。
关于图27A、27B和27C,示出快速存储器单元。响应于始于时间t0的第一脉冲,存储器单元的阈值电压被提升至Vver3之上。在一个实施例中,验证电平Vver3对应于图16的Vvstart。在t1与t2之间,存储器单元的阈值电压升至Vver2(粗略验证电平)和Vver1(精细验证电平)之上。在t2,比特线电压会升至Vinhibit,以禁止(例如锁定)不进行进一步编程。注意,在一个实施例中,Vver3可以是0.2V至0.3V,低于用于最低被编程状态的Vver2。
关于图28A至图28C的较慢存储器单元,在t2与t3之间的时间段之前,存储器单元的阈值电压不会升至Vver3之上。因此,在t3之前,编程脉冲递增ΔVpgm1。如果在t3时页面中多于N个存储器单元中的阈值电压大于Vver3,则脉冲递增值在t3变为ΔVpgm2,且后续脉冲的幅值增加ΔVpgm2。在t3与t4之间,存储器单元中的阈值电压增加至Vver2之上,因此,存储器单元进入精细编程阶段并且比特线在t4升至Vs(例如~.2-.5V,或者另一合适的值)。在t4与t5之间,由于比特线电压升高且由于Vpgm递增值降低,阈值电压上升变慢。但是,在t4与t5之间,阈值电压未变得大于Vver1;因此,阈值电压已达到其目标电平并且比特线电压被提升至Vinhibit以禁止在t5进一步编程。粗略/精细编程技术可与上述各种编程处理结合使用。
图29提供用于编程的另一个实施例。图29示出图16所示处理的可替选实施例,该实施例包括用于在该处理后期更加精确地确定后续Vpgm_vstart值的步骤922和步骤924。图29的步骤900-912与图16的步骤660-672相同。步骤926、928、930、938、932和934与图16的步骤682、684、686、694、688和690相同。如果在图29的步骤910中确定N个或更多存储器单元具有大于Vvstart的阈值电压,则图29的处理从步骤910进入步骤914,并且将编程计数器PC重置为零。在步骤914之后,所述处理进入步骤920。图29的步骤920与图16的步骤692相同。在步骤920中验证存储器单元之后,步骤922包括:确定是否有至少M个存储器单元已达到它们的目标阈值电压电平并且已被锁定不进行其他编程。在一个实施例中,M可等于15个存储器单元。在其他实施例中,可使用多于或少于15个。如果至少M个存储器单元未达到它们的阈值电压电平且已被锁定不进行其他编程,则所述处理继续进入步骤926。但是,如果已锁定M个存储器单元,则记录在最近期所施加的脉冲的脉冲幅值并且所述处理继续进入步骤926。注意,系统仅在首次确定M个存储器单元已达到它们的阈值电压电平且已被锁定不进行其他编程时记录幅值(或其他数据)。
步骤924的一个实施例包括:将刚刚施加的编程脉冲的幅值存储在寄存器、闪速存储器位置中或其他地方,以用作初始编程脉冲的幅值或者确定初始编程脉冲的幅值Vpgm_vstart,用于后续编程。在一个实施例中,刚刚施加的编程脉冲的幅值被用作初始编程脉冲的幅值Vpgm_vstart,用于后续编程。在另一实施例中,将偏移量(正偏移量或负偏移量)加到刚刚施加的编程脉冲的幅值上以确定用于后续编程的初始编程脉冲的幅值Vpgm_vstart。在一些实施例中,在步骤924中存储刚刚施加的编程脉冲的幅值,稍后施加偏移量。在其它实施例中,对刚刚施加的编程脉冲的幅值使用该偏移量,并且在步骤924中存储该结果。在其它实施例中,通过使用数学公式或其他方式,使用刚刚施加的编程脉冲的幅值或刚刚施加的该脉冲的标识来确定用于后续编程的初始编程脉冲的幅值Vpgm_vstart。
使用来自步骤924的脉冲幅值的一个优势在于:如果ΔVpgm2小于ΔVpgm1,则对于步骤924中存储的脉冲幅值,分辨率会更高。图29的处理可与上述实施例、包括图6-13中示出的实施例一起使用。
以上描述提供了会基于先前的编程处理而动态调整初始编程脉冲的幅值的系统的示例。在一些实施例中,编程处理包括多个阶段,其中,第一阶段会包括设置用于后续阶段的初始编程脉冲幅值。通过以最优的初始幅值对后续阶段编程,能够缩短编程时间(较少的编程循环)。再未如上所述动态设置初始编程电压的一些在先的系统中,通常将初始编程电压设置为比优化值小很多,以为器件中的循环和编程速度变化留有余量。
在一些上述实施例中,在第一编程阶段期间的编程脉冲之间,第一编程阶段使用较大的步长大小(ΔVpgm)以节省编程时间。但是,为检测用于后续阶段的最优的初始编程电压Vpgm_vstart,因为通常以较小的大小对后续阶段编程,所以期望较小的步长大小。使用较小的步长大小来确定Vpgm_vstart可提供更大的分辨率。但是,使用较小的步长大小也增加执行编程所需的时间。
下面描述使得能够关于Vpgm_vstart实现更高的分辨率的实施例,但没有缘于使用较小的步长大小引起的全部时间损失。在一个实施例中,当所需最小数量的存储器单元已经过用于确定用于后续编程的Vpgm_vstart的第一验证电平Vvstart(或另一条件)时,可在与第一验证电平不同的电平执行一个或多个附加的(或可替选的)验证操作(以测试一个或多个可替选的条件),以增加确定初始编程脉冲Vpgm_vstart时的分辨率。在一个示例中,在与Vvstart相差当前步长大小的一半(或另一比例)的第二验证电平(例如,Vvstart-2)执行一个附加验证步骤,在这样的情况下,能够以分辨率ΔVpgm/2确定新的初始编程脉冲。在其他实施例中,可进行多于一个附加验证操作,以进一步增加确定初始编程脉冲时的分辨率。该技术的一个优势在于:为了获取更高的分辨率,不必减小在第一阶段编程期间的步长大小。仅有的编程时间增加是由一个或更多附加验证操作引起的,这不会显著增加编程时间。
图30示出在直到系统检测出要在图16的步骤678中存储的编程脉冲幅值之前响应于编程处理的第一阶段的最初5个编程脉冲的阈值电压分布移动的图形表示。在图30的示例中,在直到足够数量的存储器单元(例如,15个)已达到Vvstart之前,施加了5个编程脉冲。可以看出,由阴影区域表示的一些存储器单元具有大于Vvstart的阈值电压。在步骤678中,所施加的最末编程脉冲(第5个编程脉冲)的幅值存储为Vpgm_vstart,或者用于计算Vpgm_vstart。
图31示出在直到检测出多于N个存储器单元具有大于Vvstart的阈值电压之前响应于编程处理的最初3个编程脉冲(脉冲1、脉冲2、脉冲3)的阈值电压分布移动的图形表示。在这种情况下,也出现多于N个存储器单元具有大于Vvstart-2的阈值电压。在这种情况下,执行一个或多个附加的/可替选的验证操作。例如,可在Vstart-2(可替选的结果)执行一个附加的/可替选的验证操作。当执行该附加的/可替选的验证操作时,确定出多于N个存储器单元具有大于Vvstart-2的阈值电压。在该示例中,Vvstart比Vvstart-2大ΔVpgm/2(但是也可能是其他值)。在这种情况下,用于确定用于后续阶段的初始编程电压Vpgm_vstart的编程脉冲幅值会从脉冲3的幅值下降ΔVpgm/2(但是也可能是其他值)。也就是说,存储为下一初始编程脉冲幅值的值等于第三编程脉冲的幅值减去Δverify或者由第三编程脉冲的幅值减去Δverify定义,其中,Δverify被定义为两个验证电平Vvstart与Vvstart-2之间的差。
图32提供关于与图31所示示例相比编程较慢的存储器单元的集合的另一示例。在该示例中,在第三编程脉冲(脉冲3)之后,足够数量的存储器单元已经过Vvstart,但是,未有足够数量的存储器单元经过Vvstart-2。因此,用于确定用于后续阶段的初始编程电压Vpgm_vstart的编程脉冲幅值将是第二编程脉冲的幅值。
在其他实施例中,可使用多于一个附加的/可替选的验证操作,以进一步增加确定初始编程脉冲时的分辨率。例如,系统能够测试存储器单元,以确定是否有多于N(或另一数目)个存储器单元具有大于Vvstart-2和Vvstart-3的阈值电压,其中,这两个验证电平Vvstart与Vvstart-2之间的差为ΔVpgm/3,且两个验证电平Vvstart-2与Vvstart-3之间的差也为ΔVpgm/3。因此,两个验证电平Vvstart与Vvstart-3之间的差为(2)*ΔVpgm/3。如果使用X个附加的/可替选的验证操作,则系统会在Vvstart、Vvstart-2、Vvstart-3,......,Vvstart-X处进行验证,其中,Vvstart-X与Vvstart相差(X)*ΔVpgm/(1+X)。
该技术的优势在于:不必减小在第一阶段编程期间的编程脉冲的步长大小。可使用与未采用该技术时相同的步长大小,从而第一阶段的编程循环的数量不会增加。
在一些实施例中,Vvstart是要在第一阶段期间编程的最低阈值电压分布(例如,分布A)的验证电平。在一些实施例中,Vvstart-2是要在第一阶段期间编程的最低阈值电压分布(例如,分布A)的验证电平,而Vvstart小于最低阈值电压分布的验证电平。在其他实施例中,Vvstart和Vvstart-2可均小于第一分布的验证电平。在一些实施例中,Vvstart为要在第一阶段期间编程的最低阈值电压分布的粗略/精细编程中使用的最低验证电平,而Vvstart-2可以等于要在第一阶段期间编程的最低阈值电压分布的验证电平。在检测到初始编程幅值用于后续编程阶段后,可以以相同的步长大小继续编程,以将分布编程为等于或大于Vvstart-2。在一些情况下,可能期望在检测到初始编程脉冲后降低步长大小,以允许更精确的编程。这里描述的技术可与第7,092,290号美国专利的处理结合。
上述关于使用附加的/可替选的验证电平来增加分辨率的技术可与图16的处理一起使用。图33是描述要加入到图16的处理中的流程图。图33的流程图中示出的步骤代替图16的步骤678。例如,在图16的步骤670确定出N个或更多存储器单元具有大于Vvstart的阈值电压之后,在图33的步骤970继续进行处理。在步骤970中,系统确定是否有P个或更多存储器单元具有大于Vvstart-2的阈值电压(其中,P可与N相同或不同)。如果有P个或更多存储器单元具有大于Vvstart-2的阈值电压,则在步骤972中,用于确定下一个Vpgm_vstart的幅值为(施加的最后脉冲的幅值)-(Δverify)。步骤972包括存储(施加的最后脉冲的幅值)-(Δverify),如上文关于步骤678所述。或者,步骤972包括存储(施加的最后脉冲的幅值)-(Δverify)+(偏移量)。在另一可替选方式中,系统可存储(施加的最后脉冲的幅值)-(Δverify)的另一函数,施加的最后脉冲的标识与Δverify的函数,施加的最后脉冲的标识与Δverify的函数,或者以上的组合或子集。也可使用除Δverify外的值。在步骤972之后,在图16的步骤692继续进行处理。
如果在步骤970中确定出未有P个具有大于Vvstart-2的阈值电压的存储器单元,则在步骤974中,用于确定下一个Vpgm_vstart的幅值为施加的最后脉冲的幅值。步骤974包括存储施加的最后脉冲的幅值,如上文中关于步骤678所述。或者,步骤972包括存储(施加的最后脉冲的幅值)+(偏移量)。在另一个可替选方式中,系统可存储所施加的最后脉冲的幅值、施加的最后脉冲的标识、施加的最后脉冲的标识的函数、或者以上的组合或子集的另一函数。在步骤974之后,在图16的步骤692继续进行处理。
类似地,图29的步骤924可用图33的处理代替。也就是说,如果已锁定M个存储器单元,则在步骤970继续进行处理。在步骤972或974之后,在图29的步骤926中继续进行处理。
图34是描述在系统执行两个额外验证操作以测试两个可替选结果时要被加入到图16中的处理的流程图。注意,可调整图34的处理以测试多于两个可替选结果。在图34的流程图中示出的步骤代替图16的步骤678。例如,在图16的步骤670确定出N个或更多存储器单元具有大于Vvstart的阈值电压之后,在图34的步骤980中继续进行处理。在步骤980中,系统确定是否有P个或更多存储器单元具有大于Vvstart-2的阈值电压(其中,P可与N相同或不同)。如果确定出未有P个具有大于Vvstart-2的阈值电压的存储器单元,则在步骤982中,用于确定下一个Vpgm_vstart的幅值或脉冲为所施加的最后脉冲的幅值。步骤982包括存储所施加的最后脉冲的幅值,如上文关于步骤678所述。或者,步骤982包括存储(施加的最后脉冲的幅值)+(偏移量)。在另一可替选方式中,系统可存储所施加的最后脉冲的幅值、最后脉冲的标识或者最后脉冲的标识的函数的另一个函数。在步骤982之后,在图16的步骤692继续进行处理。
如果P个或更多存储器单元具有大于Vvstart-2的阈值电压,则在步骤984中,确定是否有T个或更多具有大于Vvstart-3的阈值电压的存储器单元。T的值可与N相同或不同。如果确定出未有T个具有大于Vvstart-3的阈值电压的存储器单元,则在步骤988中,用于确定下一个Vpgm_vstart的幅值为(施加的最后脉冲的幅值)-(Δverify1)。步骤986包括存储(施加的最后脉冲的幅值)-(Δverify1),如上文关于步骤678所述。或者,步骤988包括存储(施加的最后脉冲的幅值)-(Δverify1)+(偏移量)。在另一可替选方式中,系统可存储(施加的最后脉冲的幅值)-(Δverify1)、最后脉冲的标识与(Δverify1)的函数、最后脉冲的标识与(Δverify1)的函数、或者以上的组合或子集的另一个函数。也可使用不同于Δverify1的值。在步骤988之后,在图16的步骤692继续进行处理。在该实施例中,Δverify1被定义为Vvstart与Vvstart-2之间的差。
如果确定出有T个或更多具有大于Vvstart-3的阈值电压的存储器单元,则在步骤986中,用于确定下一个Vpgm_vstart的幅值为(施加的最后脉冲的幅值)-(Δverify2)。步骤986包括存储(施加的最后脉冲的幅值)-(Δverify2),如上文关于步骤678所述。或者,步骤986包括存储(施加的最后脉冲的幅值)-(Δverify2)+(偏移量)。在另一可替选方式中,系统可存储(施加的最后脉冲的幅值)-(Δverify2)、最后脉冲的标识与(Δverify2)的函数、最后脉冲的标识与(Δverify2)的函数、或者以上的组合或子集的另一个函数。在步骤986之后,在图16的步骤692继续进行处理。在该实施例中,Δverify2被定义为Vvstart与Vvstart-3之间的差。
类似地,图29的步骤924可用图34的处理代替。也就是说,如果已锁定M个存储器单元,则在步骤980继续进行处理。在步骤982、986或988之后,在图29的步骤926中继续进行处理。
图33和图34的处理可与图29或图16的处理一起使用,以实现任一上述编程方案。在图33或图34的处理可与图29的处理一起使用以实现图8A-图8C的编程方案的一个示例中,第一编程阶段可包括编程至阈值电压Vvb’以及确定用于Vpgm_vstart的新的值。使用来自第一阶段的Vpgm_vstart(具有偏移量),第二阶段可使用图29的处理以编程至A、B和C状态,如图8C所示。
上文中提供了对本发明的具体描述以用于进行阐述和说明。但并非要穷举或者将本发明限于所公开的精确形式。根据以上教导,可实现很多修改和变型。上述实施例被选取用于最佳地解释本发明的原理及其实际应用,从而使得本领域技术人员能够以不同的实施例并利用适于特定预期用途的不同变型来最佳地利用本发明。本发明的范围要由所附权利要求来定义。