闫梦婷,安军社,江源源
(1.中国科学院空间科学与应用研究中心 北京100190;2.中国科学院大学 北京100190)
实现流水存储及坏块处理的Flash控制器设计
闫梦婷1,2,安军社1,江源源1
(1.中国科学院空间科学与应用研究中心 北京100190;2.中国科学院大学 北京100190)
实现了一种适用于航天设备的大容量存储方案。给出一个基于FPGA实现的Flash控制器设计,该控制器可以完成航天应用的大容量数据存取工作。其中存储操作中设计了流水编程机制,实现了叠装芯片内部的流水编程操作,大幅度提高系统的整体存储速率,实现了高速存储的目的。同时,提出了一种完备的坏块处理机制,可以屏蔽对已知坏块的使用,并且在新的坏块产生时确保存取操作正常执行,使得大容量存储系统的存储数据无误差、无丢失,读出正常有序的数据。经板级验证,该方案的整体可以实现的最高存储速率可达100 Mbps,坏块处理机制可保证数据的正确性、完整性和连续性。
大容量;固态存储;NAND Flash控制器;坏块处理;流水存储;FPGA应用
随着航天领域对固态存储器(Solid State Recorder)研制工作的不断发展,NAND Flash以其高密度、大容量、高数据存储速率以及更多的擦除次数等特点得到了大量的使用,逐步开始成为存储介质的主流选择。但是,NAND Flash由于其制造工艺和航天器的特殊使用环境等因素,会在存在坏块,并在使用过程中产生新的坏块,对坏块的处理是NAND Flash实际应用中必须要解决的问题。大量的Flash使用实例中已经出现了常见的坏块处理方法,主要是在使用前建立坏块信息表,根据坏块信息表来检索出可以使用的有效块,避免对坏块进行误操作。根据坏块信息表存储的方式可以分为两类:1)建立存储区,将有效块的地址存储在存储区内,每次将有效块地址从存储器中取出后进行使用。2)建立与Flash块地址空间大小一致的状态寄存区,在状态寄存区里对应的位标记出对应的Flash块地址是否为有效块,提取块地址时,对状态寄存区里的标记进行判断。这两种方法的存储区域可以使用实现Flash控制器的FPGA建立片内RAM来实现,也可以使用Flash的某一块的指定的页空间来作为存储区域。后者可以节约FPGA使用资源,但读取以及修改坏块信息的时间周期过长,不易于高速系统选用[1]。另外,还有基于FAT文件系统处理坏块方法,该方法在文件系统层解决坏块问题,对软件、操作等存在一定难度,以硬件系统作为主要实现平台的系统一般不选用该方法[2]。
但是,上述常用的坏块处理方法只是以块为单位进行坏块处理,检测已存在的坏块情况,并避免已确定的使用坏块,没有提出当坏块产生时保证数据完整的处理机制。因此,文中介绍了该Flash控制器实现的一种坏块处理机制,在实现了高速流水存储方式的基础上,能够保证数据完整性,提高了整个固态存储器的性能,满足实际应用的高速存储、无数据丢失的要求。
本设计中的NAND Flash控制器内部分为初始化、擦除、编程、读取、标记以及主控制器6个模块[3]。如图1所示,系统上电后自动进入初始化模块,Flash厂家将初始坏块信息存放在每一块首页的第2 048和2 049字节,初始化模块的任务是读取所有的Flash块的坏块标记字节以及Spare区域的用户使用信息,生成完备的块信息表,后续存储系统的全部工作都将根据块信息表提供的信息来执行。本设计为达到存储系统对高速率的要求,必须减少读取块信息表所需的时钟周期,因此选择在FPGA建立RAM区用来存放坏块信息表。
图1 控制器主要工作流程图
编程和读取操作的基本单位为页,每次编程读取操作可以一次性存储、读取一页容量的数据[3]。编程操作模块中,为了提高存储系统的整体编程速率,利用了流水操作的方法对编程操作进行了改进,并且嵌入了完备的坏块处理机制用于处理编程操作中产生坏块的数据丢失问题,编程模块将在下文详述。读取模块会在接收到读取指令后,按照顺序从Flash中将数据读出发送给接收器件。Flash存储单元在执行数据写入之前需要进行擦除操作,擦除模块完成以块为单位的擦除操作,擦除操作执行时也会产生新的坏块,此时需要启用标记模块对坏块进行标记。每次执行擦除操作实际上是将把整块Flash的全部字节单元恢复为“FF”,即把所有的位全部恢复为“1”。编程操作则是将字节单元中相应的位从“1”置为“0”,以此将每个字节编程为相应的十六进制数。而坏块的常见情况是无法将字节单元里的‘1'值置为‘0',或者无法将“0”的位恢复为“1”,因此对坏块进行编程操作,将导致存入数据与实际编程成功的数据不一致,读出错误数据,故而对Flash的使用要避免使用坏块。
初始化模块的作用是检索Flash所有块的第0页的第2 048、2 049单元,判断该块是否为坏块,以及读取本设计使用的Spare区信息存储单元里的使用信息,并在FPGA中开辟空间作为块信息表的存储区。本设计为了保证Flash控制器的正常运作,将为每一个块建立5个字节的块信息,存储完备的块信息表以供后续操作使用。其中,物理块地址表示该块在Flash单片芯片中的实际物理地址,需要用物理地址对Flash的操作进行寻址。块类型是将在使用过程中可能出现的八种块进行了分类标记,8种块类型图2中所示,分别是:未写块、正常写满块、正常写未写满块、页写失败块、替代写满块、替代未写满块、替代页写失败块以及初始坏块。逻辑块地址,表示该块在该次数据存储操作中的实际使用的块计数。数据的读取操作将根据逻辑块地址来进行,以此保证数据的连续性。尾页地址是该块最后一个存储数据的页的地址,数据读取时将根据尾页地址进行读取,对该块的尾页地址之后的页将不进行读取操作。
图2 块信息及块分类示意图
初始化的重要性在于,检索Spare区域的使用信息建立起来的块信息表记录了Flash芯片所有的信息,对Flash的全部使用都将根据块信息表来进行。编程操作所需的地址将根据块信息表判断一个物理地址所指向的块是否为有效块,是否可以执行正常的编程操作;读取操作根据块信息表的逻辑块地址和尾页地址来检索出需要进行读取操作的块和页,并且以此来调整数据读取的顺序,保证数据的连续性。擦除操作也将根据块信息表来决定是否要对该物理地址块进行擦除操作,Flash需要避免对其坏块进行擦除操作,一旦对坏块执行擦除操作,会将坏块的第0页的2 048和2 049字节的坏块标记信息恢复为 “FF”,将坏块误标记为可操作的有效块,在后续的使用中造成错误操作等现象。一旦在使用过程中产生了新的坏块,需要立即修改块信息表中的对应块信息,以保证后续操作的正确性。
3.1流水编程机制
根据Flash的工作要求,当需要对某一片Flash某一页进行编程操作时,需要向Flash芯片的操作如下:1)发送起始指令和地址,2)发送2 048字节数据和Spare区的若干字节使用信息,3)发送结束指令。实际上,每一片Flash都有一个数据缓存区可以用于缓存一页最大容量的数据,当接收到结束指令后,Flash会将缓存区的数据按顺序固化到当前物理地址指向的页中。根据Flash厂家提供的数据,可以得出以下数据:1)从缓存区固化到页所需时间区间为[300~700]μs。2)如果系统时钟选用16 MHz的时钟,完成一页数据编程操作的所需时间区间为[430~800]μs。此外还需要读取反馈状态的时间,无法保证在实际使用中编程操作的整体速率达到100 Mbps的要求,因此本设计提出流水编程机制。
本设计利用8片Flash单片叠装的特点,采取流水方式进行编程操作,每次对8个单片Flash的同一逻辑块地址的同一页进行编程操作,并将此称为一个流水级。CE0~CE7为8个单片Flash对应的片选使能信号,CE0为低电平时,IO口以及其他共用的信号对应操作第0片Flash,同样的,其他CE信号使能时各个共用信号口对应相应的单片Flash。为了叙述简便,我们将8片Flash单片分别定义为CE0~CE7。流水编程的具体实现步骤为:1)依次对CE0到CE7加载数据,CE0加载完成后,立即对CE1进行加载,直到CE7加载完成,使各个单片Flash的固化时间得到复用。2)一个流水级的加载工作全部完成之后,进行检查工作。依次检查CE0到CE7的RB信号,当RB信号为高时,意味着该单片Flash已经完成之前操作处于空闲状态,此时才可以对Flash发送70 h指令去读取编程操作状态。如果RB信号为低,则表示该片Flash的固化工作仍未完成,则等待RB变低后再进行状态读取。
具体流程如图3所示。实际上,当CE7开始自主固化编程时,距离CE0开始固化已经过去的时间为910 μs(130 μs*7),即使出现最长固化编程时间的情况,也完全可以确保CE0已经完成了固化工作。若Flash的固化操作都以典型值固化成功,则计算出当CE7开始固化数据时,RB0到RB3都已经变成高电平表示CE0到CE3都已经完成了固化工作,检查前4片Flash编程操作是否成功的操作可以依次立即执行,而CE4 到CE7则仍需要等待一段时间,直到相应的RB信号变为高电平才能执行状态判断的操作。如图3所示,固化时间得到了复用,利用流水编程机制,可以大幅提高整体存储速率。如果8个Flash单片的页编程操作都成功,则称这一级流水编程成功;若有某一个Flash单片的页编程操作失败则称该流水级编程失败,开始调用坏块替代机制。
3.2坏块替代机制
Flash在使用过程中有可能会产生新的坏块,编程操作和擦除操作都会导致坏块产生,其中擦除操作产生的坏块只需要对该坏块进行标记,并及时更新块信息表即可,因此本设计的控制器将擦除产生的坏块处理操作设计在擦除模块中。但是编程操作产生的坏块涉及到数据的完整性,在一级流水编程操作完成后,对某一页发送状态检测指令检测到编程失败,表示当前页的数据没有正常写入Flash,我们称该页为编程失败页。当出现编程失败页的时候,无法确保该页的数据编程完成,不能作为有效数据页供后续的读取操作直接访问,即加载到该页的2 048字节的数据因页编程失败而丢失。编程失败页所在的块就是新产生的坏块,该页物理地址之后的页也不能再执行编程操作。为了保证已写入的数据正常读出,编程失败页的数据不丢失,同时实现读取数据的连续性和完整性,需要做更多复杂的处理,针对Flash工作特点和本设计的流水编程机制,下面介绍本设计采用的坏块处理机制。
坏块处理机制涉及到数据备份、Flash编程操作地址以及数据读取顺序3个方面,下面将对这3方面进行详述。为了保证在任何一次坏块产生时都不丢失数据,则需要进行数据备份,即在FPGA实现的控制器内部例化出一级流水数据量的存储空间用于数据备份,这8个2 048字节的SRAM地址空间由CE0~CE7信号组合进行片选。当执行某一级流水级的数据写入工作时,同时将2 048字节的数据写入到对应的数据备份存储空间中,一旦检测到页编程失败,立即在替代块中的同一页地址作为替代页的物理地址,将发生页编程失败的第n片Flash对应的数据备份空间里的数据写入到替代块的替代页中。
图4 坏块产生存储示意图
8片叠装式的芯片在编程操作时执行并行拓展式操作。一旦编程操作中产生了新的坏块,要从缓存的地址中提取新的可以使用的替代块,对替代块标记的仍然是当前使用的逻辑块地址。读取数据时,根据初始化信息表中的块类型,当开始读取的一个流水级的逻辑块含有坏块时,正常读取坏块中的已写成功的页中的数据,当读取完已写尾页地址指向的页,下一轮将开始读取紧接着坏块地址的替代块的替代页中的数据,未发生坏块的其他块按正常读取进行操作。如图4所示,为方便说明,将一页的2 048字节数据作为一个包来表示,物理块地址n之前都未发生页编程失败,直到物理块地址n的CE3单片Flash的第n页发生了页编程失败,于是将第n+3包数据再次编程到替代块中,可见替代块的物理块地址为n+1(假设该块为有效块),逻辑块地址仍为n,并且后续的编程操作将用替代块代替坏块继续进行,这样设计可以保证数据的连续性和完整性。
为了便于观察,图5给出了一个流水级编程的仿真波形,并且模拟了检测出坏块后的替代编程的波形。如图5所示,CE从“00000001”开始选中第一片Flash,对某个地址进行页编程工作,完成之后CE变为“00000010”,开始对第二片Flash进行页编程,直到最后一片Flash页编程完成,开始发送检测指令。测试平台将第二片设定为编程失败页,图5中可以看出,检测到第二片的页编程失败后,error_w信号变为高,并对下一个可用块该页地址进行替代编程,可以看出替代编程的数据仍是之前页编程的数据。
图5 坏块处理机制仿真波形
通过包含CPU和数据源等配合的板级测试,在频率为16 MHz的系统时钟下,验证本设计的数据存储速率最高可达100 Mbps,数据读取速率最大达到13 Mbps,产生坏块时能够执行替代机制保证数据的完整性和连续性,已成功在某航天型号任务中的作为大容量数据存储器使用。
文中在常用的坏块处理机制的基础上,提出了恢复数据精确到页的坏块处理机制,并且利用流水操作机制,大幅提高了Flash的写入速率,利用逻辑块计数索引读取操作的页,以此保证了数据的连续性。流水编程机制和坏块替代机制的提出和使用,使得本设计的Flash控制器成功满足某航天型号任务的实际使用需求,并且对Flash的实际使用中性能的改善,提供了参考机制。
[1]张胜勇,高世杰.基于FPGA的NAND Flash坏块处理方法[J].计算机工程,2010,36(6):239-243.
[2]王立峰,胡善清.基于闪存的高速海量存储模块设计[J].计算机工程.2011,37(7):255-257.
[3]NAND Flash Applications Design Guide.[EB/OL].(2004-05-19).[2013-10-21].http://pdf1.alldatasheet.com/datasheet-pdf/ view/85039/SAMSUNG/K9W4G08U1M.html.
[4]Takeuchi K.Novel co-design of NAND Flash memory and high-speed solid-state drives[J].VLSI circuit,2009,44(4): 1224-1227.
[5]Nguyen Q,Yuknis W,Pursley S,et al.A high performance command and data handling system for NASA's Lunar Reconnaissance Orbiter[C].//AIAA Space 2008 Conference& Exposition.Washington:AIAA 2008.
[6]Shibata N,Maejima H,Isobe K,et al.70nm 16Gb 16-Level-Cell NAND Flash Memory[J].IEEE Journal of Solid-State Circuits,2008,43(4):929-937.
[7]Takeuchi K.Novel co-design of NAND Flash memory and high-speed solid-state drives[J].VLSI circuit,2009,44(4): 1224-1227.
[8]邢开宇,曹晓曼,方火能.基于FPGA和NAND FLASH的存储器ECC设计与实现[J].电子科技,2012,25(10):69-73.
[9]潘立阳,朱钧 .FLASH存储器技术与发展[J].微电子学. 2002,32(1):1-6.
[10]Virtex-5 FPGA Configuration User Guide[EB/OL].(2012-10-19)[2013-10-21]http://www.xilinx.com/support/ documentation/user_guides/ug191.pdf.
Design of a NAND Flash controller with high-speed pipelining program and invalid block handle method
YAN Meng-ting1,2,AN Jun-she1,JIANG Yuan-yuan1
(1.Center for Space science and Applied Research Chinese Academy of Science,Beijing 100190,China;2.University of Chinese Academy Sciences,Beijing 100190,China)
A design about Solid State Recorder used in aerospace field is presented.A Flash controller based on FPGA is designed.The controller can finish regular recording work in aerospace field.In storage operation,a pipelining-programming method is presented.It is operated inside of the chip to improve the overall system storage speed,and it can achieve a highspeed storage purpose.A complete bad block handling mechanism is presented.It can shield using known bad blocks.And it ensures storage operation is executed and the data is correct and complete when new bad blocks occur.The result show that the maximum storage rate of the program can achieve up to 100 Mbps.The bad block handling mechanism can ensure accuracy,completeness and continuity of data.
large capacity;solid state recorder;NAND flash controller;invalid block handle;pipelining program;FPGA application
TN431
A
1674-6236(2016)16-0050-04
2015-08-21稿件编号:201508117
闫梦婷(1989—),女,广西桂林人,博士研究生。研究方向:星载高速总线的系统架构研究及性能分析,高性能星载存储系统。