中图分类号:TP274 文献标识码:A 文章编号:1671-7597(2014)07-0029-03
PCI Express总线是一种完全不同于过去PCI总线的一种全新总线规范,与PCI总线共享并行架构相比,PCI Express总线是一种点对点串行连接的设备连接方式,点对点意味着每一个PCI Express设备都拥有自己独立的数据连接,各个设备之间并发的数据传输互不影响,而对于过去PCI那种共享总线方式,PCI总线上只能有一个设备进行通信,一旦PCI总线上挂接的设备增多,每个设备的实际传输速率就会下降,性能得不到保证。PCI Express总线利用串行连接特点,能轻松的将数据传输速度提到一个很高的频率,远远超出PCI总线的传输速率。
PCI Express是一种复杂的协议,它的实现可以采用专用的协议芯片,但是缺乏灵活性和可配置性,限制了系统整体性能。另一种方式是采用FPGA逻辑来实现,PCIE IP硬核一般只实现PCIE的物理层和数据链路层的协议,设计者可以在IP硬核基础上完成PCIE的TLP(数据传输层)和应用层协议,虽然开发过程较复杂,但可根据应用需要进行灵活的配置,具有良好的可移植性,能更好的发挥PCIE高带宽的优势。
Xilinx公司的Virtex 5系列FPGA芯片内嵌PCI Express Endpoint Block硬核,为实现单片可配置PCI Expres总线解决方案提供了可能。本文在研究PCI Express 接口协议和PCI Express Endpoint Block硬核的基础上,使用Virtex5 LX330T FPGA芯片设计PCI Express接口硬件电路,实现PCI Express数据传输。
1 PCIE接口Burst读写设计
1)FPGA内置PCIe硬核特点。在接口电路中,PCI Express物理层和数据链路层的电路采用Xilinx公司的PCI Express Endpoint Block plus v1.9硬核端点模块实现,能够有效完成接口物理层和数据链路层的数据处理功能,提供给上层一个事务层数据接口。
图1 设计流程图
上层电路主要由4部分电路构成,分别是核配置与辅助控制模块、数据发送控制器、数据接收控制器、BAR地址空间管理,如图1所示,最终通过BAR地址空间与用户逻辑进行交互。
各个部分的作用如下。
①Endpoint for PCIe:FPGA内的硬核,对外负责与其他PCIe设备协议通信对内与TX、RX模块进行64bit并行与高速串行的转换。
②PIO_TO_CTRL:PCIe核配置与辅助控制。
③EP_RX:负责主机单字读写FPGA的状态机实现和Burst模式下写操作的数据接收。
④EP_TX:负责主机单字读FPGA的状态机实现和Burst模式下读操作的数据发送。
⑤EP_MEM:映射为PCIe空间的几个BAR地址空间,将电子盘控制寄存器映射到闪存阵列主控,将数据区映射到双口数据缓冲区控制器。
由于PCIe核只支持单字访问的模式,所以需要修改数据接收控制器EP_RX、数据发送控制器EP_TX、BAR地址空间管理模块EP_MEM,实现对Burst访问模式的支持。
2)TLP数据包结构。当处理器或者其他PCIe设备访问PCIe设备时,所传送的数据报文首先通过事务层被封装为一个或者多个TLP数据包,之后才能通过PCIe总线的各个层次发送出去。TLP的基本格式如图2所示。
图2 TLP的基本格式
一个完整的TLP由1个或者多个TLP前缀、TLP头、数据有效负载和摘要组成。在整个数据报文中,只有TLP头和数据有效负载需要由用户逻辑代码来完成,其他部分都是PCIe核自动生成的。
TLP头是TLP最重要的标志,包含了当前TLP的总线事物类型、路由信息等一系列信息。本文主要涉及到存储器写和存储器读事务。对于32bit地址空间的存储器读写请求,其TLP头格式如图3所示,硬核同时也支持64bit地址空间的操作。请求者通过填写TLP头内的正确信息以及地址并且将数据放在TLP头的后面发送给接收者,接收者便会解析包内的信息将正
图3 存储器读写请求报文头格式
确的数据放到自己的地址空间中。
对于存储器写请求,EP_RX控制器接收到TLP头和数据之后,只需要通过EP_MEM模块将数据存入寄存器或者双口缓冲区中
即可。
对于存储器读请求,EP_RX控制器接收读请求之后,需要启动EP_TX控制器将应答数据组织在TLP完成报文中,完成读操作。完成报文的头格式如图4所示。
图4 完成报文头格式
3)Burst写操作的设计与实现。PCIe硬核的PIO模块本身已经支持32bit地址空间的单字存储器读写请求、64bit地址空间的单字存储器读写请求和IO读写请求。本设计主要完成对32bit地址空间Burst方式的存储器读写请求的支持。同时,考虑到实际应用中DMA控制器一般只支持数据8字节对齐的情况,所以本设计也只支持数据8字节对齐的Burst读写访问。
对于存储器写请求,实现的主要方法是EP_RX将接收的TLP头中各个字段正确解析,并区分是单字写和Burst写,确定写操作的数据长度,如果是单字写,就将接下来的64位数据存入寄存器或者双口缓冲区中;如果是Burst写,就将数据按照64位写入双口缓冲区中,每个时钟周期,地址自动增加,直到数据全部写入双口缓冲区中。EP_RX控制器的状态机如图5所示。
图5 EP_RX控制器状态机
图6 EP_TX控制器状态机
4)Burst读操作的设计与实现。对于存储器读请求,EP_RX控制器对接收到的TLP进行解析,将请求数据的起始地址和长度发送给EP_TX控制器,然后启动EP_TX完成数据传递。EP_RX控制器的状态机如图6所示。
在PCIe总线中,一个存储器读请求TLP可能收到目标设备发出的多个完成报文后,才能完成一次存储器读操作。因为在PCIe总线中,一个存储器读请求最多可以请求4KB大小的数据报文,而目标设备可能会使用多个存储器读完成TLP才能将数据传递完毕。
在PCIe设备的配置空间中,Link Control寄存器的RCB(Read Completion Boundary)位决定了读完成报文的边界,本文设计为64B。当读请求跨越了RCB边界时,需要分多个完成报文才能将数据传递完毕。
EP_TX收到完全请求,判断是不带有效载荷的完成报文,还是带有效载荷的完成报文。如果是需要带有效载荷,并且长度大于4个字节的情况就启动Burst读周期。
Burst读周期先进行合法性检查,对于起始地址或者请求长度不是8字节对齐的请求视为无效请求,不予响应。
对于合法读请求,EP_TX控制器按RCB边界进行完成周期拆
分,具体的算法流程如图7所示。
①对于数据同一个RCB边界之内的读请求,第一个周期完成所有数据传递。
②对于数据跨RCB边界的读请求,按RCB区段划分读写周期,先完成第一个周期,使得剩余数据的起始地址按64字节对齐;接下来每个周期传递64字节,直到数据传递结束;最后一个周期可能不满64字节。
图7 读完成的拆分算法
2 结果与验证
在完成FPGA的程序编写后,用Modlesim仿真环境对程序进行仿真。用VHDL实现TestBench作为激励加载单元对EP_RX和EP_TX控制器进行功能仿真验证。在实践中进一步使用ChipScrop抓图,主要分析由通过EP_RX和EP_TX控制器产生的PCIe总线传输信号时序是否满足要求。
图8捕获了Burst的写过程,由波形可以看出,EP_RX控制器正确解析Burst写数据报文,并成功写入双口缓冲区中。
图8 Burst写时序
读操作的过程相对复杂,图9捕获了Burst读过程,EP_RX控制器接收到读请求后启动EP_TX控制器,EP_TX控制器将主机端发起的一个存储器读请求分成多个存储器读完成报文进行数据传输。
图9 Burst读时序
经实验测试,如表1所示,采用Burst方式的数据传输,速度明显提高,有效提高了大容量存储系统的传输带宽。
参考文献
[1]PCI Express Base Spec ification, 1. 0a ed[S].PC I SIG,2003.
[2]Xilinx.LogiCORE? Endpoint v3.6 for PCI Express User Guide[M].October 10,2007.
[3]马鸣锦,朱剑冰.PCI、PCI-X和PCI Express的原理及体系结构[M].北京:清华大学出版社,2007.
[4]李木国,黄影,刘于之.基于FPGA的PCIe总线接口的DMA传输设计[J].计算机测量与控制,2013(01).
[5]沈辉,张萍.FPGA在PCI Express总线接口中的应用[J].现代电子技术,2010(14).
[6]汪精华,胡善清.基于FPGA实现的PCIE协议的DMA读写模块[J].微计算信息,2010,26(10).
作者简介
张锐(1982-),女,陕西西安人,工程师,研究生,研究方向:计算机硬件设计。