NANDFLAS原理以及数据寻址方式.docx

上传人:b****2 文档编号:758098 上传时间:2023-04-30 格式:DOCX 页数:46 大小:77.06KB
下载 相关 举报
NANDFLAS原理以及数据寻址方式.docx_第1页
第1页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第2页
第2页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第3页
第3页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第4页
第4页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第5页
第5页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第6页
第6页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第7页
第7页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第8页
第8页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第9页
第9页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第10页
第10页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第11页
第11页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第12页
第12页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第13页
第13页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第14页
第14页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第15页
第15页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第16页
第16页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第17页
第17页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第18页
第18页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第19页
第19页 / 共46页
NANDFLAS原理以及数据寻址方式.docx_第20页
第20页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

NANDFLAS原理以及数据寻址方式.docx

《NANDFLAS原理以及数据寻址方式.docx》由会员分享,可在线阅读,更多相关《NANDFLAS原理以及数据寻址方式.docx(46页珍藏版)》请在冰点文库上搜索。

NANDFLAS原理以及数据寻址方式.docx

NANDFLAS原理以及数据寻址方式

nandflash原理

 

NANDFlash产品可以分为三大架构,分别是SingleLevelCell;SLC,包括三星电子、Hynix、Micron以及东芝都是此技术使用者,第二种则是MultiLevelCell;MLC,目前有东芝、Renesas使用,不过三星电子将在2005第四季推出相关产品,最后则是Infineon与SaifunSemiconductors合资利用NROM技术所共同开发的MultiBitCell;MBC。

MLC是Intel在1997年9月最先开发成功的,其作用是将两个位的信息存入一个FloatingGate(NADAFlash存储单元中存放电荷的部分),然后利用不同Level的电荷,透过内存储存格的电压控制精准读写,假设以4种电压控制、1个晶体管可存取2bits的数据,若是控制8种电压就可以存取3bits的数据,使Flash的容量大幅提升,类似Rambus的QRSL技术,通过精确控制浮动栅上的电荷数量,使其呈现出4种不同的存储状态,每种状态代表两个二进制数值(从00到11)。

当然不光是NOR型NANDFlash在使用,东芝在2003年2月推出第一款MLC型的NANDFlash,并接续2004年4月推出采用MLC技术的4Gbit与8GbitNANDFlash,显然这对于本来就以容量见长的NANDFlash更是如虎添翼。

根据SemiconductorInsights研究,东芝利用90nmMLC技术所开发出来的4Gb,其die面积为144mm2。

至于SLC技术与EEPROM相同,但在Floatinggate与Sourcegate之中的氧化薄膜更薄,其数据的写入是透过对浮置闸极的电荷加电压,然后可以透过源极,即可将所储存的电荷消除,藉由这样的方式,便可储存1个个信息位,这种技术的单一位细胞方式能提供快速的程序编程与读取,不过此技术受限于Siliconefficiency的问题,必须要藉由较先进的流程强化技术Processenhancements,才能向上提升SLC制程技术。

将上述所言,做一个比较,SLC架构是0和1两个充电值,而MLC架构可以一次储存4个以上的充电值,因此MLC架构可以有比较好的储存密度,再加上可利用比较老旧的生产设备来提高产品的容量,而无须额外投资生产设备,可以享有成本与良率的优势。

不过MLC架构有着让使用者很难容忍的缺点,就是使用寿命较短,其次MLC架构只能承受约1万次的存取,远低于SLC架构的10万次。

至于存取速度,SLC架构比MLC架构要快速三倍以上,加上MLC架构对于电力的消耗较多,因此使用者若是考虑长久使用、安全储存数据以及高速的存取速度等要求,恐怕会改采用SLC架构。

其实在NANDFlash市场中,若以理论数据比较,Renesas的AG-AND技术或是Infineon的MBC技术,其实并不逊于三星电子、东芝或是其它业者,甚至于有过之而无不及,不过这两家业者因为产能、技术开发等问题造成延迟扩大市场占有率时机,这也印证商场中的一句话,任何东西都必须要能够适时适地推出,否则只是将市场拱手让给对方。

NandFlash结构与读写分析

NANDFlash的数据是以bit的方式保存在memorycell,一般来说,一个cell中只能存储一个bit。

这些cell以8个或者16个为单位,连成bitline,形成所谓的byte(x8)/word(x16),这就是NANDDevice的位宽。

这些Line会再组成Page,(NandFlash有多种结构,我使用的NandFlash是K9F1208,下面内容针对三星的K9F1208U0M),每页528Byte,每32个page形成一个Block,Sizeof(block)=16kByte。

1block=16kbyte,512Mbit=64Mbyte,Numberof(block)=10241block=32page,1page=528byte=512byte(MainArea)+16byte(SpareArea)

Nandflash以页为单位读写数据,而以块为单位擦除数据。

按照这样的组织方式可以形成所谓的三类地址:

--BlockAddress--PageAddress  --ColumnAddress(即为页内偏移地址)

对于NANDFlash来讲,地址和命令只能在I/O[7:

0]上传递,数据宽度是8位。

512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1sthalf和2ndhalf,各自的访问由地址指针命令来选择,A[7:

0]就是所谓的columnaddress。

32个page需要5bit来表示,占用A[13:

9],即该page在块内的相对地址。

Block的地址是由A14以上的bit来表示,例如512Mb的NAND,共4096block,因此,需要12个bit来表示,即A[25:

14],如果是1Gbit的528byte/page的NANDFlash,则blockaddress用A[26:

14]表示。

而pageaddress就是blcokaddress|pageaddressinblock,NANDFlash的地址表示为:

BlockAddress|PageAddressinblock|halfpagepointer|ColumnAddress地址传送顺序是ColumnAddress,PageAddress,BlockAddress。

由于地址只能在I/O[7:

0]上传递,因此,必须采用移位的方式进行。

例如,对于512Mbitx8的NANDflash,地址范围是0~0x3FF_FFFF,只要是这个范围内的数值表示的地址都是有效的。

以NAND_ADDR为例:

第1步是传递columnaddress,就是NAND_ADDR[7:

0],不需移位即可传递到I/O[7:

0]上,而halfpagepointer即bit8是由操作指令决定的,即指令决定在哪个halfpage上进行读写。

而真正的bit8的值是don\'tcare的。

第2步就是将NAND_ADDR右移9位,将NAND_ADDR[16:

9]传到I/O[7:

0]上第3步将NAND_ADDR[24:

17]放到I/O上第4步需要将NAND_ADDR[25]放到I/O上因此,整个地址传递过程需要4步才能完成,即4-stepaddressing。

如果NANDFlash的容量是256Mbit以下,那么,blockadress最高位只到bit24,因此寻址只需要3步。

下面,就x16的NANDflash器件稍微进行一下说明。

由于一个page的mainarea的容量为256word,仍相当于512byte。

但是,这个时候没有所谓的1sthalfpage和2ndhalfpage之分了,所以,bit8就变得没有意义了,也就是这个时候bit8完全不用管,地址传递仍然和x8器件相同。

除了,这一点之外,x16的NAND使用方法和x8的使用方法完全相同。

norflash和nandflash的区别

norflash中可以运行程序,nandflash不可以

Norflash按sector可擦除,按bit可读写。

NandFlash按Block可擦除,按Page可读写。

最主要是寻址方式不同

*********************************************************************************************************************************

NandFlash寻址方式

NANDFlash的寻址方式和NANDFlash的memory组织方式紧密相关。

NANDFlash的数据是以bit的方式保存在memorycell,一般来说,一个cell中只能存储一个bit。

这些cell以8个或者16个为单位,连成bitline,形成所谓的byte(x8)/word(x16),这就是NANDDevice的位宽。

    这些Line会再组成Page,通常是528Byte/page或者264Word/page。

然后,每32个page形成一个Block,Sizeof(block)=16kByte.

    Block是NANDFlash中最大的操作单元,擦除就是按照block为单位完成的,而

编程/读取是按照page为单位完成的。

    所以,按照这样的组织方式可以形成所谓的三类地址:

    -Block  Address

    -Page   Address

    -ColumnAddress

    首先,必须清楚一点,对于NANDFlash来讲,地址和命令只能在I/O[7:

0]上传递,数据宽度可以是8位或者16位,但是,对于x16的NANDDevice,I/O[15:

8]只用于传递数据。

    清楚了这一点,我们就可以开始分析NANDFlash的寻址方式了。

    以528Byte/page总容量512Mbit+512kbyte的NAND器件为例:

因为,

    1block=16kbyte,

    512Mbit=64Mbyte,

    Numberof(block)=1024

    1block=32page,

    1page=528byte=512byte(MainArea)+16byte(SpareArea)

用户数据保存在mainarea中。

    512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1sthalf和2ndhalf,各自的访问由所谓的pointeroperation命令来选择,也就是选择了bit8的高低。

因此A8就是halfpagepointer,A[7:

0]就是所谓的columnaddress。

    32个page需要5bit来表示,占用A[13:

9],即该page在块内的相对地址。

Block的地址是由A14以上的bit来表示,例如512Mb的NAND,共4096block,因此,需要12个bit来表示,即A[25:

14],如果是1Gbit的528byte/page的NANDFlash,共8192个block,则blockaddress用A[26:

14]表示。

而pageaddress就是blcokaddress|pageaddressinblock

NANDFlash的地址表示为:

     BlockAddress|PageAddressinblock|halfpagepointer|ColumnAddress

地址传送顺序是ColumnAddress,PageAddress,BlockAddress。

由于地址只能在I/O[7:

0]上传递,因此,必须采用移位的方式进行。

    例如,对于512Mbitx8的NANDflash,地址范围是0~0x3FF_FFFF,只要是这个范围内的数值表示的地址都是有效的。

以NAND_ADDR为例:

    第1步是传递columnaddress,就是NAND_ADDR[7:

0],不需移位即可传递到I/O[7:

0]上而halfpagepointer即bit8是由操作指令决定的,即指令决定在哪个halfpage上进行读写,而真正的bit8的值是don'tcare的。

    第2步就是将NAND_ADDR右移9位,将NAND_ADDR[16:

9]传到I/O[7:

0]上;

    第3步将NAND_ADDR[24:

17]放到I/O上;

    第4步需要将NAND_ADDR[25]放到I/O上;

    因此,整个地址传递过程需要4步才能完成,即4-stepaddressing。

    如果NANDFlash的容量是256Mbit以下,那么,blockadress最高位只到bit24,因此寻址只需要3步。

NANDFlash的数据是以bit的方式保存在memorycell,一般来说,一个cell中只能存储一个bit。

这些cell以8个或者16个为单位,连成bitline,形成所谓的byte(x8)/word(x16),这就是NANDDevice的位宽。

这些Line会再组成Page.

(NandFlash有多种结构,下面内容针对三星的K9F1208U0M),每页528Byte,每32个page形成一个Block,Sizeof(block)=16kByte。

1block="16kbyte",

512Mbit=64Mbyte,

Numberof(block)=40961block=32page,

1page=528byte=512byte(MainArea)+16byte(SpareArea);

Nandflash以页为单位读写数据,而以块为单位擦除数据。

按照这样的组织方式可以形成所谓的三类地址:

--BlockAddress

--PageAddress

--ColumnAddress

对于NANDFlash来讲,地址和命令只能在I/O[7:

0]上传递,数据宽度是8位。

512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1sthalf和2ndhalf,各自的访问由地址指针命令来选择,A[7:

0]就是所谓的columnaddress。

32个page需要5bit来表示,占用A[13:

9],即该page在块内的相对地址。

Block的地址是由A14以上的bit来表示,例如512Mb的NAND,共4096block,因此,需要12个bit来表示,即A[25:

14],如果是1Gbit的528byte/page的NANDFlash,则blockaddress用A[26:

24]表示。

而pageaddress就是blcokaddress|pageaddressinblock

NANDFlash的地址表示为:

BlockAddress|PageAddressinblock|halfpagepointer|ColumnAddress

地址传送顺序是ColumnAddress,PageAddress,BlockAddress。

由于地址只能在I/O[7:

0]上传递,因此,必须采用移位的方式进行。

例如,对于512Mbitx8的NANDflash,地址范围是0~0x3FF_FFFF,只要是这个范围内的数值表示的地址都是有效的。

以NAND_ADDR为例:

第1步是传递columnaddress,就是NAND_ADDR[7:

0],不需移位即可传递到I/O[7:

0]上,而halfpagepointer即bit8是由操作指令决定的,即指令决定在哪个halfpage上进行读写。

而真正的bit8的值是don'tcare的。

第2步就是将NAND_ADDR右移9位,将NAND_ADDR[16:

9]传到I/O[7:

0]上

第3步将NAND_ADDR[24:

17]放到I/O上

第4步需要将NAND_ADDR[25]放到I/O上

因此,整个地址传递过程需要4步才能完成,即4-stepaddressing。

如果NANDFlash的容量是256Mbit以下,那么,blockadress最高位只到bit24,因此寻址只需要3步。

下面,就x16的NANDflash器件稍微进行一下说明。

由于一个page的mainarea的容量为256word,仍相当于512byte。

但是,这个时候没有所谓的1sthalfpage和2ndhalfpage之分了,所以,bit8就变得没有意义了,也就是这个时候bit8完全不用管,地址传递仍然和x8器件相同。

除了,这一点之外,x16的NAND使用方法和x8的使用方法完全相同。

正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nandflash也分为若干block,每个block分为如干page。

一般而言,block、page之间的关系随着芯片的不同而不同,典型的分配是这样的:

1block=32page

1page=512bytes(datafield)+16bytes(oob)

需要注意的是,对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash的擦写,而擦写则是以一个block为单位的。

同时必须提醒的是,512bytes理论上被分为1sthalf和2sdhalf,每个half各占256个字节。

我们讨论的K9F1208U0B总共有4096个Blocks,故我们可以知道这块flash的容量为4096*(32*528)=69206016Bytes=66MB但事实上每个Page上的最后16Bytes是用于存贮检验码和其他信息用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为4096*(32*512)=67108864Bytes=64MB由上图所示,1个Page总共由528Bytes组成,这528个字节按顺序由上而下以列为单位进行排列(1列代表一个Byte。

第0行为第0Byte,第1行为第1Byte,以此类推,每个行又由8个位组成,每个位表示1个Byte里面的1bit)。

这528Bytes按功能分为两大部分,分别是DataField和SpareField,其中SpareField占528Bytes里的16Bytes,这16Bytes是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,除去这16Bytes,剩下的512Bytes便是我们用于存放数据用的DataField,所以一个Page上虽然有528个Bytes,但我们只按512Bytes进行容量的计算。

读命令有两个,分别是Read1,Read2其中Read1用于读取DataField的数据,而Read2则是用于读取SpareField的数据。

对于NandFlash来说,读操作的最小操作单位为Page,也就是说当我们给定了读取的起始位置后,读操作将从该位置开始,连续读取到本Page的最后一个Byte为止(可以包括SpareField)

NandFlash的寻址

   NandFlash的地址寄存器把一个完整的NandFlash地址分解成ColumnAddress与PageAddress.进行寻址。

ColumnAddress:

列地址。

ColumnAddress其实就是指定Page上的某个Byte,指定这个Byte其实也就是指定此页的读写起始地址。

PaageAddress:

页地址。

由于页地址总是以512Bytes对齐的,所以它的低9位总是0。

确定读写操作是在Flash上的哪个页进行的。

Read1命令

当我们得到一个NandFlash地址src_addr时我们可以这样分解出ColumnAddress和PageAddress

column_addr=src_addr%512;              //columnaddress

page_address=(src_addr>>9);               //pageaddress

也可以这么认为,一个NandFlash地址的A0~A7是它的column_addr,A9~A25是它的PageAddress。

(注意地址位A8并没有出现,也就是A8被忽略,在下面你将了解到这是什么原因)

Read1命令的操作分为4个Cycle,发送完读命令00h或01h(00h与01h的区别请见下文描述)之后将分4个Cycle发送参数,1st.Cycle是发送ColumnAddress。

2nd.Cycle,3rd.Cycle和4th.Cycle则是指定PageAddress(每次向地址寄存器发送的数据只能是8位,所以17位的PageAddress必须分成3次进行发送

Read1的命令里面出现了两个命令选项,分别是00h和01h。

这里出现了两个读命是否令你意识到什么呢?

是的,00h是用于读写1sthalf的命令,而01h是用于读取2ndhalf的命令。

现在我可以结合上图给你说明为什么K9F1208U0B的DataField被分为2个half了。

如上文我所提及的,Read1的1st.Cycle是发送ColumnAddress,假设我现在指定的ColumnAddress是0,那么读操作将从此页的第0号Byte开始一直读取到此页的最后一个Byte(包括SpareField),如果我指定的ColumnAddress是127,情况也与前面一样,但不知道你发现没有,用于传递ColumnAddress的数据线有8条(I/O0~I/O7,对应A0~A7,这也是A8为什么不出现在我们传递的地址位中),也就是说我们能够指定的ColumnAddress范围为0~255,但不要忘了,1个Page的DataField是由512个Byte组成的,假设现在我要指定读命令从第256个字节处开始读取此页,那将会发生什么情景?

我必须把ColumnAddress设置为256,但ColumnAddress最大只能是255,这就造成数据溢出。

正是因为这个原因我们才把DataField分为两个半区,当要读取的起始地址(ColumnAddress)在0~255内时我们用00h命令,当读取的起始地址是在256~511时,则使用01h命令.假设现在我要指定从第256个byte开始读取此页,那么我将这样发送命令串

column_addr=256;

NF_CMD=0x01;?

                        从2ndhalf开始读取

NF_ADDR=column_addr&0xff;               1stCycle

NF_ADDR=page_address&0xff;            2nd.Cycle

NF_ADDR=(page_address>>8)&0xff;      3rd.Cycle

NF_ADDR=(page_address>>16)&0xff;       4th.Cycle

其中NF_CMD和NF_ADDR分别是NandFlash的命令寄存器和地址寄存器的地址解引用,我一般这样定义它们,

#definerNFCMD     (*(volatileunsignedchar*)0x4e000004)     //NADDFlashcommand

#definerNFADDR     (*(volatileunsignedchar*)0x4e000008)     //NANDFlashaddress

事实上,当NF_CMD=0x01时,地址寄存器中的第8位(A8)将被设置为1(如上文分析,A8位不在我们传递的

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2