本发明涉及flash控制领域,尤其是一种基于fpga的flash阵列控制方法及控制器。
背景技术:
当前,以flash存储芯片作为介质的sata、msata、nvme电子盘等应用正在取代传统硬盘得到广泛应用,性能越来越高,成本也越来越低;但是在一些电子设备中,受到体积以及结构功耗等限制,采用嵌入式计算机+电子盘的方案实现有困难,在有些高速流数据的处理系统中,数据需要实时存储,事后分析;比如信号处理领域中高速ad采集数据的存储,这些数据存储带宽超出了普通电子盘的存储带宽,采用高性能计算机+电子盘磁盘阵列的解决方案往往体积较大,并且环境适应性也不能满足一些特定要求;因此在很多定制嵌入式设备中,尤其是军用嵌入式电子设备里,直接采用fpga控制flash芯片阵列的方案,这样集成度更高,结构更可靠,减少了元器件,提高了可靠性。
目前使用fpga直接控制flash阵列存储数据在军用电子设备数据存储是常用的解决方案,但是现有的直接采用fpga控制flash阵列,存在如下问题:
a)由于flash工艺本身的固有缺陷,flash芯片结构存在坏块(block),并且在使用的过程中,坏块数量会增加;
b)flash芯片的每一块或者页有使用次数限制,slcnandflash一般在60000~100000次,mlcnandflash的使用次数在5000次左右,tlcnandflash的使用次数在3000次左右;
c)flash芯片结构按照块(block)、页(page)操作,擦除以块为单位,编程以页为单位(也可以以少于一页的数量进行编程操作);
d)flash在执行写入(编程)前,必须先擦除(一般来说,擦除操作将数据位由0变为1,编程操作将1变为0);
e)flash在执行擦除或者编程操作时,时间不确定;芯片手册会给出最大时间(不同的器件这个值不相同);
f)flash除了存在坏块外,还存在坏点;
因此,能够解决上述问题的基于fpga的flash阵列控制方法的设计变得尤为重要。
技术实现要素:
本发明的发明目的在于:针对上述存在的问题,提供一种基于fpga的flash阵列控制方法,分层解决flash阵列的控制问题;通过flash阵列控制器,实现flash阵列的控制。
本发明采用的技术方案如下:
本发明一种基于fpga的flash阵列控制方法,包括:进行分层控制:
第一层:通过时序控制,对flash阵列的实际物理地址按页读、写,按块擦除;
第二层:建立逻辑地址到物理地址映射表,对flash阵列的坏块进行管理,并在使用过程中对增加的坏块进行动态管理;
第三层:建立循环存储管理,对flash进行均衡使用;
第四层:对数据加前向纠错编码。
作为优选,所述第四层中的前向纠错编码方法包括:使用rs编码进行前向纠错,数据读出后通过并行rs译码恢复数据。
本发明一种基于fpga的flash阵列控制器,包括flash阵列io时序控制模块、坏块管理逻辑、flash阵列命令控制逻辑、接口管理逻辑、数据流处理器和cpu接口模块;
所述flash阵列io时序控制模块,用于flash阵列第一层次的控制时序;
所述坏块管理逻辑,用于坏块管理,进行flash阵列第二层次的控制;
所述cpu接口模块,用于控制命令、寄存器的映射,将整个flash阵列控制器例化为一个可通过cpu控制寄存器操作的ip,进行flash阵列第三层次的控制;
分别与坏块管理逻辑和数据流处理器进行交互;
所述flash阵列命令控制逻辑,用于flash阵列非初始化及命令控制逻辑;分别与flash阵列io时序控制模块和接口管理逻辑进行交互,并与cpu接口模块进行交互;
所述接口管理逻辑,将flash阵列接口转换为按页为单位类似sdram的数据读写接口,按照逻辑地址访问;与坏块管理逻辑进行交互;
所述数据流处理器,完成外部数据读写访问与接口管理逻辑之间的数据交换。
作为优选,基于fpga的flash阵列控制器还设有控制器对外接口;所述控制器对外接口包括:flash阵列接口、数据流读写接口、处理器emif接口和坏块管理缓存接口;所述flash阵列接口与flash阵列io时序控制模块连接;所述数据流读写接口与数据流处理器连接;所述处理器emif接口与cpu接口模块连接;所述坏块管理缓存接口与坏块管理逻辑连接。
作为优选,所述flash阵列io时序控制模块的控制方法:将nandflash芯片阵列的执行过程转换为空闲状态(io_idle)、片选输出状态(io_cs)、命令锁存状态(io_cle)、地址锁存状态(io_ale)、读异步时序控制状态(io_are)、读同步时序控制状态(io_sre)、写异步时序控制状态(io_awe)或写同步时序控制状态(io_st7)。
作为优选,所述接口管理逻辑的控制方法:在fpga写flash时,实行流水线写操作;在fpga读flash时,随机读取;在flash阵列擦除时,按流水线方式按照逻辑地址顺序擦除;所述接口管理逻辑的接口包括flash写访问接口、flash读访问接口和flash擦除接口。
作为优选,所述flash阵列命令控制逻辑的控制方法:将nandflash芯片阵列的执行过程转换为空闲状态(flc_nop)、复位状态(flc_reset)、读flash芯片状态寄存器(flc_rdst)、读flash芯片id(flc_rdid)、获取flash芯片模式寄存器(flc_gfet)、设置flash芯片模式寄存器(flc_sfet)、读取flash参数页(flc_rdpp)、读数据状态(flc_read)、写数据状态(flc_prog)、擦除块状态(flc_erase)、回读页状态(flc_cbread)或回读并写状态(flc_cbprog)。
作为优选,所述坏块管理逻辑的控制方法:
st0:初始化逻辑地址到物理地址映射表为一一对应,坏块计数器初始化为0;
st1:判断是否有格式化命令,无则等待,有则进入st2;
st2:开始执行当前逻辑地址擦除命令,进入st3;
st3:读flash阵列状态,等待擦除完成,擦除完锁存芯片状态寄存器,进入st4;
st4:若擦除失败,则逻辑地址不变,将坏块计数器取反对应的映射表中物理地址与当前逻辑地址对应的映射表中的地址交换,进入st2;否则,逻辑地址加1,进入st5;
st5:判断是否格式化完毕,格式化完毕进入st6,否则进入st2;
st6:判断是否有随机地址擦除命令,有则进入st7;
st7:开始执行当前逻辑地址擦除命令,进入st8;
st8:读flash阵列状态,等待擦除完成,擦除完锁存芯片状态寄存器,进入st9;
st9:若擦除失败,则逻辑地址不变,将坏块计数器取反对应的映射表中物理地址与当前逻辑地址对应的映射表中的地址交换,进入st7;否则,进入st6。
作为优选,所述数据流处理模块的具体控制方法:将外部并行的写数据请求以及读数据请求进行仲裁,根据数据缓存的大小以及flash阵列的各流水状态进行判断仲裁优先执行读或者写。
综上所述,由于采用了上述技术方案,本发明的有益效果是:与现有技术相比,本发明实现任意宽度与深度的nandflash阵列的控制,通过寄存器控制可以实现按照物理地址或者按照逻辑地址对nandflash阵列执行擦除、编程、读以及读状态、读id、获取flash结构信息、设置模式等操作。
附图说明
本发明将通过例子并参照附图的方式说明,其中:
图1是本发明一种基于fpga的flash阵列控制方法的流程图。
图2是本发明一种基于fpga的flash阵列控制器的结构示意图。
图3是控制状态转换的状态机转换示意图。
具体实施方式
本说明书中公开的所有特征,或公开的所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合。
本说明书(包括任何附加权利要求、摘要)中公开的任一特征,除非特别叙述,均可被其他等效或具有类似目的的替代特征加以替换。即,除非特别叙述,每个特征只是一系列等效或类似特征中的一个例子而已。
实施例一:
如图1,本发明一种基于fpga的flash阵列控制方法,包括:进行分层控制:
第一层(底层):解决flash阵列的控制时序问题,对flash阵列的实际物理地址按页读、写,按块擦除;
第二层:建立逻辑地址到物理地址映射表,对flash阵列的坏块进行管理,并在使用过程中对增加的坏块进行动态管理;
第三层:建立循环存储管理,对flash进行均衡使用;
第四层:对数据加前向纠错编码,解决flash中存在的坏点问题;前向数据纠错编码可以利用通信领域成熟的各种bch/ecc/ldpc编码译码等。
在实现实施例中,所述第四层中的前向纠错编码方法采用:使用rs编码进行前向纠错,数据读出后通过并行rs译码恢复数据。
实施例二:
本发明一种基于fpga的flash阵列控制器,包括flash阵列io时序控制模块、坏块管理逻辑、flash阵列命令控制逻辑、接口管理逻辑、数据流处理器和cpu接口模块;
所述flash阵列io时序控制模块,用于flash阵列第一层次的控制时序;
所述坏块管理逻辑,用于坏块管理,进行flash阵列第二层次的控制;
所述cpu接口模块,用于控制命令、寄存器的映射,将整个flash阵列控制器例化为一个可通过cpu控制寄存器操作的ip,并对逻辑地址可以进行循环存储管理,均衡使用flash,进行flash阵列第三层次的控制;分别与坏块管理逻辑和数据流处理器进行交互;
所述flash阵列命令控制逻辑,用于flash阵列非初始化及命令控制逻辑;分别与flash阵列io时序控制模块和接口管理逻辑进行交互,并与cpu接口模块进行交互;
所述接口管理逻辑,将flash阵列接口转换为按页为单位类似sdram的数据读写接口,按照逻辑地址访问;与坏块管理逻辑进行交互;
所述数据流处理器,完成外部数据读写访问与接口管理逻辑之间的数据交换。
在实施例中,基于fpga的flash阵列控制器还设有控制器对外接口;所述控制器对外接口包括:flash阵列接口、数据流读写接口、处理器emif接口和坏块管理缓存接口;所述flash阵列接口与flash阵列io时序控制模块连接;所述数据流读写接口与数据流处理器连接;所述处理器emif接口与cpu接口模块连接;所述坏块管理缓存接口与坏块管理逻辑连接。
flashio时序控制模块:
如图3所示,io时序控制模块状态机分为空闲状态(ctl_idle),准备状态(ctl_ready),执行状态(ctl_exec),结束状态(ctl_end);io时序控制模块将nandflash芯片阵列的执行过程转换为空闲状态(io_idle)、片选输出状态(io_cs)、命令锁存状态(io_cle)、地址锁存状态(io_ale)、读异步时序控制状态(io_are)、读同步时序控制状态(io_sre)、写异步时序控制状态(io_awe)、写(we)同步时序控制状态(io_st7);rtl描述如下示意:
接口管理逻辑:
包括flash写访问接口、flash读访问接口和flash擦除接口:
flash写访问接口:
使用vhdl语言描述的flash写访问接口如下:
flash_wreq信号为外部host发起写flash阵列的请求信号,当flash控制器响应时,flash_wack变为高电平,如果flash_wrdy为高,则host向flash阵列中写入数据;flash_write信号由高变低时,flash控制器结束向flash阵列中写入数据发送编程命令;命令完成后flash_wack变为低电平。
flash_wlptr为逻辑指针,指向单位为页,包含块地址、lun选择、cs选择、页地址。按照流水线管理,逻辑地址的最低几位为cs选择,次低几位为lun选择,然后是页地址,高位是逻辑块地址。
所谓逻辑地址是指逻辑上按顺序地址总是连续的,但是在硬件上,连续的几个地址可能分布在不同的芯片上,物理块地址也不一定是连续的。逻辑地址到物理地址的映射由坏块管理逻辑模块完成。
fpga写flash时,一次写一页,由于写一次需要的时间比较长,因此需要实行流水线写操作,即第一次写数据时,从block0的第0页开始写,写满一页后,下一次的一页数据写往下一个block的第0页当中,在硬件设计时,8片flash可以实现16级流水线操作,因此可以顺序写流水线n个block,当第流水线n个block被写满一页时,下一次回到block0的第1页开始写,如此循环,直到流水线n个block的每一页都被写满,再往下一个流水线n个block开始写。
flash读访问接口:
使用vhdl语言描述的flash读访问接口如下:
flash_rreq信号为外部host发起读flash阵列的请求信号,当flash控制器响应时,flash_rack变为高电平,如果flash_rrdy为高,则flash控制器向外输出数据,数据有效时flash_dle为高;完成后flash_rack变为低电平;host在flash_rbusy为低电平时发起读请求;flash在执行任何其它命令或者流水线操作不方便响应时,flash_rbusy都为高。flash_rcol设置读每页的列地址起始值,flash_rlen表示读每页的长度。
fpga读flash时,默认一次读一页,由于读一次需要的时间比较短,因此读数据不需要按流水线顺序处理,可以随机读取。
flash擦除接口:
使用vhdl语言描述的flash读访问接口如下:
flash_ereq信号为外部host发起擦除flash阵列的请求信号,当flash控制器执行完擦除命令后,flash_eack变为高电平,持续一个时钟周期后变低。
flash阵列擦除的时间比较长,在硬件设计没有缺陷的前提下(擦除和编程都需要较大电流,按照流水线操作意味着所有芯片同时工作,如果电源供应不足,将导致擦除失败),应按流水线方式按照逻辑地址顺序擦除。
flash阵列命令控制逻辑:
整个控制状态转换状态机转换如图3所示:
rtl描述如下示意:
坏块管理逻辑:
坏块管理可以多种方式实现,本发明中采用逻辑地址到物理地址的映射表来管理坏块;每一个chip,将其中最后1/8或者1/16块作为备用块(使用多少作为备用,不受限制,可以根据实际需要调整,采用常数定义的方式实现),当前面区域出现坏块时,将备用块与坏块交换;每一级流水对应的并行芯片可使用独立的坏块判断,也可统一判断,较简单的方法是并行使用的多个芯片出现一个坏块,就将多个并行芯片的同一个地址的块一起替换。
以16级流水的阵列为例,假设每级流水对应的plane/chip有4096块,则总共有65536块,则逻辑地址共16位,高12位对应每plane/chip的块地址,低4位对应流水线级数;
交换算法如下:
st0:初始化逻辑地址到物理地址映射表为一一对应(此时逻辑地址高位等于物理地址),坏块计数器初始化为0(定义坏块计数器范围为0到块总数)
st1:判断是否有格式化命令,无则等待,有则进入st2
st2:开始执行当前逻辑地址擦除命令,进入st3
st3:读flash阵列状态,等待擦除完成,擦除完锁存芯片状态寄存器,进入st4;
st4:若擦除失败,则逻辑地址不变,将坏块计数器取反对应的映射表中物理地址与当前逻辑地址对应的映射表中的地址交换,进入st2;否则,逻辑地址加1,进入st5;
st5:判断是否格式化完毕(只格式化到使用区域的最后一个块,备用区域不用格式化),格式化完毕进入st6,否则进入st2。
st6:判断是否有随机地址擦除命令,有则进入st7。
st7:开始执行当前逻辑地址擦除命令,进入st8。
st8:读flash阵列状态,等待擦除完成,擦除完锁存芯片状态寄存器,进入st9;
st9:若擦除失败,则逻辑地址不变,将坏块计数器取反对应的映射表中物理地址与当前逻辑地址对应的映射表中的地址交换,进入st7;否则,进入st6。
数据流处理模块:
数据流处理模块主要是将外部并行的写数据请求以及读数据请求进行仲裁,要根据数据缓存的大小以及flash阵列的各流水状态进行判断仲裁优先执行读或者写;本模块的仲裁与实际应用背景有关,比如实际工程中,输入的数据流数据量比较大,读则无要求,则需要优先考虑写;也可根据外部缓存的状态来进行优先级仲裁。
cpu接口模块:
cpu接口模块主要是将整个flash阵列控制器例化为一个可通过cpu控制寄存器操作的ip,其与cpu的接口可根据实际工程需要确定,常用dsp来控制,所以采用的是emif总线接口。
本发明基于fpga的flash阵列控制器实现的主要功能描述:
1)通过修改配置参数,可实现16、32、64、128数据位宽与任意深度(1、2、4、8、16、32级流水或片选)的阵列控制;
2)通过修改配置参数,支持任意page长度(4k、8k、16k、32k)的flash页操作;
3)通过修改配置参数,支持任意block深度(每个block含64页/128页/256页);
4)通过修改配置参数,支持每个plane任意深度(每个plane含有2048块/4096块/8192块/16384块/或其他);
5)通过命令寄存器设置,支持同步访问、异步访问的切换;
6)在复位后自动按照异步访问方式设置默认模式、时序模式、读取id、复位所有flash芯片、查找地址映射表lfpt并下载到sram中;
7)通过命令寄存器设置,可实现对整个阵列执行擦除、格式化,擦除后的状态在状态寄存器中显示;格式化后在外部存储器中建立逻辑地址与物理地址的映射表,并将映射表写入flash阵列中;
8)通过命令寄存器查找某区间的写指针位置与擦除指针位置,并在寄存器中显示;
9)采用rs编码的方式进行纠错编码;将每块第一页数据存储时,将该页的逻辑地址存储在冗余信息中。
本发明并不局限于前述的具体实施方式。本发明扩展到任何在本说明书中披露的新特征或任何新的组合,以及披露的任一新的方法或过程的步骤或任何新的组合。