系列文章目录
目录
前言
一、SLC的编码
二、使SLC的编码
三、格雷码的介绍
1.定义:
2.举例
总结
前言
本节主要介绍闪存的一些编码规则
一、SLC的编码
对于SLC来说,可以定义编程态为0、擦除态为1。
二、使SLC的编码
对MLC来说,因为有四个状态,就需要使用“00、01、10、11”来表征各个Vt分布。在上世纪末,英特尔提出MLC的概念时,就引入了通信协议中常用的格雷码(Gray Code)的概念,以降低“信道”的误码率。
闪存中所讲的“信道”就是闪存本身。把数据存入闪存,再把数据从闪存里读出来,就好像通信中在信道的输入端输入信号,再从信道的输出端获取信号那样。唯一不同的是,通信是在空间域里传输信息,“information transfer from here to there”,而存储器是在时间域里传输信息,“information transfer from now to future”。所以在闪存的编码里,沿用了许多通信编码技术,格雷码就是其中之一。
三、格雷码的介绍
1.定义:
若任意两个物理状态相邻(状态距离为1),则这两个物理状态的编码在二进制上只允许有1个bit的变化(码距为1)。
2.举例
举个例子:二进制100和110之间只有第二位是翻转的(码距d=1),而二进制101和010就有三个bit的翻转(码距d=3)。码距就是两个码之间的bit翻转数,用字母d来表示,具体概念这里就不赘述了。那为什么我们希望两个相邻物理状态的码距为1呢?这是基于一个朴素的想法,即“因为两个相邻状态(t=1)之间翻转而产生误码的几率,要远大于两个非相邻状态(t>1)之间翻转而产生误码的几率”。设误码率为P,Vt分布之间的距离为t,用公式表达,就是
P(t=1) >> P(t=2)>>P(t=3)
假设MLC的编码不是格雷码,而是用最常用的顺序编码,令擦除态为11、最高的编程态为00,则得到 11 10 01 00
第二个分布的编码是10,第三个分布的编码是01。虽然从十进制看,各个分布的编码符合3、2、1、0的顺序编码,但其中有两个相邻分布(t=1)的编码,在二进制上有两个bit的翻转,即d=2:
为了有效降低误码率,MLC闪存使用格雷码,定义各个状态的二进制编码为11 01 00 10
于是这个编码的低位bit自然也就映射到了低位页(LP)的数据。
相对应的,我们可以在第一第二分布之间,以及第三第四分布之间放两个比较电压,称为Vref_UP1和Vref_UP2,用来读取闪存中高位页(UP)的数据,并定义落在Vref_UP1和Vref_UP2之间的Vt被读成0、落在Vref_UP1和Vref_UP2之外的Vt被读成1,
上面的话题也引出了另一个要点:MLC有4个状态,需要比较三次才能把MLC的LP和UP中的数据都读出来。其中LP只需要比较1次,UP则需要比较2次,所以UP的读取速度比LP的读取速度慢很多,虽然不是两倍,但差距也很可观。
顺序编码的话,至少有三个相邻Vt分布(t=1)的编码会翻转超过1个bit (d>1)。
为满足低误码率的需求,在保持最低的擦除态Vt编码为111的预设前提下,TLC上至少可以构造出几个不同的格雷码
总结
QLC和PLC能够构造的格雷码更多,那么我们究竟应该选哪个编码使用呢?这就牵涉到每一个页的读取速度平衡问题:TLC上需要平衡低位页(LP),中位页(Middle Page, MP),高位页(UP)的读取速度,以达成在系统端的性能优化。