具体实施方式
以下基于实施例对本申请进行描述,但是本申请并不仅仅限于这些实施例。在下文对本申请的细节描述中,详尽描述了一些特定的细节部分。对本领域技术人员来说没有这些细节部分的描述也可以完全理解本申请。为了避免混淆本申请的实质,公知的方法、过程、流程没有详细叙述。另外附图不一定是按比例绘制的。
首先,对本申请实施例进行描述的过程中出现的部分名词或术语适用于如下解释。
与非型闪存:与非型闪存(NAND flash memory)又被称为NAND闪存,是一种非易失闪存。NAND闪存利用穿隧注入写入及穿隧释放擦除,地址线和数据线复用。
存储单元:存储单元是构成NAND闪存的元件,NAND闪存包括多个存储块(block),每个存储块包括多个存储页(page),每个存储页包括多个存储单元(cell)。存储单元可以存储不同的电量,不同的电量需要不同的开启电压,通过加读电压可以判断存储单元是否开启,根据开关状态可以确定存储单元的电压态,进而可以根据电压态确定存储单元存储的信息。
电压态:电压态也称为电压状态,取决于存储单元所存储电子的数量。一个存储单元的电压态的数量可以是2、4、8和16等,包括2个电压态的存储单元(Single Level Cell,SLC)可以存储1bit的数据,包括4个电压态的存储单元(Multi-Level Cell,MLC)可以存储2bit的数据,包括8个电压态的存储单元(Trinary-Level Cell,TLC)可以存储3bit的数据,包括16个电压态的存储单元(Quad Level Cell,QLC)可以存储4bit的数据。
读电压:读电压是指在对存储单元进行读取时所使用的电压。
开启电压:开启电压是存储单元被开启的临界电压,当读电压大于开启电压时存储单元被开启,当读电压小于开启电压时存储单元关闭。存储单元在开启状态和关闭状态下指示不同的信息,从而可以根据开关状态确定存储单元存储的数据。
固态硬盘
图1示出一个固态硬盘100的示意性框图。固态硬盘(Solid State Disk或SolidState Drive,SSD)又称为固态驱动器,是用固态电子存储芯片阵列制成的硬盘。根据存储介质的不同,固态硬盘可以分为基于闪存(flash)的固态硬盘和基于动态随机存取存储器(Dynamic Random Access Memory,DRAM)的固态硬盘,本申请实施例中的固态硬盘100是指基于NAND闪存的固态硬盘。
固态硬盘相对于传统的机械硬盘有诸多优势,其中最大的优势是存储数据的安全性。例如,在使用过程中晃动固态硬盘也无需担心损坏存储的数据,在使用过程中突然断电也不会造成固态硬盘中的数据丢失。基于此,固态硬盘广泛应用于各种复杂的工作环境,比如高可用的服务器,同时固态硬盘也是个人用户理想的存储设备。
如图1所示,固态硬盘100可以包括多个闪存芯片10,闪存芯片10可以包括多个存储块11,存储块11可以包括多个存储页12,存储页12可以包括多个存储单元13,固态硬盘100中的数据存储在闪存芯片10中的存储单元13中。比如,闪存芯片10包括1024个存储块11,存储块11包括64个存储页12,存储页12包括217个存储单元13,存储单元13可以存储1bit的数据,即存储单元13可以存储二进制数0或1。在本申请实施例中闪存芯片10是指NAND闪存。
固态硬盘100中除了用于存储数据的闪存芯片10之外,还可以包括存储控制芯片20和缓存芯片30。
存储控制芯片20用于控制固态硬盘的读写操作,并且存储控制芯片20中写入对应的软件程序。在一些实施例中,针对一个存储页12,存储控制芯片20可以确定对该存储页12中各存储单元13进行读取的读电压,然后存储控制芯片20可以通过所确定出的读电压对该存储页12中的各存储单元13进行读取,根据该存储页12中各存储单元13的开关状态,确定该存储页12中各存储单元13所存储的信息。
缓存芯片30用于缓存接收到的来自请求方的IO数据,并等待将缓存的IO数据写入到闪存芯片10中。
在闪存芯片10中,因为存储单元13中会有各类电噪声,使得存入存储单元13的电量发生偏移,进而使存储单元13的开启电压发生变化。当电噪声较大时,不同电压态的开启电压会发生交叠,此时就会发生读数据错误。闪存芯片10以存储页12为单元进行读取,同一个存储页12中的各存储单元13的读电压相同,当存储单元13发生电压态交叠时,任意读电压都会导致读数据错误。
图2是本申请一个实施例的开启电压分布的示意图,图中横轴表示电压,钟形曲线表示一个存储页中开启电压为相应电压的存储单元的数量,曲线越高则以相应电压为开启电压的存储单元的数量越多。电压态1写入低电压,电压态0写入高电压。由于存储单元中电噪声的影响,两个电压态在边缘发生交叠,部分写入0的存储单元的开启电压比部分写入1的存储单元的开启电压更低,部分写入1的存储单元的开启电压比部分写入0的存储单元的开启电压更高。如果使用读电压V2进行读取,落在区域Z1的被写入0的存储单元因为被开启而被误读为1,而落在区域Z2、Z3和Z4的被写入1的存储单元因为未开启而被误读为0。如果使用读电压V1进行读取,只有落在区域Z1、Z2和Z4的存储单元会发生读数据错误。由此可见,当不同电压态的开启电压发生交叠时,不同的读电压得到的数据错误的数量不同,所以存储控制芯片20需要确定对存储页中各存储单元进行读取时所使用的读电压,以尽可能减少错误数据的数量,图2中读电压V1是使得数据错误数量最小的读电压。
存储控制芯片20在确定存储单元的读电压时,需要通过不同的读电压进行多次读取,才能获得电压态的开启电压的分布,一次读取仅能够获得分布曲线上的一个点,通过多次读取拟合出整条曲线后才能得到较优的读电压值。在一个存储页包含16KB数据,存储单元有两个电压态的情况下,一个存储页包括217个存储单元,则一次读取需要16KB的存储空间,存储控制芯片20为了降低时延,将读取出的数据存储到静态随机存取存储器(StaticRandom-Access Memory,SRAM)中,如果通过16次读操作来确定开启电压的分布,则需要占用SRAM的256KB存储空间,这是一个很大的硬件开销。
存储控制芯片
图3示出本申请一个实施例的存储控制芯片20的示意图,如图3所示,存储控制芯片20包括总线连接的加速单元21和SRAM22。加速单元21在本申请实施例中是为了加速读电压确定而设计的专门处理单元,可以体现为专门为确定存储单元的开启电压分布而设计的处理单元,加速单元可以通过专用集成电路(ASIC)和现场可编程门阵列(FPGA)等实现。
加速单元21包括控制器23和闪存读电压确定单元24,控制器23可以控制闪存读电压确定单元24工作,闪存读电压确定单元24可以针对一个存储页包括的各存储单元确定较优读电压,以尽可能减小对存储单元进行读取时产生的错误数据的数量。
本申请实施例主要着眼于闪存读电压确定单元24确定读电压的过程,在后文中会对闪存读电压确定单元24及其确定读电压的过程进行详细描述。
如图3所示,闪存读电压确定单元24包括读取单元241、求和单元242和定位单元243。读取单元241可以通过n个读电压对位于闪存芯片10中同一存储页中的各存储单元进行读取,获得每个存储单元在每个读电压下的读取值,n为大于或等于3的正整数。求和单元242可以将为第一数值的读取值转换为十进制数1,并将为第二数值的读取值转换为十进制数0,并分别对每个存储单元在各读电压下的读取值对应的十进制数求和,获得该存储单元对应的求和值。定位单元243可以根据n个读电压和每个存储单元对应的求和值,确定用于对各存储单元进行读取的目标读电压。
NAND闪存的设计要求一个存储页中的各存储单元的读电压相同,进而通过读电压对同一存储页中各存储单元进行读取时,根据存储单元的开关状态,可以确定该存储单元所存储的信息。读电压会影响读取NAND闪存时产生错数数据的数量,为此需要确定较优读电压,通过较优读电压对各存储单元进行读取时产生的错误数据较少,由图2可知较优读电压出现在开启电压分布曲线的谷底,因此可以通过开启电压分布曲线的走势确定较优读电压,而确定开启电压分布曲线的走势需要至少确定开启电压分布曲线上的三个点,所以读取单元241需要通过至少三个读电压对存储单元进行读取,即n为大于或等于3的正整数。
应理解,确定NAND闪存读电压是为了使错误数据最小化,出于时间和成本的考虑,不会确定出以每个电压为开启电压的存储单元的数量,所以所确定出的开启电压分布曲线可能存在误差,从而将开启电压分布曲线上谷底对应的开启电压作为目标读电压时,通过目标读电压对各存储单元进行读取时所产生的错误数据的数量可能并不是最小的,即目标读电压可能并不等于较优读电压,但所产生的错误数据的数量在允许的范围内,能够满足实际应用的精度需求。
通过读电压对存储单元进行读取时,如果读电压大于存储单元的开启电压,则存储单元被开启,如果读电压小于存储单元的开启电压,则存储单元未被开启。根据存储单元的开关状态,可以确定存储单元的电压态,进而确定存储单元所存储的信息,获得读取值。第一数值和第二数值是对应于存储单元被开启和未被开启时的两个读取值,当第一数值为存储单元被开启时的读取值时,第二数值为存储单元未被开启时的读取值,当第一数据为存储单元未被开启时的读取值时,第二数据值为存储单元被开启时的读取值。
求和单元242可以将为第一数值的读取值转换为十进制数1,并将为第二数值的读取值转换为十进制数0。根据存储单元所包括电压态数量的不同,存储单元的读取值的数值不同,比如,如果存储单元包括2个电压态,则存储单元的读取值为二进制数1或0,如果存储单元包括4个电压态,则存储单元的读取值为二进制数00、01、10或11,如果存储单元包括8个电压态,则存储单元的读取值为二进制数000、001、010、011、100、101、110或111。
当存储单元的电压态为2个以上时,需要分别针对每对相邻的电压态确定读电压,所以存储单元的读取值仍为第一数值或第二数值。比如,当存储单元包括4个电压态时,按照对应电压由小至大的顺序,4个电压态依次为电压态1至电压态4,电压态1写入二进制数00,电压态2写入二进制数01,电压态3写入二进制数10,电压态4写入二进制数11。需要分别针对电压态1和电压态2、电压态2和电压态3、电压态3和电压态4确定读电压。针对电压态1和电压态2确定读电压时,存储单元的读取值为00或01,针对电压态2和电压态3确定读电压时,存储单元的读取值为01或10,针对电压态3和电压态4确定读电压时,存储单元的读取值为10或11。
以针对电压态1和电压态2确定读电压为例,如果求和单元242将为00的读取值转换为十进制数1,则将为01的读取值转换为十进制数0,如果求和单元242将为00的读取值转换为十进制数0,则将为01的读取值转换为十进制数1。
以一个包含16KB数据的存储页为例,如果该存储页中存储单元的写入数据为二进制数0或1,每次对该存储页中的存储单元进行读取会获取16KB数据,如果通过7个读电压对该存储页中的各存储单元进行读取,则获取到16*7KB数据。如果将每个存储单元在各读电压下读取值对应的十进制数求和,则求和值最大为7,存储十进制数7仅需3个bit,需要存储的数据为16*3KB。可见,对SRAM资源的占用由16*7KB降低为16*3KB。
n个读电压可以将开启电压划分为n+1个开启电压区间,开启电压位于不同开启电压区间内的存储单元对应的求和值不同,因此可以根据各存储单元对应的求和值,确定开启电压落在每个开启电压区间内的存储单元的数量,从而确定开启电压分布,并根据开启电压分布确定目标读电压。后文会对定位单元243确定目标读电压的具体过程进行详细说明。
在本申请实施例中,读取单元241通过n个读电压对各存储单元进行读取,获得每个存储单元在每个读电压下的读取值后,求和单元242按读取值的数值将读取值转换为十进制数0或1,并分别对每个存储单元对应的各十进制数进行求和获得求和值,进而定位单元243可以根据n个读电压和每个存储单元对应的求和值确定目标读电压。存储每个存储单元的求和值,相对于存储每个存储单元在每个读电压下的读取值,所需存储空间更小,从而能够降低确定读电压过程中的硬件开销。
在一种可能的实现方式中,定位单元243可以确定以n个读电压为分界点形成的n+1个开启电压区间,根据每个存储单元对应的求和值,可以分别确定开启电压位于每个开启电压区间内的存储单元的数量,进而可以根据开启电压位于每个开启电压区间内的存储单元的数量,确定目标读电压。
由于开启电压落在不同开启电压区间内的存储单元对应不同的求和值,因此针对每个开启电压区间,可以根据各存储单元对应的求和值,确定开启电压落在该开启电压区间内的存储单元的数量。根据每个开启电压区间内存储单元的数量,可以确定各存储单元的开启电压分布,进而根据开启电压分布确定目标读电压。
图4是本申请另一个实施例的开启电压分布的示意图。如图4所示,通过读电压V1~V7对各存储单元进行读取,当读电压大于存储单元的开启电压时,存储单元的读取值为第一数值,即在读电压大于存储单元的开启电压时,存储单元对应的十进制数为1,在读电压小于存储单元的开启电压时,存储单元对应的十进制数为0。以读电压V1~V7为分界点形成8个开启电压区间,小于读电压V6的电压区间为开启电压区间Q1,大于读电压V6且小于读电压V4的电压区间为开启电压区间Q2,大于读电压V4且小于读电压V2的电压区间为开启电压区间Q3,大于读电压V2且小于读电压V1的电压区间为开启电压区间Q4,大于读电压V1且小于读电压V3的电压区间为开启电压区间Q5,大于读电压V3且小于读电压V5的电压区间为开启电压区间Q6,大于读电压V5且小于读电压V7的电压区间为开启电压区间Q7,大于读电压V7的电压区间为开启电压区间Q8。
为了便于描述,定义开启电压区间内的存储单元,是指对应开启电压位于该开启电压区间内的存储单元。
在通过读电压V6对各存储单元进行读取时,开启电压区间Q1内存储单元对应的十进制数为1,开启电压区间Q2~Q8内存储单元对应的十进制数为0。
在通过读电压V4对各存储单元进行读取时,开启电压区间Q1~Q2内存储单元对应的十进制数为1,开启电压区间Q3~Q8内存储单元对应的十进制数为0。
在通过读电压V2对各存储单元进行读取时,开启电压区间Q1~Q3内存储单元对应的十进制数为1,开启电压区间Q4~Q8内存储单元对应的十进制数为0。
在通过读电压V1对各存储单元进行读取时,开启电压区间Q1~Q4内存储单元对应的十进制数为1,开启电压区间Q5~Q8内存储单元对应的十进制数为0。
在通过读电压V3对各存储单元进行读取时,开启电压区间Q1~Q5内存储单元对应的十进制数为1,开启电压区间Q6~Q8内存储单元对应的十进制数为0。
在通过读电压V5对各存储单元进行读取时,开启电压区间Q1~Q6内存储单元对应的十进制数为1,开启电压区间Q7~Q8内存储单元对应的十进制数为0。
在通过读电压V7对各存储单元进行读取时,开启电压区间Q1~Q7内存储单元对应的十进制数为1,开启电压区间Q8内存储单元对应的十进制数为0。
因此,开启电压区间Q1内存储单元对应的求和值等于7,开启电压区间Q2内存储单元对应的求和值等于6,开启电压区间Q3内存储单元对应的求和值等于5,开启电压区间Q4内存储单元对应的求和值等于4,开启电压区间Q5内存储单元对应的求和值等于3,开启电压区间Q6内存储单元对应的求和值等于2,开启电压区间Q7内存储单元对应的求和值等于1,开启电压区间Q8内存储单元对应的求和值等于0。
在分别通过读电压V1~V7对存储单元进行读取后,获得每个存储单元对应的求和值,然后可以根据每个存储单元对应的求和值,确定该存储单元所在的开启电压区间,进而可以统计出每个开启电压区间内存储单元的数量。
在计算存储单元对应的求和值时,初始化存储单元的求和值为0,每通过一个读电压对存储单元进行读取,获得该存储单元对应的十进制数后,将获得的十进制数与该存储单元的求和值相加作为新的求和值,并通过新的求和值替换原有求和值。这样,针对每个存储单元,在确定读电压的过程中,仅需存储该存储单元对应的求和值,减小SRAM的硬件开销。
在本申请实施例中,定位单元243以n个读电压为分界点形成n+1个开启电压区间,根据各存储单元对应的求和值,确定每个开启电压区间内存储单元的数量,进而根据各开启电压区间内存储单元的数量,确定各存储单元的开启电压分布,并根据各存储单元的开启电压分布确定目标读电压,实现了根据存储单元对应的求和值确定目标读电压,确定目标读电压的过程中仅需存储每个存储单元对应的求和值,而无需存储每次对存储单元进行读取所获得的读取值,减少了对SRAM的硬件开销,而且可以保证所确定出的开启电压分布的准确性。
在一种可能的实现方式中,如果读电压大于存储单元的开启电压时,存储单元的读取值为第一数值,定位单元243可以确定对应求和值等于n+1-i的存储单元的开启电压位于第i开启电压区间内。其中,i为小于或等于n+1的正整数,在i≥2时,第i-1开启电压区间与第i开启电压区间相邻,且第i-1开启电压区间中的电压小于第i开启电压区间中的电压。
当读电压大于存储单元的开启电压时,存储单元的读取值为第一数值,此时,如果存储单元的开启电压小于读电压,则存储单元对应的十进制数为1,如果存储单元的开启电压大于读电压,则存储单元对应的十进制数为0。在通过一个读电压对各存储单元进行读取后,对于开启电压小于该读电压的存储单元,其对应的十进制数为1,其对应的求和值被加1,对于开启电压大于该读电压的存储单元,其对应的十进制数为0,器对应的求和值被加0。因此,按照所包括电压由小至大的顺序,各开启电压区间内存储单元对应的求和值递减,最大的求和值等于n,最小的求和值等于0,第i开启电压区间内存储单元对应的求和值等于n+1-i。
如图4所示,n等于7,第1开启电压区间Q1中存储单元对应的求和值等于7,第1开启电压区间Q1中存储单元对应的求和值等于7,第2开启电压区间Q2中存储单元对应的求和值等于6,第3开启电压区间Q3中存储单元对应的求和值等于5,第4开启电压区间Q4中存储单元对应的求和值等于4,第5开启电压区间Q5中存储单元对应的求和值等于3,第6开启电压区间Q6中存储单元对应的求和值等于2,第7开启电压区间Q7中存储单元对应的求和值等于1,第8开启电压区间Q8中存储单元对应的求和值等于0。
在本申请实施例中,若读电压大于存储单元的开启电压时,存储单元的读取值为第一数值,则确定对应求和值等于n+1-i的存储单元位于第i开启电压区间内,按照所包括电压由小至大的顺序,各开启电压区间内存储单元对应的求和值递减,从而可以根据各存储单元对应的求和值,确定每个存储单元位于哪个开启电压区间内,进而确定每个开启电压区间内存储单元的数量,并根据各开启电压区间内存储单元的数量确定开启电压分布,保证所确定出开启电压分布的准确性。
在一种可能的实现方式中,如果读电压大于存储单元的开启电压时,存储单元的读取值为第二数值,定位单元243可以确定对应求和值等于i-1的存储单元的开启电压位于第i开启电压区间内。其中,i为小于或等于n+1的正整数,在i≥2时,第i-1开启电压区间与第i开启电压区间相邻,且第i-1开启电压区间中的电压小于第i开启电压区间中的电压。
当读电压大于存储单元的开启电压时,存储单元的读取值为第二数值,此时,如果存储单元的开启电压小于读电压,则存储单元对应的十进制数为0,如果存储单元的开启电压大于读电压,则存储单元对应的十进制数为1。在通过一个读电压对各存储单元进行读取后,对于开启电压小于该读电压的存储单元,其对应的十进制数为0,其对应的求和值被加0,对于开启电压大于该读电压的存储单元,器对应的十进制数为1,其对应的求和值被加1。因此,按照所包括电压由小至大的顺序,各开启电压区间内存储单元对应的求和值递增,最大的求和值等于n,最小的求和值等于0,第i开启电压区间内存储单元对应的求和值等于i-1。
图5是本申请又一个实施例的开启电压分布的示意图。如图5所示,通过读电压V1~V7对各存储单元进行读取,当读电压大于存储单元的开启电压时,存储单元的读取值为第二数值,即在读电压大于存储单元的开启电压时,存储单元对应的十进制数为0,在读电压小于存储单元的开启电压时,存储单元对应的十进制数为1。
在本申请实施例中,若读电压大于存储单元的开启电压时,存储单元的读取值为第二数值,则确定对应求和值等于i-1的存储单元位于第i开启电压区间内,按照所包括电压由小至大的顺序,各开启电压区间内存储单元对应的求和值递增,从而可以根据各存储单元对应的求和值,确定每个存储单元位于哪个开启电压区间内,进而确定每个开启电压区间内存储单元的数量,并根据各开启电压区间内存储单元的数量确定开启电压分布,保证所确定出开启电压分布的准确性。
若读电压大于存储单元的开启电压时存储单元的读取值为第一数值,则确定对应求和值等于n+1-i的存储单元位于第i开启电压区间内,若读电压大于存储单元的开启电压时存储单元的读取值为第二数值,则确定对应求和值等于i-1的存储单元位于第i开启电压区间内,从而可以针对任意电压态分布的存储单元进行目标读电压确定,使得本申请实施例中的闪存读电压确定单元具有较强的适用性。
在一种可能的实现方式中,定位单元243可以根据开启电压位于每个开启电压区间内的存储单元的数量,确定以开启电压为横坐标且以存储单元的数量为纵坐标的开启电压分布曲线,进而根据开启电压分布曲线中谷底对应的开启电压,确定目标读电压。
定位单元243在确定出每个开启电压区间内存储单元的数量后,可以根据各开启电压区间内存储单元的数量构建开启电压分布曲线,开启电压分布曲线以开启电压为横坐标,并以相应开启电压下存储单元的数量为纵坐标。由图2可知,电压态交叠发生在两个钟形曲线的边缘,电压态交叠后开启电压分布曲线在读电压V1处对应最少的存储单元数量,即电压态交叠后开启电压分布曲线在V1处形成谷底,所以在根据各开启电压区间内存储单元的数量构建开启电压分布曲线后,识别开启电压分布曲线中的谷底,进而根据谷底对应的开启电压确定目标读电压。
在一个例子中,在确定出开启电压分布曲线的谷底后,可以将谷底对应的开启电压确定为各存储单元的目标读电压。
应理解,由于开启电压分布曲线上的谷底对应的电压为较优读电压,所以仅需要确定开启电压分布曲线上包括谷底的部分曲线,便可以基于获取到的部分曲线确定目标读电压,而无需获取完成的开启电压分布曲线。另外,根据各开启电压区间内存储单元的数量拟合出的开启电压分布曲线,与实际上各存储单元的开启电压分布存在一定误差,所以在电压态交叠区域内,谷底所对应的开启电压可能并不是对应存储单元数量最少的开启电压,但对应存储单元最少的开启电压与谷底对应的开启电压相接近,所以将谷底对应的开启电压确定为目标读电压对存储单元进行读取时,产生的错误数据的数量可能不是最少的,但满足实际使用的需求。
在本申请实施例中,根据各开启电压区间内存储单元的数量拟合开启电压分布曲线,确定开启电压分布曲线上位于电压态交叠区域的谷底,根据谷底对应的开启电压确定目标读电压,保证所确定出的目标读电压与较优读电压相同或相近,进而保证通过读电压对存储单元进行读取时产生较少数量的错误数据。
在一种可能的实现方式中,n所对应二进制数的位数小于n+1所对应二进制数的位数。
每次通过读电压对存储单元进行读取,可以获得每个存储单元对应的一个十进制数,存储单元对应的十进制数为0或1。通过n个读电压对存储单元进行读取后,可以获得每个存储单元对应的n个十进制数,对这n个十进制数进行求和所获得求和值的最大值为n。
n所对应的二进制数的位数小于n+1所对应二进制数的位数,即在所对应二进制数的位数一定的前提下,使n的数值尽可能大。比如,如果SRAM中用于存储求和值的位数为3,而3bit所能表示的最大整数为7,整数8所对应的二进制数需要4bit进行存储,所以取n等于7。如果SRAM中用于存储求和值的位数为4,而4bit所能表示的最大整数为15,整数16所对应的二进制数需要5bit进行存储,所以取n等于15。
在本申请实施例中,对存储单元进行读取的次数n所对应二进制数的位数,小于n+1所对应二进制数的位数,在确定读电压的过程中,仅需将存储单元对应的求和值存储到SRAM中,在求和值占用SRAM存储空间一定的前提下,使对存储单元进行读取的次数n尽可能多,在保证对硬件开销较小的前提下,提高所确定出目标读电压的准确性。
在一种可能的实现方式中,对存储单元进行读取的次数n等于7。
十进制整数7对应的二进制数为111,存储该二进制数需要3bit,而十进制数8对应的二进制数为1000,存储该二进制数需要4bit,所以n=7满足n所对应二进制数的位数小于n+1所对应二进制数的位数。
通过不同的7个读电压对存储单元进行7次读取,可以较为准确地确定电压态交叠区域内开启电压分布曲线的变化趋势,进而较准确地确定开启电压分布曲线上谷底对应的开启电压,保证所确定出的目标读电压的准确性。
在本申请实施例中,在确定读电压的过程中,通过不同的7个读电压对同一存储页中的各存储单元进行7次读取,使得存储单元对应的求和值最多占用SRAM中3bit的存储空间,同时通过7次对存储单元读取,可以较准确地确定出开启电压分布曲线上谷底的位置,从而在较小硬件开销的前提下,保证所确定目标读电压的准确性。
在一种可能的实现方式中,定位单元243根据n个读电压和每个存储单元对应的求和值,可能并不能确定出目标读电压,比如按照所包括电压由小至大的顺序,各存储单元区间内存储单元的数量单调递增或单调递减,则无法确定出开启电压分布曲线上的谷底,进而无法确定目标读电压。或者,定位单元243根据n个读电压和每个存储单元对应的求和值,所确定出的目标读电压不够准确。当出现上述两种情况时,需要通过新的读电压继续对存储单元进行读取,以能够确定出开启电压分布曲线上的谷底,或提高所确定出的目标读电压的准确性。
在通过新的读电压对存储单元进行读取,并获得读取值对应的十进制数后,将该十进制数与存储单元对应的求和值相加后,所获得的新的求和值可能无法在固定位数的存储空间中存储,造成数据溢出。比如,用于存储存储单元对应的求和值的存储空间为3bit,在对存储单元进行7次读取后,存储单元对应的求和值的最大值为7,可以存储在3bit的存储空间内。当对存储单元进行第8次读取后,存储单元对应的求和值的最大值为8,而8无法存储在3bit的存储空间内,会造成数据溢出。
为了避免上述数据溢出的问题,需要消除某些次对存储单元进行读取而对求和值造成的影响,但是前n次对存储单元进行读取,已经对每次读取的读取值对应的十进制数求和,仅存储了每个存储单元对应的求和值,无法单独提取出某次对存储单元进行读取而加入求和值中的十进制数,为此本申请实施例提供了一种增加读取次数而不会导致求和值数据溢出的方法。
读取单元241可以通过第n+1个读电压对各存储单元进行读取,获得每个存储单元在第n+1个读电压下的读取值。读取单元241通过第n+1个读电压对各存储单元进行读取的过程,与前述实施例中通过前n个读电压对各存储单元进行读取的过程相同,在此不再进行赘述。
求和单元242可以从前n个读电压中确定待替换读电压,并确定以前n个读电压为分界点形成的n+1个开启电压区间,然后根据第n+1个开启电压区间中电压与待替换读电压的大小关系,从各存储单元中确定对应求和值受待替换读电压影响的目标存储单元,然后对目标存储单元对应的求和值减1后,分别计算每个存储单元在第n+1个读电压下的读取值对应的十进制数与该存储单元对应的求和值的和,将计算结果更新为该存储单元对应的求和值。
通过一个读电压对各存储单元进行读取后,会有部分存储单元对应的求和值会被加1,这部分存储单元的求和值受该读电压的影响,而另外的存储单元对应的求和值由于被加了0,所以会保持不变,这部分存储单元的求和值不受该读电压的影响。
所确定出的待替换读电压可以是距离开启电压分布曲线上谷底较远的读电压,也可以是距离谷底较近的读电压,对此本申请实施例不做限定,在本申请实施例中不对待替换读电压的确定方法进行讨论。与之相对应的,第n+1个读电压可以大于前n个读电压中的最大读电压,也可以小于前n个读电压中的最小读电压,还可以在前n个读电压中任意两个相邻读电压之间,对此本申请实施例也不做限定。
在对目标存储单元对应的求和值减1后,各存储单元对应的求和值的最小值为n-1,所以将第n+1个读电压下读取值对应的十进制数与存储单元对应的求和值进行相加后,所获得的新的求和值的最大值为n,用于存储求和值的存储空间仍可正确存储求和值,不会造成数据溢出。
如图4所示,如果将读电压V6确定为待替换读电压,由于在通过读电压V6对各存储单元进行读取后,仅有位于开启电压区间Q1内的存储单元对应的求和值被加1,而开启电压区间Q2~Q8内的存储单元对应的求和值均被加0,所以对应求和值受读电压V6影响的存储单元均位于开启电压区间Q1内,而开启电压区间Q1内存储单元对应的求和值均为7,所以只需将对应求和值为7的存储单元的求和值减1,便可以消除读电压V6对各存储单元对应的求和值的影响。如果将读电压V2确定为待替换读电压,由于在通过读电压V2对各存储单元进行读取后,位于开启电压区间Q1~Q3内的存储单元对应的求和值被加1,而开启电压区间Q4~Q8内的存储单元对应的求和值均被加0,所以对应求和值受读电压V2影响的存储单元均位于开启电压区间Q1~Q3内,而开启电压区间Q1内存储单元对应的求和值均为7,开启电压区间Q2内存储单元对应的求和值均为6,开启电压区间Q3内存储单元对应的求和值均为5,所以只需将对应求和值为5、6和7的存储单元的求和值均减1,便可以消除读电压V2对各存储单元对应的求和值的影响。
在求和单元242根据第n+1个读电压对各存储单元的求和值进行更新后,定位单元243根据前n个读电压中除待替换读电压之外的n-1个读电压、第n+1个读电压、及每个存储单元对应的求和值,重新确定目标读电压。求和单元242根据n-1个原有读电压和第n+1个读电压,及各存储单元对应的求和值确定目标读电压的过程,与前述实施例中根据n各读电压和各存储单元对应的求和值确定目标读电压的过程相同,在此不再进行赘述。
在本申请实施例中,求和单元242确定出对应求和值受待替换读电压影响的目标存储单元后,将目标存储单元对应的求和值减1,然后将每个存储单元在第n+1个读电压下读取值对应的十进制与该存储单元对应的求和值相加,获得每个存储单元的新的求和值,然后定位单元243基于各存储单元的新求和值确定目标读电压,在保证存储单元的请求和不会占用更大存储空间的同时,增加了对各存储单元进行读取的次数,以提高确定目标读电压的成功率,并可以提高所确定出的目标读电压的准确性。
在一种可能的实现方式中,如果读电压大于存储单元的开启电压时,存储单元的读取值为第一数值,求和单元242可以确定所包括电压小于待替换读电压的开启电压区间的个数m1,然后将对应求和值大于n-m1的存储单元确定为目标存储单元,其中,m1为小于或等于n的正整数。
当读电压大于存储单元的开启电压时,存储单元的读取值为第一数值,此时,如果存储单元的开启电压小于读电压,则存储单元对应的十进制数为1,如果存储单元的开启电压大于读电压,则存储单元对应的十进制数为0。通过待替换读电压对各存储单元进行读取后,开启电压小于待替换读电压的存储单元对应的求和值被加1,而开启电压大于待替换读电压的存储单元对应的求和值被加0,被加1的求和值受待替换读电压的影响,被加0的求和值不受待替换读电压的影响。根据对应求和值受待替换读电压影响的各存储单元所在的开启电压区间,可以确定受待替换读电压影响的开启电压区间的数量m1,而对应求和值大于n-m1的存储单元的求和值均会收到待替换读电压的影响,所以将对应求和值大于n-m1的各存储单元确定为目标存储单元。
如图4所示,如果待替换读电压为读电压V4,则开启电压区间Q1~Q2内存储单元对应的求和值受读电压V4的影响,故受读电压V4影响的开启电压区间的数量为2,进而将对应求和值大于5的存储单元确定为目标存储单元,即将对应求和值等于7或6的存储单元确定为目标存储单元。如果待替换读电压为读电压V7,则开启电压区间Q1~Q7内存储单元对应的求和值受读电压V7的影响,故受读电压V7影响的开启电压区间的数量为7,进而将对应求和值大于0的存储单元确定为目标存储单元,即将对应求和值等于7、6、5、4、3、2或1的存储单元确定为目标存储单元。
在本申请实施例中,若读电压大于存储单元的开启电压时,存储单元的读取值为第一数值,求和单元242确定所包括电压小于待替换读电压的开启电压区间的个数m1,将对应求和值大于n-m1的存储单元确定为目标存储单元,准确识别出对应求和值受待替换读电压影响的各目标存储单元,进而保证对存储单元的求和值进行更新的准确性。
在一种可能的实现方式中,如果读电压大于存储单元的开启电压时,存储单元的读取值为第二数值,求和单元242可以确定所包括电压大于待替换读电压的开启电压区间的个数m2,将对应求和值大于n-m2的存储单元确定为目标存储单元,其中,m2为小于或等于n的正整数。
当读电压大于存储单元的开启电压时,存储单元的读取值为第二数值,此时,如果存储单元的开启电压小于读电压,则存储单元对应的十进制数为0,如果存储单元的开启电压大于读电压,则存储单元对应的十进制数为1。通过待替换读电压对各存储单元进行读取后,开启电压小于待替换读电压的存储单元对应的求和值被加0,而开启电压大于待替换读电压的存储单元对应的求和值被加1,被加1的求和值受待替换读电压的影响,被加0的求和值不受待替换读电压的影响。根据对应求和值受待替换读电压影响的各存储单元所在的开启电压区间,可以确定受待替换读电压影响的开启电压区间的数量m2,而对应求和值大于n-m2的存储单元的求和值均会收到待替换读电压的影响,所以将对应求和值大于n-m2的各存储单元确定为目标存储单元。
如图5所示,如果待替换读电压为读电压V1,则开启电压区间Q5~Q8内存储单元对应的求和值受读电压V1的影响,故受读电压V1影响的开启电压区间的数量为4,进而将对应求和值大于3的存储单元确定为目标存储单元,即将对应求和值等于4、5、6或7的存储单元确定为目标存储单元。如果待替换读电压为读电压V7,则开启电压区间Q8内存储单元对应的求和值受读电压V7的影响,故受读电压V7影响的开启电压区间的数量为1,进而将对应求和值大于6的存储单元确定为目标存储单元,即将对应求和值等于7的存储单元确定为目标存储单元。
在本申请实施例中,若读电压大于存储单元的开启电压时,存储单元的读取值为第二数值,求和单元242确定所包括电压大于待替换读电压的开启电压区间的个数m2,将对应求和值大于n-m2的存储单元确定为目标存储单元,准确识别出对应求和值受待替换读电压影响的各目标存储单元,进而保证对存储单元的求和值进行更新的准确性。
闪存读电压确定方法
图6是本申请一个实施例的闪存读电压确定方法的流程图,该闪存读电压确定方法用于上述任一闪存读电压确定单元,如图6所示,该闪存读电压确定方法包括:
步骤601、通过n个读电压对位于闪存芯片中同一存储页包括的各存储单元进行读取,获得存储单元在n个读电压下的读取值,其中,n为大于或等于3的正整数;
步骤602、将为第一数值的读取值转换为十进制数1,并将为第二数值的读取值转换为十进制数0,对存储单元在各读电压下的读取值对应的十进制数求和,获得该存储单元对应的求和值;
步骤603、根据n个读电压和存储单元对应的求和值,确定用于对各存储单元进行读取的目标读电压。
在本申请实施例中,通过n个读电压对各存储单元进行读取,获得每个存储单元在每个读电压下的读取值后,按读取值的数值将读取值转换为十进制数0或1,并分别对每个存储单元对应的各十进制数进行求和获得求和值,进而可以根据n个读电压和每个存储单元对应的求和值确定目标读电压。存储每个存储单元的求和值,相对于存储每个存储单元在每个读电压下的读取值,所需存储空间更小,从而能够降低确定读电压过程中的硬件开销。
需要说明的是,由于闪存读电压确定方法的细节在上述实施例的闪存读电压确定单元部分,已经结合结构示意图进行了详细说明,具体过程可参见前述闪存读电压确定单元实施例中的描述,在此不再进行赘述。
本申请实施例的商业价值
在本申请实施例中,通过读电压对存储单元进行读取,获得读取值后,根据对应数值的不同将读取值转换为十进制数0或1,对每个存储单元在各读电压下的读取值对应的十进制数进行累加,获得每个存储单元对应的求和值,进而基于各存储单元对应的求和值确定开启电压分布曲线,识别开启电压分布曲线中的谷底,根据谷底对应的开启电压确定实际使用SSD过程中对存储单元进行读取的目标读电压。在确定目标读电压的过程中仅需存储各存储单元对应的求和值,在保证通过目标读电压对存储单元进行读取所获得数据中错误数据较少的前提下,减小了确定目标读电压过程中对SRAM存储空间的占用,硬件开销较小,从而可以提高SSD的读取性能,提高SSD产品的竞争力。
需要说明的是,本申请实施例所涉及到的与用户有关的信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于对模型进行训练的样本数据、用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,并且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准,并提供有相应的操作入口,供用户选择授权或者拒绝。
应该理解,本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同或相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于方法实施例而言,由于其基本相似于装置和系统实施例中描述的方法,所以描述的比较简单,相关之处参见其他实施例的部分说明即可。
应该理解,上述对本说明书特定实施例进行了描述。其它实施例在权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
应该理解,本文用单数形式描述或者在附图中仅显示一个的元件并不代表将该元件的数量限于一个。此外,本文中被描述或示出为分开的模块或元件可被组合为单个模块或元件,且本文中被描述或示出为单个的模块或元件可被拆分为多个模块或元件。
还应理解,本文采用的术语和表述方式只是用于描述,本说明书的一个或多个实施例并不应局限于这些术语和表述。使用这些术语和表述并不意味着排除任何示意和描述(或其中部分)的等效特征,应认识到可能存在的各种修改也应包含在权利要求范围内。其他修改、变化和替换也可能存在。相应的,权利要求应视为覆盖所有这些等效物。