Menu Close

NAND Flash存储器的接口与应用

1.NAND Flash存储器单元结构

常规Flash EPROM的单元存储结构如图1所示。NAND Flash存储器有SLC(single level cell)和MLC(multi level cell)两种,MLC细分还有普通MLC和eMLC(enterprise MLC)等,因为闪存是一种电压控制元件,因此它是以不同的电压范围来代表不同的数据,现在看看两者之间的区别。

%title插图%num

 

图1 Flash存储器单元结构

  • SLC( single-level cell)单阶存储单元结构

单阶存储单元,也就是闪存的每一个存储单元存储1-bit的数据,存储的数据代表0还是1是基于V的电压阈值来判定,对于闪存写入,就是对其进行充电,使得它的电压值超过电压判定点A,存储单元就表示为0(已编程),如果没有充电或者电压阈值低于A点,就表示1(已擦除)。这里的单元核与掩膜中的2极管的功能相似。

SLC NAND Flash由于采用单一电压控制通断,因此性能稳定,容错性能好。但相比MLC的Flash容量较低。主要针对军工,企业级应用,有着高速写入,低出错率和耐用性。

%title插图%num

图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)

%title插图%num

图3 MLC NAND Flash单元控制示意图

2. NAND Flash的读写及时序

以下内容将以K9F1G08X0C这款芯片为例介绍其硬件组成和工作原理,其它的芯片工作原理与K9F1G08X0C基本相同,同学们可以自己阅读相关资料。NAND Flash与NOR Flash相比,擦除和编程速度块,容量大,价格低廉,但读取速度较慢。

  • 总线复用

一般由于NAND的Flash的容量较大,地址线多,一般外部的数据总线和地址总线都采用复用的方式。图4是K9F1G08X0C内部功能框图,从图中可以看出:数据线,命令线,地址线(高地址、低地址)全部复用,一般在使用总线时需要严格的控制逻辑,通常在RTL设计时称为状态机。

%title插图%num

图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 )。

%title插图%num

图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 页。

%title插图%num

图6 K9F1G08X0C 块单元寻址地址顺序

  • Nand Flash控制信号编码

Nand Flash控制信号在实际操作中编码顺序是不同的,具体见表2。以写模式(write mode)为例,先写命令(表示以后的操作将是编程),此时CLE应为高电平,ALE为低电平,WE#由低到高在上升沿写入,RE#为高电平。后面紧跟写地址,此时CLE为低,ALE应为高电平。在读数据时,WE#为高,RE#下降沿触发数据输出,在上升沿将数据锁存。

表2  K9F1G08X0C NAND Flash控制信号编码

%title插图%num

    • 时序关系

Nand Flash控制信号在实际操作中,使用不同的器件,各信号的时序也不相同,具体见表3,

    • Setup Time 建立时间,表示在数据线(或相对应的控制信号)有效之前已经建立并维持的时间。
    • Hold time 保持时间,就是在数据(或控制信号)已经完成操作后仍需保留的时间。
    • Cycle Time 周期信号,即前后两次操作需要的时间。

在FPGA编程前要仔细阅读该表,确定各信号的时序关系,才能正确编程并能有效操作各个信号。

表3 K9F1G08X0C NAND Flash控制信号时间参数表

%title插图%num

表4描述了各个控制信号之间的时序关系,如CLE to RE# Delay 指的是当CLE结束后RE#信号需等待的时间.

表4 命令时序参数表(信号间相对时间关系)

%title插图%num

  • NAND Flash的操作命令

操作命令见表5,这里的操作命令的原理与NOR Flash非常类似。但是最大区别是NAND Flash 存储器读数据也需要先从命令开始。因此NAND Flash存储器不能作为直接运行的程序存储器使用。

    • 读命令: 00h,30h

在嵌入式系统中,可以把程序存到NAND Flash存储器中,在系统配置完成后,将程序搬移到内存中(DDR3,4)中在运行。此时NAND Flash相当于硬盘。

表5   NAND Flash操作命令表

%title插图%num

    • 初始无效块检查

初始无效块(Invalid Block)的检查,在计算机或控制系统中首先对初始无效块(Invalid Block)进行检查,如果有坏块(Invalid Block)存在,主控制程序将对坏块进行记录,并形成坏块记录表。坏块标记前禁止擦除。在以后的数据交换时避免使用已标记的坏块。由于在擦除操作时,将会把坏块信息擦除,因此首次使用NAND Flash存储器时严格禁止对在没有坏块标记时对芯片进行擦除或编程。

%title插图%num

图7 无效块检查流程图

    • 编程操作

      • 编程操作流程图

i.写命令80H,ii.写地址,iii.写数据,iv.写命令10H,v.读状态寄存器,vi.空闲检查(判断I/O6 或是否为0,见表6),vii.编程出错检查;如果I/O0 = 0,正确编程;如果I/O0 = 1(表6),编程错误,出错处理。

表6 状态寄存器映射

%title插图%num

 

    • 坏块处理

如果编程出错,同样要进行坏块标记与处理,具体的处理方式可能不同。一般复制程序到另一个有效的块中。

    • ECC检查:

如果仅是一个bit错误,可以通过ECC纠正,不需要块拷贝和坏块标记。这只是针对读数据检查。

%title插图%num

图8 NAND Flash 存储器编程流程图

    • 按照页码顺序编程

在块编程中,必须按照块中页码的顺序编程,页码顺序从小到大,NAND Flash 不支持页码的乱序编程。编程从最低页(LSB PAGE)开始,LSB PAGE不一定是Page0 ,只是在要编程的页码中最低页码。

%title插图%num

图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.如果无法纠正,坏块标记

%title插图%num

图10    块擦除及读操作流程图

作业题:用Verilog或C语言实现块擦除

  • 无效块替换

A)如果发现在擦除或编程中块‘A’中第n个页有错误,

B)复制第1—N-1页的内容到另一个自由的块(块B)中相同位置,

C)将缓存中第n 页的内容复制的块B的第n页,

D)将块A添加的坏块的记录表中,

E)在坏块中做标记(类似出厂时厂家标记的位置),

F)不要擦除该块。因此在擦除或编程前要将块中的内容读到缓冲区中。

%title插图%num

图 11 无效块替换示意图

作业题:用C(或Verilog)语言实现无效块替代程序

  • 编程写时序

按照控制信号命令的逻辑,CLE控制命令写入,ALE在高电平时写入地址,在#CE与#WE为低电平时按照字节串行的方式写入。在非写入期间#CE 的值可以为高电平,可以降低功耗。

如图12在写地址之后,数据可以批量写入,直到下一个命令10H。

%title插图%num

图12 编程写时序

  • 读时序

按照控制信号命令的逻辑,CLE控制命令写入,ALE在高电平时写入地址,在#CE与#WE为低电平时按照字节串行的方式写入。在读数据期间#CE 的值需要保持为低电平。其它的操作时序类似,可以参照NAND Flash存储器的文档描述, 这里不再累述。

如图13所示,在第一个命令00H给出后,写相应的地址,在第二个命令30H后,数据可以批量读出。

%title插图%num

图13 读时序图

 

更详细的视频请参照本网站对应视频,同时在使用这个芯片时,仔细阅读该芯片的datasheet

对应视频:

Posted in FPGA, FPGA 教材教案, IC, 元器件, 存储器, 教材与教案, 文章, 资料区

2 Comments

  1. 张洪泉

    老师,这个坏块记录表是存放在哪里的?如果标记了坏块,但是后面如果执行擦除操作,这不会把记录表或者坏块标记清除吗?

    • tzhuang

      记录表一般放在计算机内存中,对于计算机系统,记录表最终可以放在硬盘上,计算机启动时在调入内存中。对于FPGA系统可以放在EEPROM或NOR FLASH中。当然也可也反写回到nand flash 中,但确保操作正确,即每个block的page1,或page2的2048单元。

发表回复

相关链接