摘 要:大容量存储系统是高速数据采集和其他应用中非常重要的一个组成部分,主要包括存储器控制和数据存储。本文通过使用FPGA(现场可编程门阵列) 成功地实现了数据采集过程中相对低速的Flash存储器对高速和超高速实时数据的存储。FPGA 既可作为高速输入数据传输到Flash 中间的缓存,又可实现对存储器的读写、擦除等操作时序的控制。该设计已在应用电路中得到了验证。文章最后给出了所测电路板在逻辑分析仪上观察的数据和仿真的部分结果。
关键词:固态存储系统;FPGA;高速实时数据
引言
在雷达接收系统中,常常要将采集到的高速实时数据及时地保存到存储器中以便作后续计算机处理。通常,数据采集中使用EPP 口(增强型并行端口) 、PCI 接口(周边元件扩展接口) 、SCSI 接口(小型计算机系统接口) 和USB (通用串行总线)接口等方式将数据保存在计算机磁盘中。低速的数据采集中多采用计算机EPP 口,它的传输速率仅为500kbit/s~2MByte/s ;而PCI和SCSI 接口受硬盘速度的影响也只能达到几十MByte/s ;USB 接口传输速率相对较高,在2. 0 协议时峰值速率为400Mbit/s ,然而当输入数据为16位时,也仅有25Mbit/s ,且需在硬件平台上增加USB控制器,这样进一步提高传输速率就受到较大的限制。现在的雷达接收系统,其数据采集的A/D 变换都在12位或14位, 采样速率也可能达到100MByte/s或更高,因此亟需研究如何存储这些高速高精度数据。一种方法是先将高速数据存储在一个大容量存储器中,然后慢速读入计算机进行处理。为了保证数据的高可靠性,一些专用的高速数据采集系统采用了磁盘阵列,它具有大容量高速率的特点,但其价格昂贵,成本太高。基于以上原因,本文中作者采用了Samsung公司的高速大容量固态存储芯片K9K1208U0A Flash Memory(闪存) ,其容量为64M×8bit,并通过Altera公司的Cyclone系列FPGA作为控制和缓冲,完成了高速实时大容量数据的存储,单块存储板容量为1GByte ,可根据需要使用多块板子,很好地满足了工程需求。同时,由于整个系统仅由一片FPGA通过计算机EPP口进行简单的控制,因而大大简化了电路板的设计,提高了设计的灵活性。 Flash Memory 简介
K9K1208U0A是64M×8bit的NAND(“与非”门) Flash芯片,同时还附加了2k×8bit的容量。其NAND 单元提供了大容量固态盘经济有效的解决方案。外部仅有8 个I/O (输入/输出)管脚,既是地址和数据输入输出的端口,也是命令输入的端口,因而大大节约了芯片的管脚。片内的写控制器使所有的编程和擦除操作得以自动进行,这些自动的操作还包括必要的脉冲重复操作、数据的内部校验以及增加容限操作。片内包含一个页(512+16字节)寄存器,读写过程中它均是将存储单元数据或外部数据先缓存到页寄存器中,然后读出数据或仅写入一个字节的编程命令就自动将页寄存器内容写到存储单元中去。因此,它是基于页进行读写,基于块来擦除存储单元的。当然,它也可支持随机读写。这样既简化了用户的操作,也提高了存储速度。由于K9K1208U0A仅有8 个I/O管脚, 命令、地址和数据是通过分时复用来完成不同操作的,通过控制信号来区分命令和地址。其一般操作过程为
1) 写入命令,通知K9 K1208U0A 要完成哪种操作(读、写、擦除等) ;
2) 写入地址,即写入要读写或擦除的起始地址;
3) 写入数据或读数据;
4 ) 如果是编程或擦除,还需写入确认命令,这样K9K1208U0A 才会启动操作。
K9K1208U0A 的其他主要特性如下:
a 528 字节的页读操作时间
随机访问:10μs (最大)
连续页访问:60ns/Byte (最小)
b 快速写周期时间
编程时间:200μs (典型值)
块擦除时间:2ms (典型值)
c 硬件数据保护
电源转换期间封锁编程/擦除操作 系统设计
本文所设计的高速大容量存储系统采用了一片Cyclone系列的EP1C12 ,它既作为控制器来产生所需的逻辑和时序,又作为输入数据的缓存,实现数据格式的转换,充分体现了FPGA设计灵活、功能强大的特点;最后通过计算机EPP口实现人与系统的通信。该系统的组成框图如图1 所示,主要由输入接口、控制模块、计算机EPP 口和Flash存储阵列组成。
图中的无效块检查、时序、逻辑控制和缓冲FIFO模块由一片FPGA 芯片EP1C12来完成。16片K9K1208U0A组成了Flash存储阵列。从输入接口进来的数据总线、Flash 存储阵列的双向地址数据总线和控制状态总线、计算机EPP口的双向数据地址复用总线和控制状态总线都相连在FPGA的用户I/O管脚上,大大简化了硬件电路。对整个系统的控制及读数据用C 语言对计算机EPP 口编程来完成。计算机发出读无效块信息、编程、读、擦除等命令(表1 是自定义的EPP 口输出命令及其描述) 后, FPGA 控制进行相应的操作。由于所采用的Flash 数据地址复用线为8 位,因此将两片K9K1208U0A 并联作为一组来实现16 位数据的写入,这样既提高了数据的传输速率,也简化了对Flash 控制信号的管理。最重要的是在写数据到Flash 时8 组Flash并行工作,从而大大提高了传输速率,与外部输入数据速率得到了匹配。
FPGA 内部无效块检查和缓冲FIFO 的实现
所选Samsung 的Flash 芯片在出厂时就可能存在无效块,使用过程中也可能产生无效块,因此必须在对Flash 读写和擦除之前对Flash 进行无效块检查。设计时在FPGA 中建立8 个4096×1位的RAM ,用来存放无效块信息。在每次加电进行读、写数据或块擦除之前,应先从Flash 的专用无效块信息单元中读取无效块信息,将读取的块无效信息存入到RAM 相应单元(RAM 中的地址对应Flash 的块号,RAM 单元内容为“1”表示此块正常, “0”表示此块无效) ,然后在后续读写及擦除过程中利用这些信息来保证操作的可靠性。
在读写或擦除完一个块后接着进行下一块的操作时,需先读取RAM 中要操作块的相应无效、有效信息,若下一块为有效块,则接着对下一块进行操作;若下一块为无效块,则需先屏蔽掉无效块,再读取后续块的有效、无效信息,直至下一块为有效为止。8 组Flash 是基于页来读写的, 因此利用EP1C12 内部的M4 K存储块设置了8 组FIFO(每组2 个512 字节的FIFO) ,对应外部的8 组Flash ,512 字节的FIFO 刚好对应Flash 的一页。当外部高速数据输入FPGA 后,数据先保存在FIFO 中,等存完整页后将此页数据送到Flash 的页寄存器中。
FPGA 的第一组FIFO 向第一组Flash 送出数据时,外部不断进来的数据依次放入第二组,第三组,第四组,直到第八组FIFO 中,然后再次写到第一组中去。这样, 只要保证再次写入第一组FIFO 时第一组Flash 已将整页内容写入Flash 存储单元即可。可以看出,向8 组Flash 写入数据是同时进行的,通过这种并行的写操作,数据的传输速率可达到很高的水平。由前面介绍可知,对一页数据编程需时20μs ,再加上一页数据从FPGA到Flash 页寄存器的时间31.08μs (60ns×(512+6)= 3108μs ,式中60 ns 为FPGA 到Flash页寄存器的写周期,512 为一页的字节数,6 为所送出的命令和地址周期数),总共231.08μs,在此期间8组Flash 同时工作,且每组为两片Flash,故外部输入数据速率最高可达到约5MByte/s。如果一块板上放64 片K9K1208U0A并行工作,则可达100MByte/s 的存储速率,容量为4GByte 。图2 给出了FPGA 内部的简单原理框图。
写Flash 过程和时序产生
系统主要靠对FPGA 的编程来实现系统的运作。在计算机EPP 口送给FPGA 无效块检查、编程(写) 、读以及块擦除操作的命令后, FPGA 接到其中任意一个命令就开始进行相应的操作,并产生去Flash 控制管脚的时序。图3 给出了Flash页编程(写) 的时序,在CLE 高电平期间于WE的上升沿写入I/O 线上的命令,接着在AL E 高电平期间写入要写入的存储页起始地址,然后输送数据。当一页写满后给出编程确认命令(此时CLE同样需有效) , Flash内部控制器接收到此命令后就将页寄存器的内容写到所指定的页存储单元中去。下面即为系统的存储步骤:
(1) 计算机发送读无效块信息命令FEh , FPGA 从Flash 中读取无效块信息(仅需向FPGA 写入相应命令即可由FPGA 完成相应操作) 。
(2) 发送页编程命令FBh ,外部数据到来后被依次写入8 组FIFO 中,16 位输入数据中的低8 位对应于每组FIFO 的FIFO (a),高8 位对应于FIFO(b) ,8 组FIFO级联在一起,由“写允许”控制某时刻写入的是哪组FIFO。当第一组FIFO 写满后,外部输入数据开始写入第二、第三组FIFO,这时“逻辑、时序电路”开始送给第一组Flash 控制管脚相应的时序,将编程命令和地址送往Flash 的I/O 总线上,随后第一组FIFO 中的数据依次被写到Flash 的I/O 总线上。待整页写完后发送编程确认命令( Flash 对各种操作都有专用命令) , Flash接收到此命令后开始自动将页寄存器的内容写到相应的地址单元中去。然后等待下一页数据的写入。其他组的工作过程与上述相同。由于知道了写周期twc 和页编程时间后可确定命令、地址及数据在写一页周期内的具体时间,因此可以一个频率较高的时钟信号为基准,采用计数器原理产生出图3 中CLE、ALE、WE、RE等控制信号的时序。
读Flash 数据过程和时序产生
在存储完数据后,可通过EPP 口将其读入计算机以进行后续处理。图4 为读Flash 整页内容的时序。此时,同写过程一样,先送入Flash 命令和地址,接着Flash 内部控制器将所指定的页内容读到页寄存器中,待R/B 变高后在RE下降沿将页寄存器中内容读出。当系统进行读操作时,计算机送出F7h 命令,FPGA 开始送给Flash 专用的读命令、地址和相应时序,在RE下降沿将页寄存器中内容读到FPGA 后再通过EPP 口读命令将数据送到计算机。读过程中,在读完某组Flash 的页n后接着读下组的页n , 因此读回的数据与外部数据进入的顺序完全一致。
读过程中CLE、ALE、WE、RE等控制信号的产生与写过程中控制信号的产生相同。读完后应对Flash 进行擦除,以便为下次数据的写入做好准备。在读取和擦除过程中,也需要读无效块信息RAM 以判断是否读取该块数据或对此块数据进行擦除,这样就保证了数据的可靠性。设计中使用Altera 公司的QuartusⅡ2.2 环境来实现对FPGA 的编程仿真和配置。整个系统设计文件采用V HDL 语言和块图输入相结合的方式,使本设计既简单又有很大的灵活性。
输入输出接口
A/D 变换后的高速数据进入输入输出接口,经过一组锁存器送到FPGA。计算机EPP口与FPGA 中间有一组驱动器,把命令或控制信号送给FPGA ,并从Flash 经FPGA 读取数据。EPP 口的nWRITE 信号送到驱动器的方向控制管脚,以控制并口数据线上是输入还是输出。
测试和仿真结果
经过QuartusⅡ2.2 中的设计,在编译和仿真成功后对本系统作了调试,调试中用Agilent 公司的1682A 逻辑分析仪作为测试设备。图5 和图6分别是向系统第一组Flash 存储数据过程中应用逻辑分析仪的测试结果和在QuartusⅡ中的仿真结果。仿真和调试过程中给定,数据从FPGA 到Flash 的写周期为100 ns。其中,IO< 15..0 >上前2个周期出现的是编程命令,接下来4 个周期为写入页的起始地址,随后是要写入的数据。命令和地址分别在CL E0 、AL E0 为高时在WE0 的上升沿写入Flash 内部逻辑控制器,数据在WE0 的上升沿写入Flash 的页寄存器。
结论
本文设计的高速大容量固态存储器运用FPGA 内部集成的嵌入式存储块,使得多个低速存储芯片并行工作,大大提高了存储速度。这种设计的硬件电路简单,在大容量高速数据存取电路设计中有一定的参考价值。当多个电路板级联时,可得到更大的存储容量;当多个电路板并联时,可完成多通道数据的存储;而将级联、并联二者结合起来,则可满足不同系统的要求。整个系统简小轻便,适于野外工作环境。目前本设计仍处在初期阶段,对数据的纠错编码以及多个电路板的级联控制等问题尚待进一步研究。 |