1.NAND Flash存储器单元结构
常规Flash EPROM的单元存储结构如图1所示。NAND Flash存储器有SLC(single level cell)和MLC(multi level cell)两种,MLC细分还有普通MLC和eMLC(enterprise MLC)等,因为闪存是一种电压控制元件,因此它是以不同的电压范围来代表不同的数据,现在看看两者之间的区别。
图1 Flash存储器单元结构
-
SLC( single-level cell)单阶存储单元结构
单阶存储单元,也就是闪存的每一个存储单元存储1-bit的数据,存储的数据代表0还是1是基于V的电压阈值来判定,对于闪存写入,就是对其进行充电,使得它的电压值超过电压判定点A,存储单元就表示为0(已编程),如果没有充电或者电压阈值低于A点,就表示1(已擦除)。这里的单元核与掩膜中的2极管的功能相似。
SLC NAND Flash由于采用单一电压控制通断,因此性能稳定,容错性能好。但相比MLC的Flash容量较低。主要针对军工,企业级应用,有着高速写入,低出错率和耐用性。
图2 SLC NAND Flash单元控制示意图
-
MLC( Multi-level cell)多阶存储单元结构
其实质是在每个存储单元存储2-bit的数据,存储的数据是”00″,”01″,”10″,”11″也是基于电压的阈值的判定,其被分成4份。相对于SLC,MLC的每个单元是2-bit,那么单片的容量较大,同等容量价格比较低。同时其存储单元中存放更多的数据,那么其结构也相对复杂,出错的机会也比较大。因此一般会有ECC算法,检查存储单元数据的有效性。MLC NAND 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设计时称为状态机。
图4 K9F1G08X0C内部功能框图
由于数据线,命令线,地址线(高地址、低地址)全部复用,因此外围的有用管脚较少,在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[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,其中64 Bytes是ECC(error correcting code)是纠错码,如汉明码(Hamming code)可以检查出2位错码,可以纠正一位错码。因此在读操作时都会做ECC检查,如果发现有一位错误并进行纠正。在擦除失败或编程失败时,一般采用坏块替代的方式。Column Address 决定页内寻址(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存储器不能作为直接运行的程序存储器使用。
-
-
读命令: 00h,30h
-
在嵌入式系统中,可以把程序存到NAND Flash存储器中,在系统配置完成后,将程序搬移到内存中(DDR3,4)中在运行。此时NAND Flash相当于硬盘。
表5 NAND Flash操作命令表
-
-
初始无效块检查
-
初始无效块(Invalid Block)的检查,在计算机或控制系统中首先对初始无效块(Invalid Block)进行检查,如果有坏块(Invalid Block)存在,主控制程序将对坏块进行记录,并形成坏块记录表。坏块标记前禁止擦除。在以后的数据交换时避免使用已标记的坏块。由于在擦除操作时,将会把坏块信息擦除,因此首次使用NAND Flash存储器时严格禁止对在没有坏块标记时对芯片进行擦除或编程。
图7 无效块检查流程图
-
-
编程操作
-
编程操作流程图
-
-
i.写命令80H,ii.写地址,iii.写数据,iv.写命令10H,v.读状态寄存器,vi.空闲检查(判断I/O6 或是否为0,见表6),vii.编程出错检查;如果I/O0 = 0,正确编程;如果I/O0 = 1(表6),编程错误,出错处理。
表6 状态寄存器映射
-
-
坏块处理
-
如果编程出错,同样要进行坏块标记与处理,具体的处理方式可能不同。一般复制程序到另一个有效的块中。
-
-
ECC检查:
-
如果仅是一个bit错误,可以通过ECC纠正,不需要块拷贝和坏块标记。这只是针对读数据检查。
图8 NAND Flash 存储器编程流程图
-
-
按照页码顺序编程
-
在块编程中,必须按照块中页码的顺序编程,页码顺序从小到大,NAND Flash 不支持页码的乱序编程。编程从最低页(LSB PAGE)开始,LSB PAGE不一定是Page0 ,只是在要编程的页码中最低页码。
图9 块内按页码编程流程图
-
块擦除及读操作流程
a)块擦除: 写命令60H, 写要擦除块的块地址,写命令D0H.
i.检查操作状态:写“读状态”命令, 检查I/O6或是否为1,如果为0,等待
ii.I/O6或为1,检查I/o0是否为零;如果I/O为0,则擦除正确,否则擦写错误。
iii.擦写正确,可以为对应的块进行编程。
iv.如果擦写出错,重复上面的步骤,如果仍然出错,则标记坏块。
b)读操作:
i.写命令00H,
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与#WE为低电平时按照字节串行的方式写入。在非写入期间#CE 的值可以为高电平,可以降低功耗。
如图12在写地址之后,数据可以批量写入,直到下一个命令10H。
图12 编程写时序
-
读时序
按照控制信号命令的逻辑,CLE控制命令写入,ALE在高电平时写入地址,在#CE与#WE为低电平时按照字节串行的方式写入。在读数据期间#CE 的值需要保持为低电平。其它的操作时序类似,可以参照NAND Flash存储器的文档描述, 这里不再累述。
如图13所示,在第一个命令00H给出后,写相应的地址,在第二个命令30H后,数据可以批量读出。
图13 读时序图
更详细的视频请参照本网站对应视频,同时在使用这个芯片时,仔细阅读该芯片的datasheet。
对应视频:
老师,这个坏块记录表是存放在哪里的?如果标记了坏块,但是后面如果执行擦除操作,这不会把记录表或者坏块标记清除吗?
记录表一般放在计算机内存中,对于计算机系统,记录表最终可以放在硬盘上,计算机启动时在调入内存中。对于FPGA系统可以放在EEPROM或NOR FLASH中。当然也可也反写回到nand flash 中,但确保操作正确,即每个block的page1,或page2的2048单元。