【电子元器件】Nand Flash基础介绍

本文章是笔者理论结合实践进行整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。

一、什么是Nand Flash

Flash主要分两种,Nand Flash和Nor flash。

Nor的成本相对高,容量相对小,比如常见的只有128KB,256KB,1MB,2MB等等,优点是读写数据时候,不容易出错。所以在应用领域方面,Nor Flash比较适合应用于存储少量的代码。

Nand flash成本相对低,缺点是使用中数据读写容易出错,所以一般都需要有对应的软件或者硬件的数据校验算法,统称为ECC。但优点是,相对来说容量比较大,现在常见的Nand Flash都是1GB,2GB,更大的8GB的都有了,相对来说,价格便宜,因此适合用来存储大量的数据。其在嵌入式系统中的作用,相当于PC上的硬盘,用于存储大量数据。

所以,一个常见的应用组合就是,用小容量的Nor Flash存储启动代码,比如uboot,用大容量的Nand Flash做整个系统和用户数据的存储。而一般的嵌入式平台的启动流程也就是,系统从装有启动代码的Nor Flash启动后,初始化对应的硬件,包括SDRAM等,然后将Nand Flash上的Linux 内核读取到内存中,做好该做的事情后,就跳转到SDRAM中去执行内核了,然后内核解压后,开始运行,在Linux内核启动最后,去Nand Flash上,挂载根文件,比如jffs2,yaffs2等,挂载完成,运行初始化脚本,启动consle交互,才允许你通过console和内核交互。至此完成整个系统启动过程。

而Nor Flash就分别存放的是Uboot,Nand Flash存放的是Linux的内核镜像和根文件系统,以及余下的空间分成一个数据区。

二、Nand Flash数据存储单元整体架构

常见的Nand Flash,内部只有一个chip,每个chip只有一个plane。而有些复杂的,容量更大的Nand Flash,内部有多个chip,每个chip有多个plane。这类的Nand Flash,往往也有更加高级的功能,比如下面要介绍的Multi Plane Program和Interleave Page Program等。概念上,由大到小来说,就是:Nand Flash ⇒ Chip ⇒ Plane ⇒ Block ⇒ Page ⇒ oob

比如,型号为K9K8G08U0A这块Nand Flash(有时候也被称为此块chip芯片),其内部有两个K9F4G08U0A的chip,chip#1和chip#2,每个K9F4G08U0A的chip包含了2个Plane,每个Plane是2Gbbit,所以K9F4G08U0A的大小是2Gb×2 = 4Gb = 512MB,因此,K9K8G08U0A内部有2个K9F4G08U0A,或者说4个Plane,总大小是×256MB=1GB。

用公式表示如下:

K9K8G08U0A(这块Nand Flash)

= 2 × K9F4G08U0A(K9F4G08U0A是chip,1 K9F4G08U0A = 2 Plane)

= 2 × 2个Plane

= 4 Plane(1 Plane = 2048 Block)

= 4 × 2048个Block(1 Block = 64 Page)

= 4 × 2048 × 64Page(1 Page = 2KB)

= 4 × 2048 × 64Page × 2KB

= 4 × 2048 × 128KB(1 Block = 128KB)

= 4 × 256MB(1 Plane = 2Gb = 256MB)

= 2 × 512MB(1 K9F4G08U0A = 4Gb = 512MB)

= 1GB(1 K9K8G08U0A = 1GB)

1. Block块

一个Nand Flash 由很多个块(Block)组成,块的大小一般是128KB,256KB,512KB,此处是128KB。块Block,是Nand Flash的擦除操作的基本/最小单位。

2.  Page页

每个块里面又包含了很多页(page)。每个页的大小,对于现在常见的Nand Flash多数是2KB,最新的Nand Flash的是4KB、8KB等,这类的页大小大于2KB的Nand Flash,被称作big block的Nand Flash,对应的发读写命令地址,一共5个周期(cycle),而老的Nand Flash,页大小是256B,512B,这类的Nand Flash被称作small block,地址周期只有4个。页Page,是读写操作的基本单位。不过,也有例外的是,有些Nand Flash支持subpage(1/2页或1/4页)子页的读写操作,不过一般很少见。

3. oob / Redundant Area / Spare Area

每一个页,对应还有一块区域,叫做空闲区域(spare area)/冗余区域(redundant area),而Linux系统中,一般叫做OOB(Out Of Band),这个区域,是最初基于Nand Flash的硬件特性:数据在读写时候相对容易错误,所以为了保证数据的正确性,必须要有对应的检测和纠错机制,此机制被叫做EDC(Error Detection Code)/ECC(Error Code Correction, 或者 Error Checking and Correcting),所以设计了多余的区域,用于放置数据的校验值。OOB的读写操作,一般是随着页的操作一起完成的,即读写页的时候,对应地就读写了OOB。

关于OOB具体用途,总结起来有:

  • 标记是否是坏快

  • 存储ECC数据

  • 存储一些和文件系统相关的数据。如jffs2就会用到这些空间存储一些特定信息,而yaffs2文件系统,会在oob中,存放很多和自己文件系统相关的信息。

三、 Nand Flash的位反转特性

Nand Flash的位反转,也叫做位翻转。Nand Flash由于本身硬件的内在特性,会导致(极其)偶尔的出现位反转的现象。所谓的位反转,指的是原先Nand Flash中的某个位发生变化了,即要么从1变成0,要么从0变成1。

1. Nand Flash位反转的原因

Nand Flash的位反转现象,主要是由以下一些原因/效应所导致:

  • 漂移效应(Drifting Effects)

    漂移效应指的是,Nand Flash中cell的电压值,慢慢地变了,变的和原始值不一样了。

  • 编程干扰所产生的错误(Program-Disturb Errors)

    此现象有时候也叫做,过度编程效应(over-program effect)。对于某个页面的编程操作,即写操作,引起非相关的其他的页面的某个位跳变了。

  • 读操作干扰产生的错误(Read-Disturb Errors)

    此效应是,对一个页进行数据读取操作,却使得对应的某个位的数据,产生了永久性的变化,即Nand Flash上的该位的值变了。

2. Nand Flash位反转的影响

如果你读取的数据正好是属于某个重要的文件中的数据,比如系统的配置文件等,那么此时错了一位,都会导致系统出现异常,问题相对会很严重。而如果此数据属于音视频流中的数据,那么此时即使错了一位,对整个音视频的播放产生的影响也很小,所以问题也不大。

3. Nand Flash位反转的类型和解决办法

  • 一种是nand flash物理上的数据存储的单元上的数据,是正确的,只是在读取此数据出来的数据中的某位,发生变化,出现了位反转,即读取出来的数据中,某位错了,本来是0变成1,或者本来是1变成0了。此处可以成为软件上位反转。此数据位的错误,当然可以通过一定的校验算法检测并纠正。
  • 另外一种,就是nand flash中的物理存储单元中,对应的某个位,物理上发生了变化,原来是1的,变成了0,或原来是0的,变成了1,发生了物理上的位的数据变化。此处可以成为硬件上的位反转。此错误,由于是物理上发生的,虽然读取出来的数据的错误,可以通过软件或硬件去检测并纠正过来,但是物理上真正发生的位的变化,则没办法改变了。不过个人理解,好像也是可以通过擦除Erase整个数据块Block的方式去擦除此错误,不过在之后的Nand Flash的使用过程中,估计此位还是很可能继续发生同样的硬件的位反转的错误。

以上两种类型的位反转,其实对于从Nand Flash读取出来的数据来说,解决其中的错误的位的方法,都是一样的,即通过一定的校验算法,常称为ECC,去检测出来,或检测并纠正错误。如果只是单独检测错误,那么如果发现数据有误,那么再重新读取一次即可。实际中更多的做法是,ECC校验发现有错误,会有对应的算法去找出哪位错误并且纠正过来。其中对错误的检测和纠正,具体的实现方式,有软件算法,也有硬件实现,即硬件Nand Flash的控制器controller本身包含对应的硬件模块以实现数据的校验和纠错的。

四、Nand Flash引脚(Pin)的说明

### 回答1: FPGA(现场可编程门阵列)是一种基于可编程逻辑块(PLBs)的半定制集成电路,可以编程实现各种电路逻辑和功能。NAND Flash是一种非易失性存储芯片,广泛应用于移动设备、数字相机、USB存储器等电子产品中。FPGA和NAND Flash都是重要的电子元器件,可以实现高效的数据读写操作。 在FPGA中使用NAND Flash进行读写操作时,需要首先进行芯片编程和初始化设置。在编程时需要选取正确的接口和协议,并针对具体的NAND Flash芯片进行相应的设置和配置。在初始化时需要设置好相关的时序和地址映射关系,以便实现正确的数据传输和读取。 在实际的数据读写操作中,FPGA可以通过使用DMA(Direct Memory Access)模块实现高效的数据传输。DMA模块可以直接从NAND Flash读取或写入数据,并将结果传输到FPGA内部的存储器或外部设备中。为了实现更高的读写速度,还可以使用缓存和预取技术,提高数据传输的效率和带宽利用率。 总的来说,FPGA和NAND Flash都是重要的电子元器件,可以实现高效的数据读写操作。在进行NAND Flash读写时,需要进行正确的编程和初始化设置,并使用DMA模块和缓存技术实现高效的数据传输,以便实现更快的读写速度和更高的带宽利用率。 ### 回答2: FPGA可以通过内置的硬件控制器来读写NAND Flash,实现高效的数据存取。在进行FPGA与NAND Flash连接时,需要使用FPGA的IO口对NAND Flash进行时序控制,以确保数据能够正确地读写。具体来说,FPGA可以使用SPI、SDIO、MMC等接口协议,通过控制NAND Flash的命令、地址、数据线来进行读写操作。在读取数据时,FPGA需要先发送读命令、片选信号和地址信息,然后从数据线上读取数据。当FPGA需要向NAND Flash写入数据时,同样需要先发送写命令、片选信号、地址和数据信息,以确保数据能够被正确存储。 在使用FPGA读写NAND Flash时,需要注意以下几点: 1. FPGA应该与NAND Flash之间连接正确,且连接线路应该按照NAND Flash数据手册的要求进行设置。 2. FPGA应该正确配置时序控制信号,以确保数据能够准确读写。 3. 在进行写操作时,需要确保数据已经被正确地缓存,否则可能会导致数据丢失或者损坏。 4. 在进行读写时,需要确保FPGA与NAND Flash的电源相一致,以避免不必要的电压峰值导致损坏。 总的来说,FPGA与NAND Flash的读写操作需要进行正确的时序控制,并且需要遵循NAND Flash数据手册的指导,以确保数据能够准确地存取。通过FPGA与NAND Flash的读写操作,可以实现高速、可靠的数据存取,适用于各种工业控制、计算机、通讯等领域的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值