基于FPGA的NAND FLASH坏块表的设计与实现
0 引言
随着技术的发展,越来越多的电子设备的数据采用NAND FLASH 芯片存储产生的大量数据。在传统的电路设计中,常用ARM、DSP 等处理器来用于NANDFLASH 的接口。但是随着实时性要求的提高,越来越多的设备中采用了FPGA 来对NAND FLASH 进行坏块管理,释放处理器任务资源。
由于NAND FLASH 的特点,NAND FLASH 不可避免地会有坏块产生,使用NAND FLASH 时,需要对坏块进行管理,建立坏坏表(以下简称“BBT”)。一般处理管理BBT 的方法,是采用建立数组的方式,将检测到的坏块编号记录在数组中,在操作NAND FLASH 时,对将要操作的块的编号与BBT 的数据进行对比,如果是坏块,则跳过该块,不使用。但是这是建立数组的方法并不适用于FPGA 的设计操作,本文根据FPGA 的特点,利用FPGA 的Block RAM 资源,提出了一种坏块检测、存储的方法。
1 电路说明
1.1 NAND Flash芯片说明
NAND Flash芯片使用型号是三星公司的K9K8G08U0A,单片容量为1 G×8 Bit。该芯片总共有8 192 块,每块中含有64 页,每页共2 112 个字节(前2 048 个为主存储空间,后64 个为扩展存储空间)。芯片的读写操作均以页为单位进行。芯片容量结构如图1 所示。
图1 NAND Flash内部存储空间结构图
其中,NAND Flash 芯片分为列地址(Column Address)和行地址(Row Address),列地址用于每页中的字节寻址,行地址用于芯片的块、页的寻址,其中行地址的A18~A30 为芯片的块地址。
1.2 FPGA电路说明
FPGA 使用型号为Xilinx(现AMD)公司Virtex II系列的XC2V1000,芯片内部有5 120 个Slice、40 个乘法器、720 kbit 的RAM 模块资源,8 个DCM 时钟管理模块。其主要参数如图2 所示。
图2 FPGA芯片说明
2 坏块表设计
2.1 坏块表检测机理
根据NAND FLASH 芯片的检测原理,芯片出厂后的坏块检测需要检测芯片每个部分的页1和页2中列地址为2 048的存储的数据值。若值为0xFF,则该部分为好块;若值不为0xFF,则该部分为坏块。NANDFLASH 坏块检测流程如图3所示。
2.2 坏块表的设计思路
根据FPGA 的应用特点,本次NAND Flash 的坏块表采用对所有块建立坏块信息的方式,建立一个完整的块状态信息表,即每一个块用1 个Bit 表征其是否是好块还是坏块,定义为:0 代表该块是良好的,1 代表该块是故障的。本设计中,NAND Flash 有8 192 个块,用8 192 个Bit 代表每个块的状态信息,正好用一个1 024×8 bit 的RAM 对所有的坏块表数据位进行存储,坏块表存储示意图见图4。
2.3 坏块表的存储
在本设计中,NAND FLASH的坏块表储存在NAND FLASH的第1 块的第1 页处。第1 块只用于坏块表的存储,不再用于存储其他数据,坏块表在第1 块中的位置见图5。
2.4 坏块表的建立流程
NAND FLASH 在使用时,初次上电后,写入数据之前需要对芯片的块的好坏进行扫描,从而得到坏块表。在本型号中,NAND FLASH 的出厂坏块信息需要查询每个块的第1 个页和第2 个页中的列地址为2 048 的空间上数据是否都为“0xFF”,数据为“0xFF”,则当前块为好块,否则当前块为坏块。
坏块表的建立的状态机流程如图6 所示:上电后,状态机从状态1 跳转至状态2,读取第一块中的数据,判断是否为数据头0xAA、0x55、0xAA、0x55、0xAA、0x55、0xAA、0x55。如果数据头相符,则状态跳转至11,直接读取坏块表到RAM,建立起坏块表信息。如果读到的数据头与上述的数据头不相符,则意味NAND FLASH 未存在坏块表,需要建立坏块表。状态机状态依次跳转至状态4、状态5、状态6,即状态机对当前块的中的第1 页和第2 页的中列地址为2 048 的空间进行访问,根据读值判别当前块是否为坏块,如果是坏块将对应的寄存器位置1。当扫描完8 个块,状态机跳转至状态7,则将8 个块的坏块信息写入RAM;当未扫描满8 个块,状态机跳转至状态8,块地址加1,对下一个块进行检测。当所有的8 092 个块都被检测后,则状态机跳转至状态10,将数据头以及RAM 数据全部写入NAND FLASH 的第0 块,至此,初始坏块表建立完成。
坏块表建立完成后,坏块信息存在RAM 中,在正常存取操作时,就可以直接读取RAM 模块,获取坏块信息。
当电路下电,再次上电后,状态机就可以从块0 中读取到数据头,跳过初次坏块表的建立过程,状态机从第1 块中继续读取到坏块表,加载到RAM 中,完成后交其他模块进行后续的操作。
3 验证情况
为验证是否正确的建立和存储坏块表,需要将坏块表的处理模块嵌入FPGA 的中整个NAND FLASH 的接口控制器中,验证的电路如图7 所示。坏块表处理模块与1 个1 024×8 Bit 的RAM 连接,该RAM 用于存储坏块表。NAND FLASH 接口模块根据NAND FALSH芯片的读写接口时序设计,包含基本的Read 模块,Write 模块和擦除模块。NAND FLASH 接口模块受坏块表处理模块的控制。正常工作模块在坏块表处理模块工作完成之后开始工作,通过UART 接收上位机的命令,控制NAND FLASH 接口模块与NAND FLASH 交联;同时,正常工作模块也通过UART 上报数据和信息给上位机。
验证时,通过上位机发送读取命令,正常工作模块控制NAND FLASH 接口模块将NAND FLASH 块0 中的内容读取出来,从而判断是否正确地建立了坏块表,见图8。
图8 坏块表
通过读取内容发现,新板卡中的NAND FLASH 成功地建立了坏块表,本测试电路中NAND FLASH 芯片有1 个坏块,为第1 761 块。
4 结束语
通过验证证明,本文设计的基于FPGA 的坏块表设计方式能够正确地实现坏块表建立和存储,坏块表能够方便地被FPGA 使用,坏块表能完整地表征整个NANDFLASH 芯片的块的状态,RAM 结构能很灵活方便地在FPGA 中进行调用,满足对FPGA 对NAND FLASH 芯片的控制需要。
参考文献:
[1] 舒文丽,吴云峰.基于NAND FLASH的海量存储器的设计[J].电子器件,2012,2(35):44-46.
[2] 赵亚慧.基于NAND Flash的高速大容量存储系统的设计[J].电光与控制,2016,5(23):37-40.
[3] 乔亚飞,,李华旺.基于FPGA的星载NAND FLASH控制器的设计[J].电子设计工程 2018,7(26):29-32.
[4] 周浩,王浩全.基于FPGA和NAND FLASH的便携式信号采集系统设计[J].测控技术与仪器仪表,2018,44(9):82-86.
[5] 张雯,崔建杰.一种多通道NAND FLASH阵列的坏块管理方案[J].电子器件,2014,10(37):33-36.
[6] 乔立岩,张鹏.一种新型NAND FLASH 坏块管理算法的研究与实现[J].电子测量技术, 2015,11(38):19-21.
(本文来源于《电子产品世界》杂志2022年12月期)
评论