Abstract:
A method of programming a memory cell that has 2 N  voltage levels where N&gt;1 and represents the number of bits stored within the memory cell. The method includes setting a target number T of piggyback programming pulses for programming each of 2 N −1 vt levels of the memory cell, applying T piggyback programming pulses to the memory cell and determining when the highest one of the 2 N −1 vt levels is programmed. If it is determined that the highest one of the 2 N −1 vt levels is programmed by a number M of piggyback programming pulses that is less than the target number T, then compensating the programming speed of those ones of said T number of piggyback programming pulses subsequent to the Mth piggyback programming pulse.

Description:
BACKGROUND OF THE INVENTION 
     1. Field of the Invention 
     The present invention relates to the field of non-volatile memory devices. More particularly, the invention relates to a method of programming multi-bit flash electrically erasable programmable read only memory (EEPROM) cells that utilize the phenomena of hot electron injection to trap charge within a trapping dielectric material within the gate. 
     2. Discussion of Related Art 
     Memory devices for non-volatile storage of information are currently in widespread use today, being used in a myriad of applications. A few examples of non-volatile semiconductor memory include read only memory (ROM), programmable read only memory (PROM), erasable programmable read only memory (EPROM), electrically erasable programmable read only memory (EEPROM) and flash EEPROM. 
     Semiconductor EEPROM devices involve more complex processing and testing procedures than ROM, but have the advantage of electrical programming and erasing. Using EEPROM devices in circuitry permits in-circuit erasing and reprogramming of the device, a feat not possible with conventional EPROM memory. 
     Flash EEPROMs are similar to EEPROMs in that memory cells can be programmed (i.e., written) and erased electrically but with the additional ability of erasing all memory cells at once, hence the term flash EEPROM. A Flash device is a non-volatile memory comprising an array of cells that can store a pre-determined number of logic “0”&#39;s and “1”&#39;s. The stored “1”s and “0”s maintain their state in the absence of external power. These bits can be modified millions of times over the life-time of the device. 
     An example of a typical configuration for an integrated circuit including a multi-level cell flash memory array  100  and circuitry enabling programming, erasing, and reading for memory cells in the array  100  is shown in FIG.  1 . The flash memory array  100  includes individual cells  102 . Each cell  102  has a drain connected to a bitline  104 , each bitline being connected to a bitline pull up circuit  106  and column decoder  108 . The sources of the array cells are connected to Vss, while their gates are each connected by a wordline  109  to a row decoder  110 . 
     The row decoder  110  receives voltage signals from a power supply  112  and distributes the particular voltage signals to the wordlines as controlled by a row address received from a processor or state machine  114 . Likewise, the bitline pull up circuit  106  receives voltage signals from the power supply  112  and distributes the particular voltage signals to the bitlines as controlled by a signal from the processor  114 . Voltages provided by the power supply  112  are provided as controlled by signals received from processor  114 . 
     The column decoder  108  provides signals from particular bitlines  104  to sense amplifiers or comparators  116  as controlled by a column address signal received from processor  114 . The sense amplifiers  116  further receive voltage reference signals from reference  118 . The outputs from sense amplifiers  116  are then provided through data latches or buffers  120  to processor  114 . 
     As mentioned above, the memory array  100  includes multi-level storage cells  102 . Multi-level storage refers to the ability of a single memory cell  102  to represent more than a single binary bit of data. A conventional memory cell depicts two states or levels, usually referred to as logic “0” and logic “1”. A multi-level cell could represent as many as 256 states, or a byte of information. 
     Multi-level cell storage is obtainable in flash design because a flash memory cell can be programmed to provide multiple threshold voltage (vt) levels. The different vt levels can be sustained over time in a flash memory cell  102 , even after repeated accesses to read data from the cell. For example, 16 vt levels stored in a flash memory cell can represent data in four conventional memory cells. Thus, an array of multi-level flash memory cells  102  which can store up to 16 vt levels can provide 4 times the storage capacity of conventional memory cells which only store a binary bit per cell. An example of a multi-level memory array is discussed in U.S. Pat. No. 5,973,958, the entire contents of which are incorporated herein by reference. 
     Programming of the flash memory array  100  is executed on a word-line basis. The word-line  109  is considered the row address. The word-line will cross multiple bit-lines  104 . The bit-line  104  is considered the column address. Each bit-line  104  contains buffer logic to interface to the selected core cell during program, read and erase operations. 
     FIG. 2 illustrates a selected and unselected bit-line during programming. The unselected bit (bit not to be programmed) is considered inhibited. The bit-line is inhibited from the effects of the program pulse. The selected bit (bit to be programmed) is referred to as uninhibited. This bit will be programmed during the program pulse. 
     To program a multi-level cell in the flash memory array  100 , high gate-to-drain voltage pulses are provided to the cell from power supply  112  while a source of the cell is grounded. For instance, during programming typical gate voltage pulses of 18V are each applied to a cell, while a drain voltage of the cell is set to 3.3V and its source is grounded. 
     As shown in FIG. 2, the program voltage PVpp of 18V will be applied to the selected word-line (column address). A substantially lesser voltage, such as 10V, will be applied to unselected word-lines. An uninhibited word-line will have a strong field generated across the device. In particular, FIG. 2 shows that with Vss=0V being applied to one end of a bit-line  109  to be uninhibited, the source/drain regions of the bit-line will couple to 0V or ground. This will make the applied field appear much stronger so that effective programming can occur. A high field generated across the memory device will cause electron injection into the floating gate of the selected cell exponentially proportional to strength of the field. This programming procedure results in an increase of a threshold voltage for the cell, the threshold being the gate-to-source voltage required for the cell to conduct. 
     Each programmed cell requires a specific amount of applied electric field to obtain the desired programmed vt level. The amount of electric field determines the program speed of a bit-cell. Fast cells will need less applied field while slow cells will need more. The electric field is applied through several program pulses. The use of program pulses allows the device to control program distributions. After each pulse, the cells are program-verified to see if the target vt has been achieved. Using multiple program pulses allows the device to stop programming fast bits while completing the programming the slow bits. 
     An inhibited word-line will not have a strong field across the device. FIG. 2 shows that with VCC=3.3V being applied at one end of a bit-line  109  to be inhibited, the source/drain regions of bit-line will couple to 8V. This will make the applied field appear much weaker and no effective programming will occur. 
     As explained above, a multi-level cell  102  utilizes 2 N  VT levels to represent N logical bits. Standard program times of multi-level cell designs are 2 N −1 times that of a single bit program time (SBPT). An example of known programming of two logical bits (N=2) in a single multi-level cell  102  is shown in FIG.  3 . In particular, four programming charge distributions A, B, C and E are formed. The centers of the programming charge distributions A-C are preferably positioned between the centers of the charge distributions for the reading pulses. The centers of the charge read distributions are labeled RdA, RdB and RdC corresponding to Read Level A, Read Level B and Read Level C, respectively. RdA typically has a value of approximately 0V, RdB a value of approximately 800 mV and RdC a value of approximately 1.6V. Besides wanting the centers of the program distributions A-C to be positioned between Read Levels A-C, it is desired that there be no intersection between the programming and read distributions so that the read process can accurately predict the levels of the memory cell are properly programmed. 
     Table 1 is given below that shows a preferred correspondence between the levels A-C and E and the accessed logical bit values Q 1 , Q 2 . 
     
       
         
               
               
               
               
               
               
             
               
               
               
               
               
               
             
           
               
                   
                 TABLE 1 
               
               
                   
                   
               
               
                   
                 Level 
                 Vt 
                   
                 Q2 
                 Q1 
               
               
                   
                   
               
             
             
               
                   
               
             
          
           
               
                   
                 C 
                 2.0 
                 V 
                 0 
                 0 
               
               
                   
                 B 
                 1.0 
                 V 
                 0 
                 1 
               
               
                   
                 A 
                 0 
                 V 
                 1 
                 0 
               
               
                   
                 E 
                 &lt;−2.0 
                 V 
                 1 
                 1 
               
               
                   
                   
               
             
          
         
       
     
     Since charge distribution E is the erase state and considered the default setting, there are 2 N −1 levels or in the case of N=2 three levels A-C (2 2 −1) that must be programmed depending on loaded data. In a known manner of programming, each of the 2 2 −1 levels are programmed separately. Each level is programmed separately so that the inhibited and uninhibited bit-lines can be set. This separate programming results in the total programming time being equal to (2 N −1) * SBPT (single bit program time). As N, the number of logical bits increases, the programming time becomes exponentially larger and more burdensome. For example, a 4-bit (N=4) multi-level cell design can have a programming time that is 2 4 −1 times greater than that of a 2-bit multi-level cell design. Accordingly, there is a need for reducing the programming time for multi-level cells that are programmed for multiple bits. 
     It should be kept in mind that the cell program speed will vary for a variety of reasons. Bit-cell variations within the population of memory cells due to process issues can cause even neighboring cells to program differently under the same conditions. Program speed can be dependent on the applied voltage. Bit-cells program speed will track VCC, high VCC—faster programming. A bit-cell&#39;s programming characteristics will also change over its own lifetime. A bit-cell will both speed-up and slow-down over the millions of cycles it will encounter. All these factors have a direct effect on the program margins and, thus, need to be controlled. 
     FIG. 4 illustrates the effect of faster programming on the program vt distribution of FIG.  3 . Faster programming generates fewer program pulses since the program distribution&#39;s target windows widen when compared with the program distribution of FIG. 3 represented by dotted pulses. Fewer pulses limit the control on program accuracy since the program margins between consecutive pulses are reduced. 
     FIG. 5 illustrates the effect of slower programming on the program vt distribution of FIG.  3 . Slower programming generates more program pulses since the program distribution&#39;s target windows shrink when compared with the program distribution of FIG. 3 represented by the dotted pulses. The added pulses will improve accuracy. Slower programming affects performance but not program margins or reliability in a multilevel cell design. 
     FIG. 6 illustrates a target window for high level C for both a fast and slow program distribution window. The point  300  indicates that the minimum program vt for the high level C is not related to program speed but the actual selected program verify level C. The location of point  300  is unaffected by program speed. 
     As described in U.S. patent application Ser. No. 09/779,864, entitled “Program Reconnaissance To Eliminate Variations in VT Distributions Of Multi-Level Cell Flash Memory Designs” by Allan Parker (Brinks Hofer Case No. 9076/560 and AMD Case No. F0912) filed concurrently with the present application, program reconnaissance for multilevel cells is predicated on the immunity of the highest vt level program speed to effect program margins. By programming the highest vt level in its entirety first, the device can monitor and adjust program speed for successive lower vt states to insure desired accuracy. Regardless of whether the highest vt level programs fast or slow, the device can make the needed adjustments to tune future programming pulses. These actual adjustments are determined through device analysis. This analysis will indicate the program dependence between all levels and specific voltage characteristics. Thus, program reconnaissance is a methodology that allows variations in program distributions to be minimized by continuous adjustments of the program voltage. 
     While the above-described standard program reconnaissance will compensate for both fast and slow program variations, it requires that the highest vt level be programmed independently of the other vt levels. Removing the highest vt level from the ganged approach of piggyback programming where all levels are programmed as a unit will decrease the program performance. 
     Please note that in order to achieve the above programming one or more pulses are applied to each vt level separately. In the case of N=2, initially pulses of a voltage, such as 20V, are applied to the highest vt level C. After level C is programmed, one or more pulses of a voltage, such as 19V, are applied to the next lowest level B until level B is programmed. Next, one or more pulses of a lower voltage, such as 18V, are applied to the lowest level C until level C is programmed. Note that the voltages of the pulses are dependent on the desired speed of programming. Note that the highest vt level pulse is adjusted so that the selected bit cells will complete programming in ½ the pulse count of the successive vt levels. For example, if the pulse target is 10, the high vt level bits will be targeted for completion of programming in 5 pulses. If the high vt level programming speed increases (fewer pulses), the program voltage can be adjusted to slow successive level programming and insure proper distributions for the lower vt levels. 
     To erase a cell in the flash memory array  100 , the programming process described above is reversed. In the case of N=2, the highest level vt level C is erased by applying pulses of 20V to the substrate while the gate is grounded. 
     To read the state of a cell, a typical control gate voltage of Rd levels is applied to the cell. The current output from the cell being read is received at an input of a number of the sense amplifiers  116  connected to the same bitline as the cell being read. A second input to each sense amplifier is provided from the reference  118 . The reference  118  provides a different reference current to each sense amplifier connected to a bit line, with a current level set equal to current expected from a cell being read when programmed to a desired threshold voltage state. Binary outputs of the sense amplifiers  116  indicate if the cell being read is in a state that is greater than or less than the state of the reference signal received. Outputs of the sense amplifiers are provided through data latch/buffers  120  to the processor  114 , enabling the processor  114  to determine from the sense amplifier outputs the threshold state of the cell being read. 
     SUMMARY OF THE INVENTION 
     One aspect of the present invention regards a method of programming a memory cell that has 2 N  voltage levels where N&gt;1 and represents the number of bits stored within the memory cell. The method includes setting a target number T of piggyback programming pulses for programming each of 2 N −1 vt levels of the memory cell, applying T piggyback programming pulses to the memory cell and determining when the highest one of the 2 N −1 vt levels is programmed. If it is determined that the highest one of the 2 N −1 vt levels is programmed by a number M of piggyback programming pulses that is less than the target number T, then compensating the programming speed of those ones of said T number of piggyback programming pulses subsequent to the Mth piggyback programming pulse. 
     A second aspect of the present invention regards a method of programming a multi-level cell flash memory array that has individual multi-level memory cells each having 2 N  voltage levels where N&gt;1 and represents the number of bits stored within the memory cell and wherein each of the individual memory cells includes a drain connected to a bitline, a source connected to a voltage source Vss and a gate connected to a wordline. The method includes setting a target number T of piggyback programming pulses for programming each of 2 N −1 vt levels of one of the individual multi-level memory cells and uninhibiting only a bitline corresponding to a voltage level of the one of the individual multi-level memory cells. Applying T piggyback programming pulses to the uninhibited bitline, determining when the highest one of the 2 N −1 vt levels is programmed. If it is determined that the highest one of the 2 N −1 vt levels is programmed by a number M of piggyback programming pulses that is less than the target number T, then compensating the programming speed of those ones of the T number of piggyback programming pulses subsequent to the Mth piggyback programming pulse. 
     Each of the above aspects of the present invention provides the advantage of reducing the programming times of a multi-level memory cell and memory array. 
     Each of the above aspects of the present invention provide the advantage of providing consistent programming distributions while reducing programming times over many device conditions. 
     The present invention, together with attendant objects and advantages, will be best understood with reference to the detailed description below in connection with the attached drawings. 
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS 
     FIG. 1 schematically illustrates an embodiment of an integrated circuit with a flash memory array that is programmed in a manner in accordance with the present invention; 
     FIG. 2 schematically shows a known method of programming the flash memory array of FIG. 1; 
     FIG. 3 schematically shows a known method of programming a multi-level cell used in the flash memory array of FIG. 1; 
     FIG. 4 illustrates the effect of faster programming on the program vt distribution shown in FIG. 3; 
     FIG. 5 illustrates the effect of slower programming on the program vt distribution shown in FIG. 3; 
     FIG. 6 illustrates a high level vt target window for both a fast and slow program distribution window for the program distribution shown in FIG. 3; 
     FIG. 7 shows an embodiment of a “piggyback” pulse that is used with a mode of programming in accordance with the present invention; 
     FIG. 8 schematically shows a mode of programming the flash memory array of FIG. 1 with the “piggyback” pulse of FIG. 7; and 
     FIG. 9 schematically shows a mode of concurrent program reconnaissance in accordance with the present invention. 
    
    
     DETAILED DESCRIPTION OF THE INVENTION 
     The following description of the method of the present invention will be with respect to the multi-level memory array  100  shown in FIG.  1 . It should be understood that the present invention can be applied to other embodiments of memory structures as well. 
     Programming of the memory array  100  according to the present invention is accomplished by applying a “piggyback” pulse  200  to the multi-level cell  102  as shown in FIG.  7 . As will be explained in more detail below, applying a piggyback pulse using voltage control allows all 2 N  levels to be programmed as a group thus drastically reducing the programming time. Though program time is reduced, this new methodology does not have a detrimental effect on program accuracy or cell reliability. 
     As shown in FIG. 7, piggyback programming begins with the highest level vt and steps its way down. Each step will reduce the program voltage in accordance to the level needed for the specific vt target. In FIG. 7, an example of programming of a memory cell with two bits is illustrated. The example takes into account that cell examination shows that the effective program strength doubles for every 0.5V added to the program voltage. Cell examination also indicates that it takes 4 times the work to program level B as level C bits. With the above said, the piggyback program voltage will step from 20, 19 and 18 volts. The high level voltage of 20 volts is explained by the fact that the high level C takes 4 times the work of level B and 16 times the work of level A. In addition, if it takes 10 pulses to program level A at 18V, it will take 40 pulses to program level B with the same voltage. At each step, specific bits will be enabled for programming. Of course, other values for the voltages of the pulses are possible depending on the desired speed of programming. 
     As shown in FIG. 8, the initial portion  202  of the pulse  200  has a voltage of 20 volts that corresponds to the vt value of level C. Thus, the initial portion  202  programs the level C data. During the application of portion  202 , the bit line corresponding to level C is the only bit line uninhibited and selected for programming. The bit-lines corresponding to levels A and B are inhibited. 
     Upon completion of the initial portion  202  of the pulse  200 , a second portion  204  of the pulse is applied. The second portion  204  is lowered to a program voltage of 19V that corresponds to the vt value of level B. During application of the second portion  204  of the pulse  200 , a voltage Vss is applied to the bit line corresponding to level B so as to drain charge. The level B and level C bit-lines are both selected for programming during application of the second portion  204 . This is not a problem because the level C bits are much harder to program at this stage and the second portion  204  will assist in level C programming. During application of the second portion  204 , the bit lines corresponding to level A and the Erase State level are inhibited. 
     Upon completion of the second portion  204 , a third portion  206  of the pulse is applied. The third portion  206  is lowered to a program voltage of 18V that corresponds to the vt value of level A. During application of the third portion  206  of the pulse  200 , a voltage Vss is applied to the bit line corresponding to level A so as to drain charge. During application of the third portion  206 , all three of the bit lines corresponding to the levels A, B and C are selected for programming. The level B and C bits are much harder to program at this stage and the third portion  206  will assist in level B and C programming. During application of the third portion  206 , only the bit line corresponding to the Erase State is inhibited. 
     After the pulse  200  is complete, the word-line and bit-line are discharged. 
     In summary, programming includes the following principles: 
     1) When a bit-line has been uninhibited, the word-line voltages must be re-applied to inhibit. The coupling only occurs when word-lines are raised to the high voltages. 
     2) A bit-line can always be uninhibited by applying Vss to drain the charge away. 
     Key to successful multi-level cell operation is controlled program vt distributions. Hump width and spacing must fall within target windows for correct data storage and long term reliability. To achieve this programming control, a specific program pulse target is usually required. For example, 10-15 μsec pulses can be used to program level within a 250 mv distribution. The program voltage will then be set to insure 10 pulses during level B programming. The applied program voltages are adjusted so that all vt levels complete programming after the targeted number of piggyback pulses 200. There are several setup and discharge concerns when applying the high voltage. Also the rise and fall times of the applied program pulse can be significant. 
     One of the advantages of the above-described piggyback programming with voltage control process is that it provides significant program saving when compared with known programming that uses separate pulses to program each vt level individually. In the case of the cell  102  having three voltage levels A-C, if it takes 10 program pulses to complete each level using separate standard pulses (30 total program pulses), only 10 Piggyback pulses  200  will be needed for programming each vt level. Each of the ten Piggyback pulses  200  will have a total width W that equals N*SBT/10. This results in the total program time will be 1 0*W which turns out to be equal to 10*(N*SBT/10). Consequently, the total program time will now be N * (SBPT) instead of 2 N −1 * (SBPT). The reduction in programming time is the result of voltage control of the pulse  200  allows all 2 N −1 levels to be programmed as a group instead of separately. Such group programming allows significant savings in all cursory functions needed for high voltage programming. Note that in the case of using multiple piggyback programming pulses for programming, the frequency of the piggyback programming pulses will of course depend on the verify pulse timing. 
     The actual applied program pulse can be as small as ⅓ of the program pulse time. For example, a 15 μsec program pulse may have as little as 5 μsec effective program time assuming a 5 μsec set-up/rise time and a 5 μsec discharge/fall time for the pulse. 
     Examples of the saving in programming time due to the use of piggyback pulses is described in U.S. patent application Ser. No. 09/779,821, entitled “Piggyback Programming Using Voltage Control For Multi-Level Cell Flash Memory Designs” by Allan Parker (Brinks Hofer case No. 9076/567 and AMD Case No. F0919) filed concurrently with the present application. 
     Concurrertly with the above-described piggyback programming, program reconnaissance is performed in a manner similarly described in U.S. patent application Ser. No. 09/779,864, entitled “Program Reconnaissance To Eliminate Variations in VT Distributions Of Multi-Level Cell Flash Memory Designs” by Allan Parker (Brinks Hofer Case No. 9076/560 and AMD Case No. F0912) filed concurrently with the present application, the entire contents of which are incorporated herein by reference. Such concurrent program reconnaissance allows all vt levels to remain in a single piggyback pulse. All levels are ganged programmed. Program adjustments are still made after the highest level program is complete. The difference is that the highest-level program time will not track with the other vt levels. 
     According to the methodology of the present invention, programming of the memory cell  102  with the piggyback programming pulses  200  is accomplished by setting or determining a target number T of piggyback programming pulses for programming each of the 2 N −1 vt levels of the multi-level memory cell  102 . During programming, it is determined when the highest vt level is programmed. If it is determined that the highest vt level is programmed by a number M of piggyback programming pulses that is less than the target number T, then the programming speed for the highest vt level is too large. To compensate for this, the piggyback programming pulses subsequent to the Mth piggyback programming pulses are altered so that the portion for the highest level is eliminated and the voltages for the lower levels are lowered so as to slow down the program time so that the lower levels will be programmed slower that they are programmed by the targeted piggyback programming pulse. 
     FIG. 9 illustrates an example of concurrent piggyback programming and reconnaissance. In this example, a target of ten pulses has been set for the number of piggyback programming pulses needed to program each of the  2   2 −1=3 vt levels of the N=2 bit multi-level memory cell  102 . During programming, it is determined that the highest vt level C is programmed by four piggyback programming pulses  200 . To compensate for the high programming speed of level C, the subsequent piggyback programming pulses are altered so that portion  202  of piggyback programming pulse  200  is eliminated and the voltages for the portions  204  and  206  for the lower levels B and A, respectively, are each lowered by 200 mV. Six such altered piggyback programming pulses  300  with portions  304  and  306  program the lower levels B and A so that their programming is completed as of the last of the six piggyback programming pulses  300 . Thus, all the levels A-C are programmed at the desired target of ten piggyback programming pulses. 
     The highest vt level program pulse can be adjusted so that it can complete programming of the highest level C in ½ the number of pulses of successive states. If the highest level C programs fast, the piggyback pulse can be adjusted to slow down for other states so that the desired distribution is achieved. Table 2 below illustrates some sample pulse counts when the highest level C is programmed and voltage adjustments for the portions  304  and  306  altered piggyback programming pulses  300  when compared with the voltages for the portions  204  and  206  of the original pulse  200 . A 5 pulse target is assumed for as the standard to achieve desired margins. The adjustments for faster bits will insure tighter program margins by controlling the pulse count for successive VT states. 
     
       
         
               
               
               
               
               
             
               
               
               
               
               
             
           
               
                   
                 TABLE 2 
               
               
                   
                   
               
               
                   
                   
                   
                 Pulse 
                   
               
               
                   
                 Level C Pulses 
                 % Speed Increase 
                 Voltage Delta 
                   
               
               
                   
                   
               
             
             
               
                   
               
             
          
           
               
                   
                 5 
                 20 
                 −200 
                 MV 
               
               
                   
                 4 
                 40 
                 −400 
                 MV 
               
               
                   
                 3 
                 60 
                 −600 
                 MV 
               
               
                   
                 2 
                 80 
                 −800 
                 MV 
               
               
                   
                 1 
                 100 
                 −1000 
                 MV 
               
               
                   
                   
               
             
          
         
       
     
     This combination allows for the program performance increase and maintains vt distribution control. The new methodology allows the device to maintain a specific program distribution maximum regardless of program variations in successive vt levels. Concurrent program reconnaissance also allows the highest vt level to share the efficiency of ganged programming but retain information to adjust the program state to minimize margin variations. 
     Concurrent program reconnaissance maintains the performance of piggyback programming and allows adjustments to compensate for program speed increases. When the program speed increases, these adjustments will maintain the desired program vt distribution. Program distribution uniformity allows for a multi-level cell design with higher reliability. 
     The foregoing description is provided to illustrate the invention, and is not to be construed as a limitation. Numerous additions, substitutions and other changes can be made to the invention without departing from its scope as set forth in the appended claims. For example, programming according to the present invention is scaleable to all multi-level cell densities.