您现在所在位置:首页>>新闻中心>>常见问题

公司资讯

行业动态

常见问题

基于FPGA的NAND Flash的分区续存的功能设计实现

发布日期:2023-06-15 20:36:57浏览次数:728


0 概述

随着现代技术的进步,越来越多的系统采用NAND Flash芯片来实时记录数据。而随着NAND Flash容量的增大,系统可以存储更多的数据和更长的时间。然而,随着系统变得复杂,对数据存储的要求也越来越高。


传统的NAND Flash控制器每次存储都是从Flash的零地址开始,当存储任务结束后,再次开启存储时会从零地址重新开始存储。这样会导致新数据覆盖之前的数据,无法实现数据的续存,给NAND Flash使用带来很大不便。同时,数据反复地从零地址开始存储也会导致NAND Flash存储器使用上的不均衡问题,并影响其寿命。


为了解决这些问题,本文提出了一种基于FPGA的NAND Flash分区续存功能控制器实现方法。具体方法是根据控制对象的特点将NAND Flash划分为多个分区,并利用其中一部分空间记录最新分区地址信息。在初始化时,控制器通过读取最新分区地址信息自动跳过该分区,在下一个分区开始存储,并更新最新分区地址信息。通过这种方法可以灵活地实现NAND Flash控制器分区续存功能,解决了数据不能续存的问题,同时也解决了NAND Flash存储器使用上的不均衡问题。


1 电路说明

具体电路说明中提到的NAND Flash芯片型号是三星公司的K9K8G08U0A,单片容量为1 G x 8 Bit。该芯片总共有8192个块(Block),每个块中含有64页(Page),每页共2112个字节(其中2048个字节为主存储空间,64个字节为扩展空间)。

芯片容量结构如图1 所示。

image.png

关于FPGA使用型号为Xilinx公司Virtex II系列的XC2V1000芯片的描述如下:该芯片内部包含5120个Slice、40个乘法器、720 kbit的RAM模块资源以及320个用户I/O引脚。此外,还设计了2个NAND Flash控制器。


2.1 控制器概述

NAND Flash 控制器的结构框图如图2所示,主要由应用层和接口层两部分组成。接口层负责与NAND Flash进行读取、写入和擦除操作的接口功能;而应用层则负责调用接口层模块,并完成NAND Flash 控制器的控制功能。此外,分区续存功能是在工作控制模块中设计实现的[2]。

image.png


2.1.1 分区设计

用根据[本型号NAND Flash共有8192个块,块地址范围为0~8191。其中块0和块1被用作状态存储区,其中块0用于存储坏块表,块1用于存储本次数据记录所使用的最新分区的地址信息;而块2~8191则用作数据存储区,总共有8190个块。在这个设计中,将这8190个块划分为10个分区,分别为分区0~9,每个分区包含819个块。具体的分区设计结构如图3所示。

image.png



2.1.2 分区工作机理

NAND Flash控制器上电后,需要先读取上一次存储的NAND Flash分区地址信息,并需要有一块专门的空间用于存储该地址。本设计中,我们利用NAND Flash的块1的第0页来存储该地址信息,其中使用分区的起始地址作为分区的地址信息。


为了实现最新分区起始地址的动态更新,控制器在获取起始地址信息后,会根据分区大小自动计算出下一个分区的首地址,并将计算后的起始地址信息更新至块1的第0页。然后,从计算后的起始地址开始进行数据存储操作。当数据存储操作超过本次分区的地址范围时,控制器会再次计算出下一个分区的起始地址,并将最新分区地址更新至块1的第0页,以实现最新分区起始地址的实时更新。



2.1.3 分区地址的存储

NAND Flash存储器块1中的第0页被用作最新分区的首地址存储区。该存储区遵循图4所示的数据格式。在第0页中,前两个字节表示最新分区的首地址,而其他数据字节都被设为0xCB。这种数据格式设计的目的是为了在大量数据读取时方便地检索和定位到最新分区的首地址存储区。

image.png

根据系统的要求,1被反复更新写入最新分区的起始地址,需要估算块1的使用寿命。在本次应用中,每隔5毫秒存储256个字节的数据量为51 kbit/s。因此,存满1页需要40毫秒,存满1块需要2.56秒,存满1个分区需要约38分钟。也就是说,大约每隔38分钟就需要对块1进行一次写操作。


根据NAND Flash寿命按10万次写操作计算[7],可以得出NAND Flash块1在本系统中的使用时长约为6.3万小时,能够满足正常的使用需求。



2.1.4 分区状态机的设计

根据分区机制,FPGA的工作控制模块设计了与分区相关的状态机。状态机的流程如下:上电后,状态机从状态1跳转至状态2,用于判断初始化是否完成。等待初始化结束后,状态机跳转至状态3,在该状态下读取块1的第0页中的数据,以获取上一次的分区信息。在状态4中进行计算并更新本次要操作的最新分区地址。接着,状态机依次跳转至状态5和6,在这两个状态下将更新后的最新分区地址写入块1的第0页,并更新本次操作所涉及的块地址。然后,状态机跳转至状态6,进行正常的数据存储操作。接下来是连续写操作阶段,即状态7、8和9。在状态10时,判断是否超出了当前分区范围。如果超出,则跳转回到状态4重新计算并更新分区地址;否则,跳转至状态6继续存储数据。

image.png

当电路下电,再次上电后,状态机会跳过上一次操作的分区,从下一分区开始存储数据,保证了数据存储的连续性,前一次的存储的数据不会被本次数据覆盖,本次数据前一次操作的分区的下一分区进行存储。


3 验证情况

验证的电路框图如图6 所示。在NAND Flash控制器中进行验证,分区功能嵌入在工作控制模块中,在FPGA 中设计1 个模拟数据源,模拟系统发送的数据,每隔5 ms 写入256 个字节数据;通过维护串口与上位机进行通信,可以通过上位机启动控制器工作和停止,读取块1 的数据等。

image.png

根据验证内容分为两个部分:首先是针对不跨分区的自动续存功能进行验证,其次是对跨分区的自动续存功能进行验证。


不跨分区验证时,验证的存储时长约为1 min。先通过维护串口与上位机发送读取命令,先读取块1 的数据,得到本次存储前的最新分区信息,然后发送存储命令,1 分钟后直接下电重启,再次读取块1 的数据,对比第2 次读到的最新分区信息,如图7 所示。存储前分区信息为0×0CCE,即分区4。存储后分区信息为0×1001,即分区5。说明本次存储的数据在分区5,成功跳过了分区4,分区4 为上一次存储的空间。


image.png

跨分区验证的存储时长约为45分钟,超过了38分钟,以确保所存储的数据能够跨越1个分区。首先通过上位机发送读取命令,读取块1的数据,获取本次存储前的最新分区信息。然后发送存储命令,并在45分钟后进行断电重启。再次读取块1的数据,并对比第2次读取到的最新分区信息,如图8所示。存储前的分区信息为0×1001,即表示位于分区5。而存储后的分区信息为0×1667,即表示位于分区7。这说明本次存储的数据跨越了分区6和分区7,并成功更新了最新的分区地址信息。

image.png

综上,通过实验证明,本文设计的基于FPGA 的自动分区续存功能够正确地实现,方法简单便捷,满足系统对NAND Flash 存储器芯片的多次存储的控制需求。


4 结束语

本文提出了一种基于FPGA 的自动分区续存功能的方法,该方法简单方便的实现了存储器的分区管理,满足了数据分区续存的需求,并得到了试验证明。该方法的分区续存功能准确可靠,目前已经在实际产品中得到了应用和验证。



0755-2101 2187