上节内容讲解了NOR Flash的原理与应用,NAND Flash存储器由于容量大、价格低等优点在非易事数据或程序存储等方面获得了广泛应用,因此本节内容就NAND Flash的原理、结构、接口及读写时序等方面的内容进行比较详细介绍。
1. NAND Flash存储器单元结构
NAND Flash存储器常见的有SLC(single level cell) 和MLC(multi level cell)两种,细分还有eSLC和eMLC等。因为闪存是一种电压控制元件,因此它是以不同的电压范围来代表不同的数据,现在看看两者之间的区别。
图1 FLASH存储器单元结构
-
SLC(single-level cell):
单阶存储单元SLC,也就是闪存的每一个存储单元仅存储1bit的数据,存储的数据代表0还是1是基于V的电压阈值来判定。对于闪存写入,就是对其浮栅进行充电,使得它的电压值超过电压判定点A,存储单元就表示为0(已编程),如果没有充电或者电压阈值低于A点,就表示1(已擦除)。这里的单元核与掩膜中的2极管或MOS管的功能相似。
SLC NAND FLASH由于采用单一电压控制通断,因次性能稳定,容错性能好,但相比MLC的FLASH容量较低。SLC主要针是对军工,企业级的应用,有着高速写入,低出错率和耐用性等特点。SLC单元电压控制如图2所示。
图2 SLC NAND FLASH 单元控电压制示意图
-
MLC(Multi-level cell)多阶存储单元结构
其实质是在每个存储单元存储2bit的数据,存储的数据是”00″,”01″,”10″,”11″也是基于电压的阈值的判定,其被分成4份。相对于SLC,MLC的每个单元是2bit,那么单片的容量较大,同等容量价格比较低。同时其存储单元中存放更多的数据,那么其结构也相对复杂,出错的机会也比较大。因次一般会有ECC算法,检查存储单元数据的有效性。MLC FLASH主要针对的是消费级应用,有着高容量,低成本等特点,广泛使用于USB闪存,SSD硬盘,手机,数码相机等存储卡。
SLC (1 bit per cell) – fastest, highest cost
MLC (2 bits per cell)
TLC (3 bits per cell)
QLC (4 bits per cell) – slowest, lowest cost
PLC (5 bits per cell) – currently in development, penta-level cell (PLC).
图3 MLC NAND FLASH 单元控制示意图
2. NAND FLASH 的读写及时序
以下内容将以K9F1G08X0C这款芯片为例介绍其硬件组成和工作原理,其它的芯片工作原理与K9F1G08X0C基本相同,同学们可以自己阅读相关资料。NAND FLASH 与NOR FLASH相比,擦除和编程速度块,容量大,价格低廉。但读取速度较慢。
-
总线复用
一般由于NAND的FLASH的容量较大,地址线多,一般外部的数据总线和地址总线都采用复用的方式。图4 是K9F1G08X0C内部功能框图,从图中可以看出:数据线,命令线,地址线(高地址、低地址)全部复用,一般在使用总线时需要严格的控制总线和逻辑,通常在RTL设计时由状态机实现。
图4K9F1G08X0C内部功能框图
由于数据线,命令线,地址线(高地址、低地址)全部复用,因次外围的有用管脚较少,在TSSOP48脚的封装中,大多数是管脚为空脚NC(no connect),在硬件设计时,这些管脚可以和外部没有电气连接。如图5中有效的管脚只有I/O0 ~ I/O7,CLE,ALE,#CE,#RE,#WE,#WP,#R/B等管脚。
由于TSOP1的性能比较好,因次采用TSOP1的标准封装,目前大容量的NAND FLASH还有BGA封装。该芯片在嵌入式系统中应用非常广泛。其中NC 表示空脚(no connect )。
图5 K9F1G08X0C芯片封装示意图
表1 K9F1G08X0C管脚功能描述
信号名称 | 管脚名称 | 类型 | 描述 |
输入/输出(
数据线, 地址线, 命令线 ) |
I/O0 ~ I/O7 | INPUTS
/OUTPUTS |
地址/命令/数据,在读操作的时候用来输入/输出数据,在地址操作时输入地址,在命令操作时输入命令 |
命令锁存使能 | CLE | Input | CLE为高时,在WE#上升沿,命令通过I/O[7:0]锁存到命令寄存器,当不传输命令时,CLE应该为低 |
地址锁存
使能 |
ALE | Input | ALE为高时,在WE#下降沿,地址出现在I/O端口上,在WE#上升沿时刻,地址信息通过I/O[7:0]锁存到片内的地址寄存器上。如果传输的不是地址信息,ALE应该为低 |
片选 | #CE | Input | 片选信号,低电平有效。一旦器件进入PROGRAM或ERASE操作,CE#可以变成无效状态。 |
读使能 | #RE | Input | 读数据阶段,在#RE上升沿将数据读回。 |
写使能 | #WE | Input | 在#WE上升沿命令/地址/数据锁存 |
写保护 | #WP | Input | 当为低时候,所有的PROGRAM和ERASE都被禁止 |
准备/忙状态 | R/B# | OD | 集电极开路输出。外部需要接上拉电阻,这个脚表示芯片正在进行PROGRAM或ERASE操作。在读操作期间,表示数据正从阵列中传输到串行数据寄存器中,一旦这些操作完成,R/B#回到High-Z状态。 |
-
Nand Flash的读写寻址方式
-
Nand Flash寻址及ECC
-
从图6可以看出,NAND Flash是按照页(pages), 块(blocks)的方式进行组织的。每个页(2K+64)Bytes,其中64Bytes是ECC(error correcting code)是纠错码,如汉明码(Hamming code)可以检查出2位错吗,可以纠正一位错码。因次在读操作时都会做ECC检查,如果发现有一位错误并进行纠正。在擦除失败或编程失败时,一般采用坏块替代的方式。列地址(Column Adress) 决定页内寻址(2K+64),Row Address决定页面寻址, 可以寻址64K 页。
图6 K9F1G08X0C 块单元寻址地址顺序
-
Nand flash 控制信号编码
Nand flash 控制信号在实际操作中编码顺序是不同的,具体见表2。以写模式(write mode)为例,先写命令(表示以后的操作将是编程),此时CLE应为高电平,ALE为低电平,#WE由低到高在上升沿写入,#RE为高电平。后面紧跟写地址,此时CLE为低,ALE应为高电平。在读数据时,#WE为高,#RE下降沿触发数据输出,在上升沿将数据锁存。
表2 K9F1G08X0C NAND FLASH 控制信号编码
-
-
时序关系
-
Nand flash 控制信号在实际操作中个信号的时序不同的器件不同,具体见表3,
-
- Setup Time 建立时间,表示在数据线(或相对应的控制信号)有效之前已经建立并维持的时间。
- Hold time 保持时间,就是在数据(或控制信号)已经完成操作后仍需保留的时间。
- Cycle Time 周期信号,即前后两次操作需要的时间。
在FPGA编程前要仔细阅读该表,确定各信号的时序关系,才能正确编程并能有效操作各个信号。
表3 K9F1G08X0C NAND FLASH 控制信号时间参数表
表4描述了各个控制信号之间的时序关系,如CLE to RE# Delay 指的是当CLE结束后RE#信号需等待的时间.
表4 命令时序参数表(信号间相对时间关系)
-
NAND FLASH的操作命令
操作命令见表5,这里的操作命令的原理与NOR FLASH非常类似。但是最大区别是NAND Flash 存储器读数据也需要先从命令开始。因次NAND FLASH 存储器不能作为直接运行的程序存储器(XIP)使用。
-
-
读命令: 00h,30h
-
在嵌入式系统中,可以把程序存到NAND FLASH 存储器中,在系统配置完成后,将程序搬移到内存中(DDR3,4)中在运行。此时NAND FLASH相当于硬盘。
表5 NAND FLASH 操作命令表
-
-
初始无效块检查
-
初始无效块(Invalid Block)的检查,在计算机或控制系统中首先对初始无效块(Invalid Block)进行检查,如果有坏块(Invalid Block)存在,主控制程序将对坏块进行记录,并形成坏块记录表。坏块标记前禁止擦除。在以后的数据交换时避免使用已标记的坏块。由于在擦除操着时,将会把坏块信息擦除,因次首次使用NAND Flash存储器时严格禁止对在没有坏块标记时对芯片进行擦除或编程。
图7 无效块检查流程图
-
-
编程操作
-
编程操作流程
-
-
编程操作应有如下步骤,流程图如图8所示。
i. 写命令80H,
ii. 写地址,
iii. 写数据,可以批量写入,
iv. 写命令10H,
v. 读状态寄存器,
vi. 空闲检查(判断I/O6 或是否为0),
vii. 编程出错检查;如果I/O0=0,正确编程,
viii. 如果I/O0=1,编程错误,出错处理;
-
-
-
坏块处理
-
-
如果编程出错,同样要进行坏块标记与处理,具体的处理方式可能不同。一般复制程序到另一个有效的块中。
-
-
ECC检查:
-
如果仅是一个bit错误,可以通过ECC纠正,不需要块拷贝和坏块标记。这只是针对读数据检查。
图8 NAND Flash 存储器编程流程图
-
-
按照页码顺序编程
-
在块编程中,必须按照块中页码的顺序编程,页码顺序从小到大,NAND Flash 不支持页码的乱序编程。编程从最低页(LSB PAGE)开始,LSB PAGE不一定是Page0 ,只是在要编程的页码中最低页码。
图9 块内按页码编程流程图
-
块擦除及读操作流程
a)块擦除: 写命令60H, 写要擦除块的块地址,写命令D0H.
i. 检查操作状态:写“读状态”命令, 检查I/O6或是否为0,如果为1,等待
ii. I/O6或为0,检查I/O 0是否为零;如果I/O为0,则擦除正确,否则擦写错误。
iii.擦写正确,可以为对应的块进行编程。
iv.如果擦写出错,重复上面的步骤,如果仍然出错,则标记坏块。
b)读操作:
i. 写命令60H,
ii. 写读地址,
iii.写命令30H,
iv.读数据,检查ECC,并纠错
v.如果无法纠正,坏块标记
图10 块擦除及读操作流程图
作业题:用Verilog或C语言实现块擦除
-
无效块替换
A)如果发现在擦除或编程中块‘A’中第n个页有错误,
B)复制第1—N-1页的内容到另一个自由的块(块B)中相同位置
C)将缓存中第n 页的内容复制的块B的第n页,
D)将块A添加的坏块的记录表中
E)在坏块中做标记(类似出厂时厂家标记的位置)
F)不要擦除该块。因次在擦除或编程前要将块中的内容读到缓冲区中。
图 11 无效块替换示意图
作业题:用C(或Verilog)语言实现无效块替代程序
-
编程写时序
按照控制信号命令的逻辑,CLE控制命令写入,ALE在高电平时写入地址,在 与 为低电平时按照字节串行的方式写入。在非写入期间#CE 的值可以为高电平,可以降低功耗。其它的操作时序类似,可以参照NAND FLASH 存储器的文档描述, 这里不在累述。
如图12在写地址之后,数据可以批量写入,直到下一个命令10H
图12 编程写时序
由于数据编程可以批量写入,因此NAND Flash的编程操作比Nor Flash 快很多,这也是NAND Flash在SSD硬盘获得广泛应用的一个重要原因。
老师,我想问下在说到坏块记录表那里,这个记录表是存放在哪里的?后面如果对flash执行了擦除操作,这会不会把这记录表或者坏块标记清除?