FLASH学习
1、Nand Flash基础
NAND Flash是一种非易失性随机访问存储介质,基于浮栅(Floating Gate)晶体管设计,通过浮栅来锁存电荷,电荷被储存在浮栅中,它们在无电源供应的情况下仍然可以保持。
1.1、Nand Flash加工过程
NAND Flash是从原始的硅材料加工出来的,硅材料被加工成晶圆(Wafer),一片晶圆上可以做出几百颗NAND FLASH芯片
芯片未封装前的晶粒成为Die,它是从Wafer上用激光切割而成的小片,每个Die就是一个独立的功能芯片,它由无数个晶体管电路组成,但最终可被作为一个单位封装起来成为闪存颗粒芯片。
1.2、Nand Flash的结构
NAND Flash的容量结构从大到小可以分为Device、Target、LUN、Plane、Block、Page、Cell。
Die/LUN是接收和执行Flash命令的基本单元,不同的LUN可以同时接受和执行不同的命令。但在一个LUN中,一次只能执行一个命令,不能对其中的某个Page写的同时右对齐他Page进行读访问。
1、Device就是指单片Nand Flash,对外提供Package封装的芯片,通常包含1个或多个Targert
2、Target拥有独立片选单元,可以单独寻址,通常包含1或多个LUN;LUN就是Die,能够独立封装的最新的物理单元,通常包含多个Plane
3、Plane拥有独立的Page寄存器,通常LUN包含1K或2K个奇数Block或偶数个Block
4、Block是能够执行擦除操作的最小单元,通常有多个Page组成
5、Page是能够执行编程和读操作的最小单元,通常大小为4KB/8KB/16KB/32KB等
6、Cell是Page中的最小操作擦写读单元,对应一个浮栅晶体管,可以存储1bit后者多bit数据,主要颗粒类型
在nand flash里,LUN(Logical Unit)和die是同一个意思。都是执行cmd和report status的最小单位一个target对应一个CE、R/B信号线。根据封装的不同,target里可能会有一个或多个die。
下图是 MT29F64G08CBCAB Flash阵列
一个LUN有两个Plane。上面的图是单个Page的情况,Page是Block的横截面,长8K+448,宽8bit,即一个Page是(8K + 48)B,Block是Plane的高。
下面的图是256个Page的情况,把下面的图朝前放倒就是256个上面的图的叠加。
1.3、Micron Flash芯片型号含义
MT29F32G08ABCABH1: 则表示
镁光
NAND Flash
32G
8bit
一个Cell1bit
包含一个Die
同步/异步两种模式
1.4、100-Ball BGA 封装
BGA:Ball Grid Array 球栅阵列。该封装是一种表面贴装或芯片载体封装,用于集成电路和微处理器等安装设备。与其他类型的封装相比,BGA封装具有更高的引脚密度、更低的热阻和更低的电感。这意味着与双直插式或扁平封装相比,在高速下有更多的互连引脚和更高的性能
缺点:焊球无法像长引线那样弯曲,并且封装密度使得检查故障或其他像差变得困难。此外,用于大型生产运行的可靠焊接设备可能非常昂贵。
1.5、阵列地址寻址
其中CA是指列地址,PA指页地址,BA是指Block地址 。
列地址8640 (21C0h)到16,383 (3FFFh)是无效的,超出了范围,在设备中不存在,不能被寻址。
BA[7]用来选择通道:0表示Plane0,1表示Plane1。
LA0为lun选择位。只有当target**共享2个lun时才会出现;否则,应该保持低利率。
2、信号定义
信号命(异步模式) | 信号方向 | 描述 |
---|---|---|
ALE | Output | Address Latch Enable地址锁存使能:用于指示何时能从DQ数据总线上锁存地址信息 |
CE# | Output | Chip Enable片选信号,低有效。 |
CLE | Output | Command Latch Enable命令锁存使能:用于指示何时能从DQ数据总线上锁存命令信息。 |
DQ[7:0] | Inout | 数据总线,为Inout型,用于传输数据、地址、命令信息。 |
RE# | Output | Read Enable读使能,低有效 |
WE# | Output | Write Enable写使能,低有效 |
WP# | Output | Write Protect写保护,低有效。 |
R/B# | Input | Ready/Busy忙闲信号,用于指示Flash的忙闲状态,高电平为Ready,低电平为Busy。 |
3、Flash状态
即使R/B#或RDY已准备就绪,也不要在tWB期间发出新命令。
延时参数说明(mode0)(具体可参照手册,从P134开始)
tADL:从地址周期开始计数,在WEn的第一个上升沿结束,用于数据输入
tDS:数据建立时间 40ns
tDH:数据保持时间 20ns
tRP: 读使能脉冲宽度 50ns
tREH: 读使能高电平保持时间 30ns
定时模式默认为0
参数定义地址
3.1、总线空闲状态
总线空状态即为:CE#为低电平,片选中;WE#与RE#均为高电平,非有效。此时总线上没有任何命令、地址、数据的传输。当异步接口激活时,DQS是三态。
3.2、命令输出
命令输出是指,控制器向Flash发送Flash命令序列,以供Flash对命令进行锁存。这一过程的时序如下图所示:
当CE#为低、CLE为高、ALE为低、RE#为高时,Flash将在WE#的上升沿采样DQ数据总线上的信息,作为命令信息
当对应Flash为Busy时,大部分命令的传输会被忽略,除了READ STATUS(70h)以及READ STATUS ENHANCED(78h),这两种命令在Flash Busy的状态下也可以传输。
3.3、地址输出
地址输出是指,控制器向Flash发送Flash操作地址序列,以供Flash对地址信息进行锁存。这一过程的时序如下图所示:
当CE#为低、CLE为低、ALE为高、RE#为高时,Flash将在WE#的上升沿采样DQ数据总线上的信息,作为地址信息。
图中展示了发送完整5Byte操作地址的过程,先发送2Byte列地址,再发送3Byte行地址。需要注意,在地址中的无效位(例如不在地址空间中),必须置为0。
3.4、数据输出(FLASH写入)
数据输出是指,控制器向Flash发送Flash需要接收的数据序列。这一过程的时序如下图所示:
当CE#为低、CLE为低、ALE为低、RE#为高时,Flash将在WE#的上升沿采样DQ数据总线上的信息,作为数据信息。当对应Flash为Busy时,输出至Flash的数据将被忽略。
3.5、数据输入(FLASH读取)
数据输入是指,控制器从Flash获取Flash发送来的数据序列。这一过程的时序如下图所示:
当CE#为低、CLE为低、ALE为低、WE#为高、R/B#为高时,控制器可以类似时钟信号一样使RE#周期性的高低跳变,Flash会根据RE#信号将数据输入至控制器。在当前RE#周期中RE#下降沿要读出的数据,将在下一个RE#周期的RE#下降沿允许采样。
不难发现,这里的接收Flash数据时序与常规不太相同。这是由于我们要求Flash工作于Mode 5,此时RE# Cycle time=20ns<30ns,因此要工作于Extended Data Ouput mode(EDO mode)。若RE# Cycle time>30ns则只需在同一RE#周期中RE#上升沿采样数据即可
3.6暂停数据输入/输出
暂停数据输入或数据输出分别通过保持WE#或RE#高来完成。
mode0读时钟:3.29M
mode0写时钟:7.8125M
4、FLASH命令说明
Nand Flash需要执行多种Flash命令,这些命令有其各自的命令码以及需要的地址信息。(具体可看手册P55)
命令分类 | 命令名 | 命令码周期1 | 地址周期数目 | 数据周期数目 | 命令码周期2 |
---|---|---|---|---|---|
复位操作 | RESET | FFh | 0 | - | - |
识别操作 | READ ID | 90h | 1 | - | - |
配置操作 | SET FEATURE | EFh | 1 | 4 | - |
配置操作 | GET FEATURE | EEh | 1 | - | - |
状态操作 | READ STATUS | 70h | 0 | - | - |
读操作 | READ PAGE | 00h | 5 | - | 30h |
写操作 | PROGRAM PAGE | 80h | 5 | Yes | 10h |
擦除操作 | ERASE BLOCK | 60h | 3 | - | D0h |
4.1、复位操作
Reset命令用来将Nand Flash中的target进行复位,使之被恢复至一个初始确定状态,在复位的过程中Flash会放弃所有正在执行的命令。Reset命令会被target内的所有LUNs就收,即使它们处于Busy状态。下图是reset命令时序:
(1)控制器向Flash发送命令周期1,命令码为FFh。
(2)在WE#从低恢复为高的上升沿开始计算,最多经过100ns后,Flash进入Busy状态
(3)Flash进入Busy状态开始计算,最多经过5us后,Flash重新回到Ready状态。
(4)回到Ready状态则基本说明复位完成。
4.2、操作页
在输入数据之前的的任何时候,都可以更改列地址和行地址。数据输入完成后,向命令寄存器写入8’h10。当die从忙变为ready后,应该检查失败bit的状态。
4.3、读取页
5、 Flash 仿真
5.1、加速仿真
为了加快仿真,需要对模型的时间参数做些修改:
tBERS_min:擦除操作最小时间 1500000 -> 15000
tBERS_max:擦除操作最大时间 7000000 -> 70000
tFEAT:配置读取参数 1000 -> 100
tPROG_typ:将数据从数据寄存器搬进对应Page的最小时间 350000 -> 3500
tPROG_max:将数据从数据寄存器搬进对应Page的最大时间 560000 -> 5600
tR_max:将数据从Page搬进数据寄存器的最大时间 35000 -> 3500
在编译命令前加**+define+SHORT_RESET**,加快复位时间
5.2、选择模型
通过+define+CLASSU定义对应的宏定义,选择自己对应的模型,配置好后就可以仿真。
5.3、模型各个文件功能
整个model包括nand_defines.vh,nand_parameters.vh,subtest.vh,nand_die_model.v,nand_model.v,tb.v六个部分,下面对这六个部分主要功能分别做出说明:
- nand_die_model.v
单个逻辑单元(die)的模型。 - nand_model.v
一片Flash的模型,对多个逻辑单元(die)进行结构封装。 - nand_defines.vh
用于为nand_model实例化生成正确的端口映射。 - nand_parameters.vh
包含模型使用的所有参数。 - tb.v
模型的测试文件,主要定义Flash各项功能相关的task任务。 - subtest.vh
根据需求调用tb.v文件中的各项任务,模拟Flash功能实现的顺序。
仿真时,使用modelsim编译nand_model.v,nand_die_model.v和tb.v。
仿真测试文件tb即可。
6、 Flash ECC校验
6.1、 二进制域与多项式
二进制的11011,可以表示成[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WVclHhvC-1680614890247)(./1656915031864.png)]
二进制的四则运算和十进制差不多。1+1=2=0,所以11*11用多项式表示就是[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c92UnZNj-1680614890247)(./1656915102140.png)]
x的系数2在二进制中就是0.
在二进制域中,加等于减,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LR8Mui13-1680614890247)(./1656915202091.png)]相当于[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TuvDxoFG-1680614890247)(./1656915214207.png)]
6.1、 检错与纠错
纠错码分为两种,一种是块状编码(简称块状码或分组码),一种是卷积编码(简称卷积码)
6.1.1、块状码
进行块状编码时,需要对用户数据分成固定长度的组,针对每一组计算并添加冗余bit。以Flash ( 闪存 ) 为例, 其内部的数据被划分为512比特( 每一块数据的比特数n = 512 ) 的块, 针对每个块有k个按照一定算法生成的冗余比特。这些冗余比特是根据n比特数据产生的奇偶校验比特。数据比特(n) 及冗余比特(k)共同构成编码字, 这 n+k 比特被存储在闪存中。从闪存中读出数据时,n+k比特被读出, 此后需要根据编码规则进行错误纠正。在块状码中, 两个编码块之间不存在相互关联, 每个数据块独立地进行错误纠正,与其他数据块无关。
6.1.2、卷积码
与块状码不同, 卷积编码的当前编码输出不仅与当前输入有关, 还与此前的输入有关。
6.1.3、纠错原理
假如我们的真正的消息是m(x),然后乘上一个编码多项式p(x),得到m(x)p(x)再将其发送过去。发送过程中会会受到很多干扰,于是多项式被加上错误多项式e(x),而接收者接收者的消息为c(x),就有
接收者怎么知道消息有没错呢?接收者事先就会和发送者商量好p(x),然后就很简单,只要让c(x)除以p(x),如果余项是0,即没有e(x),没有受到干扰,那么商就是m(x),就是正确的消息。如果余项不是零,我们的商就变成了m(x) + e(x)/p(x),无法将真正的消息分离出来。前提是p(x)必须是不可约的本原多项式(primitive polynomials),这样才能让e(x)不被除尽,我们才能意识到有干扰的存在。本原多项式就好在,在所有错误余项e(x)出现前前,e(x)/p(x)的余项不会重复。之后将开始重复,这就是被称为循环(cyclic)码的原因。
本源多项式规则:
如果要纠正多个错误,此时仅一个编码多项式p(x)就不够了,我们还需要更多的编码多项式来让我们能找出多个错误。这时就轮到BCH码出场了,其编码多项式标准形式是:
如果我们要设计一个可以纠正两个错误的编码多项式:
要设计一个可以纠正三个错误的编码多项式:
纠正多个错误的例子:
前两项余项不为0,而第三项为0说明接到的只有两处错误。
把错误位置找出来就需要错误定位多项式(error locator polynomial)
如果能找到这个函数的两个根,也就找到了e1和e2
6.2、 汉明码
汉明码是一种线性码,对于一个长度为比特的编码块,有n个冗余比特,其余的为数据比特。常用的汉明码有(7,5)和15,11)。(7,5)汉明码表示编码块长度为7,其中包括4个数据比特和3个冗余比特。每个冗余比特都是部分数据比特按照一定方式进行异或运算(等效于选择部分比特进行奇偶校验运算)得到的。汉明码是一个线性编码集合,每个编码块都可以检测岀两个以内的比特错误,可以纠正单比特错误。
6.3、有限域
二进制中-等于+,2等于0
6.4、 BCH编码
在GF( 2 q )中,用多项式表示对应的有限域中的数值,多项式又可表示成二进制bit流的形式,等于二进制bit流与符号之间的一一映射,同时二进制多项式加法和二进制的按位异或等同(二进制流所受的干扰可用加法表示),多项式乘法及其逆运算能够实现多项式的恢复,本原多项式能保证逆运算结果具有唯一性。
BCH码使用有限域上的域论与多项式,可以构建一个检测多项式,这样接收端就可以检测是否有错误发生。
本原多项式:一个 m 阶的不可约多项式 f ( x ) ,如果 f ( x )整除 x ^n + 1的最小正整数 n 满足 n = 2 ^m − 1,则该多项式是本原的。
若线性循环码的生成多项式具有如下形式g(x)=LCM[m1(x),m3(x)…m2t−1(x)]。由此生成的循环码叫做BCH码
LCM:表示最小公倍数
t:纠错个数
mi(x):素多项式,不能被分解的叫做素多项式
其中最小码距d≥d0=2t+1,d0为设计码距,两个编码块中对应位不同的bit数量,则这个码可以纠正t个随机独立差错
BCH 码是线性循环码的一种,它明确了码的最小距离、码长、以及校验位数目,跟其它纠错算法相比,在同样的编码效率下,纠错能力较强;它特别适合码长不太长的情况,比如本文的码长是 4304bit,就比较合适。