基于SDXC卡阵列的高速大容量存储器设计
2021-07-16潘明海张艳睛
胥 伟,潘明海,张艳睛
(南京航空航天大学电子信息工程学院,江苏 南京 211100)
由于雷达侦测场景的复杂和不确定性,为了更好地对雷达回波信号进行特征识别与分选,拟从时域、频域和变换域提取目标数据的多维度特征,为目标与干扰认知辨识、参数估计提供特征支持[1-3]。
对于实时性要求较高的场景,DRFM 系统对雷达回波信号进行采集,并由FPGA 进行低维度的快速计算,完成粗略的特征提取;对于实时性要求不高的场景,通过DRFM 系统对回波信号进行大量数据的采集并存储在高速大容量的存储器中,待需要时通过CPCI 接口上传至计算机处理,此时更注重时域、频域和变换域等细微特征提取。根据场景实际需求,完成两种方式下参数特征的提取[4],二者互补。
非实时性处理时对存储器的容量、速度等方面都有较高的要求,由于DRFM 系统平台上采用的存储介质是一片4GB 存储容量的DDR3,存储容量难以满足现实的需求,且存储的数据具有掉电易失性,不便于进行大容量数据的长期存储分析[5]。相比于DDR3,SDXC 卡存储介质的容量大、体积小、功耗低、速度快、接口简单且具有非易失性,本文结合SDXC 卡的优势并针对非实时性数据处理时DRFM对存储器性能的要求,设计了一款基于SDXC 阵列的高速大容量的存储器[6]。
1 系统硬件结构设计
1.1 高速大容量电路整体设计
高速大容量的存储电路主要是在PC 机的控制下,在某型号工业控制计算机内实现与DRFM 硬件平台进行数据交换。根据DRFM 系统内数据运算与存储的要求,存储器的设计需要满足:(1)存储容量不小于1TB;(2)读取速率不低于200 MB/s;(3)CPCI 6U 标准板卡尺寸233.5 mm×80 mm。系统结构组成的总体框图如图1 所示,控制器采用的是一片型号为XC6SLX100 的Spartan-6 Family FPGA 芯片,它拥有10 万个逻辑单元、180 个DSP、600 kB 的RAM资源、326 个可编程IO 管脚、工作频率500 MHz,足以满足本设计的需要。通过FPGA 实现对10 个通道的SD 卡进行读写操作和数据处理,并且实现与DRFM系统中的Virtex-5 和Virtex-7 FPGA 分别通过32 位LVDS 线和8 位LVDS 线进行数据交换。
图1 高速大容量存储器系统结构框图
1.2 SD 卡接口设计
SD 卡通讯协议分为SD 模式和SPI 模式。SPI模式是传统四线模式,只有一根数据线,读写速率较慢[7],不能满足本系统高速的设计要求。所以本设计采用4 根并行数据传输线的SD 模式,此模式下能实现更快的读写速率,并且通过六根信号线与主控器通信,包括一根时钟线(CLK)、一根命令线(CMD)、四条数据线(D3~D0)[8]。SD 模式下,除时钟线外,其余信号线都为双向传输,因此必须严格控制其传输方向的时序。
1.3 PCB 层叠与阻抗设计
存储器在高速环境下工作时,对信号线阻抗要求很高,阻抗设计不合理会很大程度上影响电路的性能,严重时甚至会导致电路失效。而合理的层叠设计在简化布局布线的同时,能够更好地控制信号线特性阻抗。层叠设计时,电源层和地层尽可能完整,使得信号层能有很好的回流路径;信号层尽可能与接地层相邻,电源层尽可能与接地层配对,使得信号层产生的辐射能一定程度上屏蔽;信号层相邻有参考平面,从而得到更好的信号完整性[9]。阻抗设计时,高速信号线需要阻抗匹配以减少信号反射,提高信号线的质量。
本设计在综合考虑PCB 设计原则和阻抗要求后,最终采用8 层的层叠设计,其中5 层为信号层,1 层为电源层,2 层为地层,信号线阻抗设计为单端50 Ω、差分100 Ω,并由专业阻抗计算软件Polar Si9000 计算,具体层叠结构和信号线阻抗如表1 所示。
表1 PCB 层叠结构与阻抗
2 SD 总线接口的FPGA 实现
主控器FPGA 通过SD 总线与SD 卡进行数据交换,如图2 所示,包括命令交互和数据交互。命令交互时主要包括命令的发送、响应以及命令的CRC7 校验,数据交换主要包括数据的读、写以及数据的CRC16 校验。
图2 SD 总线接口
2.1 CRC 校验
CRC(Cyclic Redundancy Check,循环冗余校验)是检测信息传输是否有误,m位校验码是由信息码除以m+1 位的生成多项式得到的余数,并将其紧跟信息码发送。接收端将接收数据同样除以m+1 位生成多项式,若余数为0,则无误码,否则中断信息传输。
SD 卡的命令交互采用7 位的CRC 校验码,即CRC7,其生成多项式如式(1)。
CRC7 校验方式如图3,寄存器初始值为0,将CRC[6]与输入数据异或,并将异或值分别赋值给CRC[0]、同时与CRC[2]异或。最后1 位输入数据操作完成后,7 位寄存器中的数值即为CRC7 校验码[10]。
图3 CRC7 校验方式
数据交互采用的是16 位的CRC 校验码,即CRC16,其生成多项式如式(2)。其校验原理与CRC7 相同。
2.2 命令与数据交互
SD 总线的命令交互过程是FPGA 将共48 位的起始标识位、传输方向标识、命令索引、命令参数、CRC7 校验码和结束标识位通过CMD 线串行发送给SD 卡,SD 卡接收到命令后会对命令进行校验,校验无误会再通过CMD 线反馈响应信号给FPGA,如果有误,则中断操作。FPGA 接收到响应后,根据响应信号中SD 卡的状态进行下一步操作。
SD 总线的数据交互以数据块为单位进行数据传输,每个数据块默认固定为512 字节,支持单数据块或多数据块的读写。当FPGA 发出单数据块或者多数据块读写命令,在得到SD 卡正确的响应信号后,FPGA 通过使用四条数据线进行数据传输,每条数据线都会进行单独的CRC16 校验,若校验码错误,则中断操作,此次读写失败[11]。
3 SD 卡读写
3.1 SD 卡工作流程
SD 卡的上电以后主要进行初始化、写操作或读操作这三个步骤。初始化阶段和读写阶段是在不同时钟频率下完成的,其频率是100 MHz 的晶振经过时钟管理模块分频得来,读写时钟直接影响SD 卡读写速度,但是在不同的读写模式下,读写频率会有理论值上限。
SD 卡上电以后需要初始化以完成SD 卡内部的初始化寄存器设置工作,主要流程如图4,主要包括卡的复位、工作电压验证、获取SD 卡的RCA 地址、CID 值等。SD 卡初始化时钟在100 kHz~400 kHz 之间,时钟频率太快可能导致初始化的失败[12]。
图4 SD 卡初始化
SD 卡初始化完成以后进入数据传输状态,如图5,在此状态下可以先进行数据位宽转换,使其工作在4 bit SD 模式下,提高读写速率,再通过带有读写地址的命令CMD18、CMD25 进行多数据块的读写,或者CMD17、CMD24 进行单数据块的读写,单数据块读写是多数据块读写的一个特例,本文不予讨论。当数据读写完成以后发送CMD12 命令结束读写操作[13]。并重新回到数据传输状态。
图5 SD 卡数据传输
3.2 SD 卡多数据块读写
多数据块读操作如图6 所示,SD 卡接收到包含32 bit 的读数据目标地址的命令CMD18,并将数据从内存搬移至内部缓冲区,搬移完成后发送给FPGA。FPGA 检测到数据起始位后开始接收数据并进行CRC 校验,若检验出错,则中断读过程,否则重复读取直到完成所有数据块的读取,并以CMD12命令结束读操作。
图6 SD 卡多数据块读操作
多数据块写操作如图7 所示,SD 卡接收到包含32 bit 的写数据目标地址的命令CMD25,并发送正确的响应给FPGA 后,SD 卡开始接收FPGA 发出的起始位、数据流、CRC16 校验码以及结束位,并对512 字节数据流进行CRC 校验,若校验不成功则中断,否则SD 卡会将数据搬移至内存做存储。重复操作直到完成所有数据的写入,并以CMD12 命令结束写操作。
图7 SD 卡多数据块写操作
4 SDXC 阵列读写数据同步
本系统高速大容量的设计指标,无法采用单片SD 实现,故采用多片SD 卡并联,组成SD 卡阵列,用面积换得更大的读取速度和存储容量。本系统并联的SD 卡阵列为了充分发挥并联的优势,每一片SD 卡采用单独的SD 总线与FPGA 主控器连接,而不是使用同一个SD 总线,SD 总线拓扑如图1。
在SD 卡阵列中,多片SD 卡数据同步是一个关键问题。数据存储时,将AD 采样的数据最终转换为6 路4 位的数据块,如图8,并将其在发送给准备好写数据的SD 卡阵列,需要FPGA 采用fifo 实现数据的缓存以及格式的转换,并严格控制数据的分流,充分发挥存储器的速度和容量。
图8 存储数据转换
数据读取时,数据不同步会使数据格式转换产生错位,造成乱码出现。理想情况下,在同一工作时钟下的SD 卡读取数据应该完全同步,但是实际设计时,每片SD 卡的传输线长度以及SD 卡制造工艺的细小差异,导致在高速读取时,SD 卡阵列读取数据无法同步。读取数据不同步可使用异步fifo 进行跨时钟域的转换,解决读取数据同步问题。
5 实验测试结果
本存储电路在综合考虑了存储容量、读取速度以及电路尺寸限制等综合因素,最终在电路上设计了10 个SD 卡座,最多可以实现10 片SD 卡并联,硬件设计平台如图9 所示。进行系统性能测试时同时使用了6 片容量为256 GB 的SDXC 卡。
图9 高速大容量存储器硬件设计平台
5.1 存储器读写误码率测试
存储器在进行读取数据误码率测试时并没有使用ADC 采样的数据,而是由FPGA 内部ROM 里面预先存放的数据作为数据源,这样可方便将存储器读取的数据与数据源做对比,分析误码率等情况。实测时,在ROM 里面存储了12 288 字节的伪随机码数据[14],由于外围电路的限制,使用80 MHz 的时钟读取写入SD 卡阵列中的数据,并通过chipscope抓取,如图10 所示。将读出数据与写入数据进行对比发现,本存储器数据传输可靠且无误码。但是由于每一片SDXC 卡数据传输线长度以及制造性能细小差异的缘故,导致SDXC 卡阵列读出的数据出现了不同步的情况。
图10 多路不同步数据读取
将读出数据先经过异步fifo 缓存256 字节的数据,再用同一个控制信号在同一个时钟下将数据从fifo 读出,如图11 所示,经过缓存后的数据已经同步。
图11 多路同步数据读取
5.2 大容量存储器硬件系统性能测试
存储器硬件性能测试时采用信号源输出100 MHz 的点频作为测试信号,测试系统平台如图12所示。
图12 系统测试平台
DRFM 系统在PC 机的控制下触发信号采集命令后ADC 器件开始采集输入信号数据。ADC 完成12 288 字节数据采集以后通过32 位LVDS 差分线存入高速大容量的存储器,等待PC 机再次下发信号重构命令后,读取采集的数据并发送给FPGA Virtex-5,FPGA 再通过CPCI 总线将数据回传给计算机处理,并进行频谱分析如图13,从频域可轻松提取输入信号的频率、杂散等信息。
图13 计算机目标信号参数分析
6 结论
经过实际测试可得,本文设计基于SDXC 卡阵列的高速大容量存储器系统稳定可靠,存储容量可达1.5 TB,并且读取速率可达234.43 MB/s,完全满足DRFM 系统对存储容量和速度的要求。此外,本设计最多可扩容10 片SDXC 卡阵列,实现更大的存储容量和读取速度。同时,本设计预留了64 位的IO 接口,因此具有很强的移植性。鉴于SDXC 卡是一种大容量、低成本的高速便捷式存储设备,接口数据量少,可广泛应用于工业、消费类电子产品等,移植性很强,故本设计具有切实的工程应用价值。