2024年1月24日发(作者:)

作者邮箱:***************, 欢迎交流探讨。

基于FPGA的SATA控制器,如图5-1所示,其中SATA协议的应用层由嵌入式处理器PPC440来实现,主要完成硬盘的参数配置和读写操作命令。SATA协议的传输层和链路层是通过硬件描述语言设计在FPGA中生产相应的电路来实现,这两层主要是完成帧的封装,帧的发送、暂停、结束控制,帧的解析和校验。SATA协议的物理层由千兆位级收发器GTX、OOB控制模块和接口传输率选择模块共同实现。千兆位级收发器GTX的主要功能包括8B/10B编码/解码,串并/并串转换,逗点检测,时钟修正,预侧重和线性均衡等。OOB控制模块和接口传输率选择模块能够自动识别硬盘的接口传输率,完成硬盘的上电过程或硬件复位过程,并同SATA控制器建立通信链接。整个SATA协议的四层:物理层、链路层、传输层

、应用层全部在一片FPGA中实现。

PLBPLB2SATAIPPLB_IPIFSend_data_fifoReceived_data_fifoUSER_LOGICNPINPI_CTRLregistersSATA_CONTROLOOB_CTRLSPD_NEG_CTRLRESETGTXRx_n/pTx_n/p

图5-1 SATA控制器

用户接口设计

用户接口由三部分组成:映像寄存器组,PLB接口和NPI接口。映像寄存器组由32个32比特的寄存器组成,用来存放SATA控制器的控制信息和状态信息等,该寄存器组是地址映射的,是软件可以读出、可以写入的。PLB接口实现嵌入式处理器和SATA控制器之间控制信息和状态信息的交换。NPI(Native Port

Interface)接口用于实现储存器控制器和SATA控制器之间数据的交换。

映像寄存器组

应用层提供一个映像寄存器组,处理器传输各种命令时,向映像寄存器中写入命令或读取状态信息,设备通过发送帧来更新映像寄存器,对主机的命令进行响应。

在SATA协议中定义了有关映像寄存器组中寄存器的类型与用途。本设计中寄存器组由32个寄存器组成,其中有5个寄存器是用户自定义的,其余的兼容ATA协议指令集,包括Status、Command、Error、Feature,LBA low等。5个用户自定义的寄存器用于对SATA控制器中某些模块进行复位、观察状态和调试信息以及参数配置等。其余寄存器用于存放SATA_CONTROL的控制信息、状态信息、LBA地址和参数等。寄存器组的一端与PLB总线相连,用于PPC通过PLB读/写寄存器组,另外一端与SATA_CONTROL模块相连,SATA_CONTROL模块通过该端口读/写寄存器组。

PLB接口

PLB 总线是一种高带宽、低延迟、高性能的处理器内部总线,用于连接高性能CPU、高速存储器控制器、仲裁器、高速的DMA控制器等高性能、大宽带的片上设备。PLB总线架构是由IBM开发的,Xilinx公司获得IBM公司的许可,在其产品上使用PLB总线。

由于PLB总线协议信号很多,较为复杂,为了让用户更加方便的使用、加快开发进度,XILINX公司为用户开发了PLB生成向导。该向导自动生成PLB总线与用户逻辑之间的接口,即IPIF(IP Interface)。利用IPIF解决PLB总线接口和用户逻辑接口之间的转换。在用户逻辑看来,PLB接口表现为简单IPIC (IPInterconn-

ect)接口。用户使用该向导还可以根据需要选择相应的模块和功能[57]。

采用PLB总线作为用户接口可以使SATA控制器应用范围更加广泛,用户只需要通过PLB总线对映像寄存器进行配置就可以实现SATA控制器的功能。本设计中PLB总线只是用于传递少量的参数和状态信息,因此,PLB模块配置成了从(slave)设备,以节约FPGA资源。核心模块SLAVE Attachment提供了PLB从设备的基本功能,它在PLB总线和IPIC之间执行协议和时序的转换。

NPI接口

SATA控制器读写的数据都不经过PLB总线,而是通过NPI接口与多端口储存器控制器(MPMC)相连,直接读写存储单元。避免了由于PLB的竞争和冲突导致有效带宽小、利用率低的情况。这样的设计具有很强的实时性,数据传输带宽高。

NPI接口控制器(NPI_CTRL)用于实现NPI接口协议,数据宽度为64位,支持burst工作模式,一次burst读或写最多可以传输256个字节数据,每次burst

之后硬件会自动更新地址,得到下一个burst的起始地址。

发送数据时,NPI接口控制器(NPI_CTRL)根据命令和配置信息从存储单元(DDR2内存条)中指定的起始地址处读取指定数量的数据到发送数据缓冲区(send_data_fifo),然后由SATA控制器将数据发送给硬盘;接收数据时,SATA控制器先将接收的数据写入接收数据缓冲区(received_data_fifo),然后由NPI接口控制器(NPI_CTRL)根据命令和配置信息将数据写入存储单元(DDR2内存条)中指定起始地址处。

SATA控制器的综合与实现

SATA控制器的开发是在XILINX公司的ISE集成开发环境中进行的,版本号为10.1.3。并且使用XILINX公司提供的综合,编译,布局布线等工具完成逻辑电路的生成。SATA控制器(XC5VFX130T)的硬件实现平台选用XILINX公司的FPGA芯片XC5VFX130T- 2FF1738,该芯片的相关信息参见。在XC5VFX130T中实现一个PLB2SATAIP模块的资源占用情况如表5-1所示。

表5-1 PLB2SATAIP在XC5VFX130T中实现的资源占用情况

Logic resources

BUFDSs

BUFGs

DCM_ADVs

GTX_DUALs

RAMB36_EXP

Slice Registers

Flip Flops

Latches

Slice LUTS

Slice LUT-Flip Flop pairs

Used

1

8

2

1

8

2224

2223

1

2611

3530

available

10

32

12

10

298

81920

------

------

81920

81920

utilization

10%

25%

16%

10%

2%

2%

------

------

3%

4%

表5-1-2 PLB2SATAIP在XC5VFX70T中实现的资源占用情况

Slice Logic Utilization:

Number of Slice Registers: 2,902 out of 44,800 6%

Number used as Flip Flops: 2,902

Number of Slice LUTs: 3,097 out of 44,800 6%

Number used as logic: 2,815 out of 44,800 6%

Number using O6 output only: 2,475

Number using O5 output only: 184

Number using O5 and O6: 156

Number used as Memory: 251 out of 13,120 1%

Number used as Shift Register: 251

Number using O6 output only: 250

Number using O5 and O6: 1

Number used as exclusive route-thru: 31

Number of route-thrus: 219 out of 89,600 1%

Number using O6 output only: 215

Number using O5 output only: 4

从表5-1可以看出在XC5VFX130T-2FF1738中实现一个SATA控制器PLB2SATAIP只占用3%左右的Slice资源,所以在该片FPGA中就可以生成多达20个同样的SATA控制器(当产生多个SATA控制器时BUFDSs, BUFGs,

DCM_ADVs资源是可以共用的),这么多的控制器可以并行工作实现阵列式存储。

表5-2是国内外不同研究机构在不同芯片上实现SATA控制器的资源占用情况和接口形式。其中ASICS,Design gateway,HiTech Global三家公司是专业从事IP软核开发和销售的公司。从资源上来看,本人设计的SATA控制器与IP公司设计的SATA控制器是在同一个水平上的。本文设计的SATA控制器具有占用资源少、易升级、适应性广的优点。

表5-2 SATA控制器特性对比表

芯片

XC5VFX130T-2

XC5VFX70T-2

XC5VLX50T-1

XC5VLX50T-2

XC5VLX50T-2

XC4VFX60-10

XC4VFX60

资源Slice

652

725

579

861

1057

1794

3348 AHB 湖南大学

接口形式

PLB+NPI

PLB+NPI

FIFO

Wishbone slave+FIFO

Wishbone slave+FIFO

开发单位

本文

本文

ASICS

Design gateway

HiTech Global

图5-2所示这就是本文采用的“基于直接内存读写的存储架构”。存储数据时,从camlink接口/光纤接口/PCIE接口输入的数据通过MPMC的NPI接口直接写入高速缓存单元缓存,然后由多个SATA控制器以RAID0或RAID1或RAID0+1的方式将缓存的数据写入磁盘阵列;读取数据时,多个SATA控制器

将磁盘阵列中的数据通过NPI接口直接写入高速缓存单元缓存,然后将高速缓存单元中缓存的数据按照存储数据时的顺序依次读出,并通过camlink接口/光纤接口/PCIE接口输出。

存储单元_29多端口存储器控制器组 3SATA控制器组2RocketIO5磁盘阵列10•RAID控制器 1•PLB总线嵌入式处理器6FPGA加载、配置模块11FPGA 0•输入输出模块 4存储器控制器模块7存储单元_18输入/输出

图5-2 存储系统框图

为了更详细、清楚的描述高分辨率图像实时存储系统的工作原理和步骤,固将高分辨率图像实时存储系统中FPGA内的设计具体化,如图5-3所示。其中FPGA选用XILINX公司的XC5VFX130T-2FF1738,XC5VFX130T-2FF1738的结构和特性可以参见XILINX公司提供的技术手册。嵌入式处理器选用XC5VFX130T-2FF1738中内嵌的硬IP核PPC440,存储器控制器模块选用的是软IP核ppc440mc_ddr2,多端口存储器控制器组是由2个软IP核MPMC组成的,分别是MPMC_1和MPMC_2,SATA控制器组是由12个SATA控制器组成的,分别是SATA_ctrl1,SATA_ctrl2,SATA_ctrl12。此外,DDR2内存条1,DDR2内存条2和DDR2内存条3都是容量为512M字节、64位的DDR2内存条。磁盘阵列是由12块SEAGATES公司的硬盘组成(硬盘型号为ST3320418AS)。

DDR2内存条1DDR2内存条2SATA ctrl1SATA ctrl7SATA ctrl2•SATA ctrl3SATA ctrl8•••SATA ctrl9MPMC_1MPMC_2RocketIO

•SATA ctrl4SATA ctrl10•SATA ctrl5SATA ctrl11RocketIO

•SATA ctrl6SATA ctrl12••PCIEcore•PLBmpmc1_NPI0PLBV46EndpointbridgePLBmpmc2_NPI0••ppc440_0•xps_uart16550••RAID控制器•xps_intcPLB串口••xps_ll_FIFO••plb_v46jtagppc_ctrlproc_sys_resetClock_generator光纤接口模块camlink接口模块xps_sysacexps_ll_TEMACppc440mc_ddr2camlink插座xps_systemaceCF 卡网口DDR2内存条3

图5-3 存储系统实例图

实验结果与分析

本文设计的SATA控制器是在XILINX公司的XC5VFX130T-2FF1738芯片上实现的,实验系统如图5-4所示,该实验平台是XILINX公司的ML510开发板(相关资料可以访问网站)。

图5-4 高速存储实验系统照片

实验1:不同帧大小持续顺序读写性能

测试环境:FPGA中构建的存储架构如图5-3中所示,但是对某些模块进行了必要的增减。在图5-3中,嵌入式处理器选用XC5VFX130T-2FF1738中内嵌的硬IP核PPC440,软件代码存储在片上块RAM中,只选用了一个多端口存储器控制器MPMC_1、一个SATA控制器SATA_ctrl1和一个内存条DDR2内存条1。SATA_ctrl1控制一块硬盘,硬盘型号为ST3320418AS,接口传输率为3.0Gbps。

本实验中,嵌入式PPC440设置完硬盘工作模式后,通过PLB总线将有规律的数据(写入有规律的数据主要是为了便于接收时测试数据正误)写入内存条1,对内存条进行初始化,SATA控制器就不断的、循环的读出这些数据作为向硬盘写数据的数据源。SATA控制器作为主设备向目标硬盘的LBA=1开始的扇区顺序写入数据,直到写完硬盘所有扇区,然后从LBA=1开始持续顺序的读回所有数据。

持续读、写带宽等于总的读、写数据量除以总的读、写时间。总的时间是通过对固定频率的时钟计数换算得到的,总的数据量是通过对发送的数据帧计数换算得到的。图5-5和图5-6是数据帧长度为8K时持续顺序读写的性能图。

图5-5 不同硬盘持续顺序读性能图 图5-6 不同硬盘持续顺序写性能图

图5-7 SSD硬盘持续顺序读写性能图

图5-7是使用两款SSD硬盘做的同样的实验。

由图5-7可知,使用SSD硬盘SSDSA2SH064G1和SSDSA2SH032G1时,持续顺序读写带宽分别达到163MB/s和144MB/s。读写性能表现最好的传统机械硬盘ST3500418AS的持续顺序读写带宽分别为132MB/s和127MB/s。使用SSD硬盘比机械硬盘持续顺序读写带宽分别提高了23%和13%。

目前,经过本人的优化后,该SATA控制器在XC5VFX70T上实现,对intel 320系列SSD硬盘的持续顺序读写带宽分别为273MB/s和215MB/s.(硬盘型号:intel solid-stale drive 320 series :300GB容量)该系列硬盘的文档见附件。我可以在xilinx公司的评估板ML507上将硬盘的读写现场演示。

图5-8红线框是SSDSA2SH032G1硬盘网上公测性能指标(你可以自己上网站上查询)。该指标是网上公布的,是在PC机上使用ASIC芯片控制硬盘读写。从测试的数据可以看出,平均写入速度是155.3MB/s,平均读取速度是193.5MB/s.而使用FPGA实现的SATA控制器控制该硬盘读写其平均速度分别为142MB/s和162MB/s。通过比较两者的平均写入速度可以看出,本文设计的SATA控制器性能与PC机上的ASIC芯片的控制性能相当。

图5-8 SSDSA2SH032G1硬盘网上公测性能指标图