基于FPGA的K9F4G08 Flash控制器设计
时间:11-09
来源:互联网
点击:
设计了一种能使FPGA的主状态机直接管理Flash的控制器,该控制器具有自己的指令集和中断管理方式。用户可以根据FPGA的系统时钟对控制器进行操作,无需关心Flash对指令和数据的时序要求。控制器建立了自己的坏块管理机制,合并了一些Flash的常用关联指令,方便了用户对FPGA主状态机的设计。
K9F4G08是三星公司的512 MB NAND Flash,具有8 bit输入输出总线。存储空间共分成4 096个块,每个块有64个页,每个页容量为2 KB,外加64 B的备用空间,组成256 K行×(2 K+64)列的存储阵列,其地址用5个字节表示。
K9F4G08具有自己的指令集,可以完成对Flash一个页的读、写以及对一个块的擦除等操作。有严格的时序要求以保证芯片正确地执行相应的指令。Flash在出厂时会有坏块,坏块是无法操作的,这对于连续大批量的数据存储来说有一定的难度,需要建立一套Flash空间管理方案以保证坏块不被读写,提高数据读写的可靠性。
用FPGA直接管理Flash不仅是一种可行的方案,而且还能精简硬件结构。但与具有专用Flash接口的MCU或ARM等高档嵌入式微处理器不同,FPGA不能通过简单的读写指令编程管理Flash,而必须按照时序要求对Flash的端口进行指令和参数的具体操作。若FPGA的主状态机直接管理Flash,将会使状态机的状态数量大量增加,代码将异常复杂,甚至无法完成设计。
为解决上述问题,本文设计了一个Flash控制器controller_4G08,它建立了自己的指令集,可以方便地实现FPGA对Flash的控制和读写操作。FPGA主状态机可以在系统时钟频率下对controller_4G08发送指令,然后等待controller_4G08返回的中断,中断返回即表示操作完成,无需关心Flash要求的操作时序。采用这个控制器将大大简化FPGA主状态机的状态数量,方便设计和调试,同时代码具有很强的可移植性。
1 controller_4G08的设计方案
理论上讲FPGA可以直接对Flash操作,但这样会使主状态机状态很多,程序繁琐,当需要大批量数据反复读写时很不方便。本文设计了一个控制器controller_4G08,用这个控制器完成数据指令读写的时序操作。
用controller_4G08管理Flash的系统框图如图1所示。FPGA部分有2个模块:主状态机和controller_4G08,它们之间的端口连接包括4 bit指令端口cmd_code_4G08、8 bit数据输入输出端口data_in_4G08与 data_out_4G08、中断信号int_ctl_4G08;FPGA对K9F4G08芯片接口包括8 bit双向数据端口data_4G08、忙标志rb、读使能we、写使能re等端口。FPGA主状态机若想对Flash进行操作,只需要通过cmd_code_4G08向controller_4G08发指令,按照系统时钟通过data_in_4G08与 data_out_4G08收发数据,然后controller_4G08会对K9F4G08执行相应的操作,指令执行完之后会通过int_ctl_4G08给主状态机一个中断信号,告诉主状态机执行完毕。FPGA主状态机不必关注Flash指令操作的时序问题,从而使设计简化。
2 controller_4G08的指令集
K9F4G08具有自己的指令集,以读操作为例,其操作过程是:首先发送命令00h,再发5个周期地址,最后发送命令30h。Flash开始读相应的页,此时rb信号为低(表示Flash处于busy状态),等到rb信号为高,再按照时序改变读使能信号,便可将1个页的数据依次读出。
controller_4G08根据K9F4G08的指令集建立了自己的指令集,新增了全擦、部分擦指令,并且在读写指令前加入了坏块匹配功能,如表1所示。
2.1 匹配表
Flash出厂后可能存在坏块,使用中也有可能会再出现新的坏块。制造商保证每个芯片中的坏块不多于80个,同时保证第0个块肯定是好的,且保证擦写1 000次不坏。当进行连续地址的数据读写时有可能遇到坏块,坏块无法进行操作,会导致数据的丢失。因此必须建立一个匹配表,当遇到坏块时,将其匹配到好块的地址上。
实际的数据读写中只使用4 000个块,根据这些要求设计了这样的匹配表:长度512 B,存放在第0个块的第0个页(B0P0)。具体内容见表2。
一个块的地址用2 B的16进制数表示。256 B可以存储128个块地址。0"255与256"512中存储的块地址是一一对应的,当使用到0"255中的块地址时,需要从256"511中寻找对应的块地址进行替换。
在FPGA中生成一个512 B的ram:ram_512,专门用于存放匹配表,当系统上电复位后,状态机会自动将B0P0的数据读出,并将前512 B的数据存入该ram_512中,以便后面匹配时使用。
2.2 全擦与部分擦指令
该指令用于擦除所有的块,建立新的匹配表。由于坏块会导致擦除不成功,状态机在擦除过程中会记录下1"4 000个块中擦除失败的坏块的地址、4 000"4 095个块中好块的地址,先按照匹配表规定的顺序写入ram_512,全部擦除完成后将ram_512中的数据写入B0P0。由于数据量不足2 KB,因此后面补零。其流程图如图2所示。
部分擦除与全擦类似,执行这条指令需要给定起始与结尾的块地址,controller_4G08可以完成对2个块地址之间所有块的擦除。当擦除过程中擦到坏块时,状态机会从匹配表中寻找该坏块对应的好块,并擦除。若没有寻找到该坏块的匹配块,则出现了新的坏块,会产生一个报错的标志位,提示主状态机需要进行全擦,以便建立新的匹配表。
2.3 读写匹配
如果遇到坏块,会造成读写失败,为了满足大批量数据读写的连续性,在读写数据之前必须对当前块地址进行匹配,这些工作由controller_4G08完成,当主状态机给controller_4G08发送块地址后就会执行。
Flash读写是对页操作的,一次2 KB。FPGA中有一个4 KB的ram:ram_4096,用来作为缓冲区存放数据。当需要向Flash中写入数据时,主状态机向controller_4G08发Page_program指令,发送5 B地址,controller_4G08会自动进行块地址匹配,匹配完之后会给主状态机一个中断信号,主状态机收到这个信号便开始将ram_4096中的数据发给controller_4G08,之后等待中断,收到中断说明写指令执行成功。
当需要读取数据时,主状态机向controller_4G08发Page_read指令,发送5字节地址,controller_4G08会自动进行块地址匹配及Flash的页读操作,等中断一到便开始接收来自controller_4G08的数据并存至ram_4096中。
controller_4G08中有一个存放上次块地址的寄存器,每次进行读写操作时,会将当前块地址与上次的块地址进行比较,若相同则说明是好块,可以读写;若不同则需要进行匹配。状态机会从ram_512中寻找该块是否为坏块,进行一系列处理。与擦除指令一样,当读写操作遇到新的坏块时,也会向系统报错。匹配流程图如图3所示。
K9F4G08是三星公司的512 MB NAND Flash,具有8 bit输入输出总线。存储空间共分成4 096个块,每个块有64个页,每个页容量为2 KB,外加64 B的备用空间,组成256 K行×(2 K+64)列的存储阵列,其地址用5个字节表示。
K9F4G08具有自己的指令集,可以完成对Flash一个页的读、写以及对一个块的擦除等操作。有严格的时序要求以保证芯片正确地执行相应的指令。Flash在出厂时会有坏块,坏块是无法操作的,这对于连续大批量的数据存储来说有一定的难度,需要建立一套Flash空间管理方案以保证坏块不被读写,提高数据读写的可靠性。
用FPGA直接管理Flash不仅是一种可行的方案,而且还能精简硬件结构。但与具有专用Flash接口的MCU或ARM等高档嵌入式微处理器不同,FPGA不能通过简单的读写指令编程管理Flash,而必须按照时序要求对Flash的端口进行指令和参数的具体操作。若FPGA的主状态机直接管理Flash,将会使状态机的状态数量大量增加,代码将异常复杂,甚至无法完成设计。
为解决上述问题,本文设计了一个Flash控制器controller_4G08,它建立了自己的指令集,可以方便地实现FPGA对Flash的控制和读写操作。FPGA主状态机可以在系统时钟频率下对controller_4G08发送指令,然后等待controller_4G08返回的中断,中断返回即表示操作完成,无需关心Flash要求的操作时序。采用这个控制器将大大简化FPGA主状态机的状态数量,方便设计和调试,同时代码具有很强的可移植性。
1 controller_4G08的设计方案
理论上讲FPGA可以直接对Flash操作,但这样会使主状态机状态很多,程序繁琐,当需要大批量数据反复读写时很不方便。本文设计了一个控制器controller_4G08,用这个控制器完成数据指令读写的时序操作。
用controller_4G08管理Flash的系统框图如图1所示。FPGA部分有2个模块:主状态机和controller_4G08,它们之间的端口连接包括4 bit指令端口cmd_code_4G08、8 bit数据输入输出端口data_in_4G08与 data_out_4G08、中断信号int_ctl_4G08;FPGA对K9F4G08芯片接口包括8 bit双向数据端口data_4G08、忙标志rb、读使能we、写使能re等端口。FPGA主状态机若想对Flash进行操作,只需要通过cmd_code_4G08向controller_4G08发指令,按照系统时钟通过data_in_4G08与 data_out_4G08收发数据,然后controller_4G08会对K9F4G08执行相应的操作,指令执行完之后会通过int_ctl_4G08给主状态机一个中断信号,告诉主状态机执行完毕。FPGA主状态机不必关注Flash指令操作的时序问题,从而使设计简化。
2 controller_4G08的指令集
K9F4G08具有自己的指令集,以读操作为例,其操作过程是:首先发送命令00h,再发5个周期地址,最后发送命令30h。Flash开始读相应的页,此时rb信号为低(表示Flash处于busy状态),等到rb信号为高,再按照时序改变读使能信号,便可将1个页的数据依次读出。
controller_4G08根据K9F4G08的指令集建立了自己的指令集,新增了全擦、部分擦指令,并且在读写指令前加入了坏块匹配功能,如表1所示。
2.1 匹配表
Flash出厂后可能存在坏块,使用中也有可能会再出现新的坏块。制造商保证每个芯片中的坏块不多于80个,同时保证第0个块肯定是好的,且保证擦写1 000次不坏。当进行连续地址的数据读写时有可能遇到坏块,坏块无法进行操作,会导致数据的丢失。因此必须建立一个匹配表,当遇到坏块时,将其匹配到好块的地址上。
实际的数据读写中只使用4 000个块,根据这些要求设计了这样的匹配表:长度512 B,存放在第0个块的第0个页(B0P0)。具体内容见表2。
一个块的地址用2 B的16进制数表示。256 B可以存储128个块地址。0"255与256"512中存储的块地址是一一对应的,当使用到0"255中的块地址时,需要从256"511中寻找对应的块地址进行替换。
在FPGA中生成一个512 B的ram:ram_512,专门用于存放匹配表,当系统上电复位后,状态机会自动将B0P0的数据读出,并将前512 B的数据存入该ram_512中,以便后面匹配时使用。
2.2 全擦与部分擦指令
该指令用于擦除所有的块,建立新的匹配表。由于坏块会导致擦除不成功,状态机在擦除过程中会记录下1"4 000个块中擦除失败的坏块的地址、4 000"4 095个块中好块的地址,先按照匹配表规定的顺序写入ram_512,全部擦除完成后将ram_512中的数据写入B0P0。由于数据量不足2 KB,因此后面补零。其流程图如图2所示。
部分擦除与全擦类似,执行这条指令需要给定起始与结尾的块地址,controller_4G08可以完成对2个块地址之间所有块的擦除。当擦除过程中擦到坏块时,状态机会从匹配表中寻找该坏块对应的好块,并擦除。若没有寻找到该坏块的匹配块,则出现了新的坏块,会产生一个报错的标志位,提示主状态机需要进行全擦,以便建立新的匹配表。
2.3 读写匹配
如果遇到坏块,会造成读写失败,为了满足大批量数据读写的连续性,在读写数据之前必须对当前块地址进行匹配,这些工作由controller_4G08完成,当主状态机给controller_4G08发送块地址后就会执行。
Flash读写是对页操作的,一次2 KB。FPGA中有一个4 KB的ram:ram_4096,用来作为缓冲区存放数据。当需要向Flash中写入数据时,主状态机向controller_4G08发Page_program指令,发送5 B地址,controller_4G08会自动进行块地址匹配,匹配完之后会给主状态机一个中断信号,主状态机收到这个信号便开始将ram_4096中的数据发给controller_4G08,之后等待中断,收到中断说明写指令执行成功。
当需要读取数据时,主状态机向controller_4G08发Page_read指令,发送5字节地址,controller_4G08会自动进行块地址匹配及Flash的页读操作,等中断一到便开始接收来自controller_4G08的数据并存至ram_4096中。
controller_4G08中有一个存放上次块地址的寄存器,每次进行读写操作时,会将当前块地址与上次的块地址进行比较,若相同则说明是好块,可以读写;若不同则需要进行匹配。状态机会从ram_512中寻找该块是否为坏块,进行一系列处理。与擦除指令一样,当读写操作遇到新的坏块时,也会向系统报错。匹配流程图如图3所示。
- 基于FPGA的片上系统的无线保密通信终端(02-16)
- 基于Virtex-5 FPGA设计Gbps无线通信基站(05-12)
- 基于FPGA的DVI/HDMI接口实现(05-13)
- 基于ARM的嵌入式系统中从串配置FPGA的实现(06-09)
- 采用EEPROM对大容量FPGA芯片数据实现串行加载(03-18)
- 赛灵思:可编程逻辑不仅已是大势所趋,而且势不可挡(07-24)