基于FPGA的PCIE接口DMA传输设计与实现

2019-04-02 09:31任勇峰杨圣龙李辉景
实验室研究与探索 2019年2期
关键词:寄存器时序差分

任勇峰, 杨圣龙, 李辉景

(中北大学 仪器与电子学院,太原 030051)

0 引 言

高速串行计算机扩展总线标准(Peripheral Component Interconnect Express,PCIE)总线是第三代I/O总线技术,采用了点对点的串行差分传输,每个设备都使用独享的通道带宽,单通道数据传输速率可达2.5 Gb/s[1]。基于PCIE接口设计的数据传输卡具有很强的扩展性,本设计通过低电压差分信号(Low-Voltage Differential Signaling,LVDS)链路作为外设接口,采用PEX8111桥接芯片实现了PCI-to-PCIE的协议转换,以现场可编程门阵列(Field Programmable Gate Array,FPGA)为主控器实现了外设部件互连标准(Peripheral Component Interconnect,PCI)的主从模式和突发读写时序,从而完成了外设接口到PCIE接口总线的数据传输。经多次测试,该传输卡占用中央处理器(Central Processing Unit,CPU)资源较小,且传输数据稳定可靠,可满足高速数据传输需求。

1 系统总体设计

系统总体框图如图1所示,外设接口为LVDS发送和接收电路,在发送端增加了驱动器来提高数据传输能力。数据接收时,LVDS接收模块将数据写入数据缓存队列(First Input First Outpu,FIFO)中,当PCI主模块检测到FIFO非空时,就会通过启动直接内存存取(Direct Memory Access,DMA)方式来进行数据传输,然后将数据通过PCIE总线直接送至计算机内存中,整个数据过程无需CPU直接参与。在启动DMA传输前,CPU把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器立即把总线控制权再交还给CPU。最后上位机将数据从内存中取出存入计算机硬盘内,整个过程大大减小了CPU资源占用率,提高了数据传输速率。

图1 系统总体设计框图

2 PCIE总线接口设计

PCIE-x1总线接口如图2所示,由发送、接收两对差分信号和一对差分时钟对组成,同时支持热拔插和热交换[2]。在PCIE协议中数据是以数据包的形式进行传输,避免了丢数和误码的情况出现[3]。由于每条串行线路的数据传输率为2.5 Gb/s,在印制电路板(Printed Circuit Board,PCB)布线时需要对差分线进行特别处理:金手指到PEX8111芯片布线长度应小于10.16 cm;差分信号线长度要使用蛇形线进行匹配,误差应小于5 mil[4]。同时需要在两对差分信号周围设计参考地平面来减小高速电路信号间的串扰。

图2 PCIE-x1总线接口图

工程应用中实现PCIE接口一种方法可直接使用PCIE硬核进行配置[5],另一种方法可采用桥接芯片来实现。由于使用PCIE专用硬核成本较高,设计采用PEX8111桥接芯片来实现PCIE接口设计。PEX8111是一种PCI-to-PCIE桥接芯片,具备主模式、从模式和 DMA功能,符合PCIE 1.0协议设计规范。利用其前桥模式,无需对原有PCI驱动程序做任何改动即可实现PCI到PCIE协议的过渡。芯片自身可分频产生66.66 MHz时钟,内置DMA双通道,突发传输速率最高可达266 Mb/s;拥有的PCI仲裁器最多可挂载4个PCI主控器,还支持双向透明桥,具有8 KB的共享内存,可供本地总线与PCIE接口访问[6]。图3为PEX8111内部逻辑示意图。

图3 PEX8111内部逻辑示意图

3 PCI总线DMA传输设计

3.1 PCI总线技术

PCI总线接口组成如图4所示,CLK为系统时钟,为所有PCI总线数据传输及总线仲裁提供时序,除RST#外,其他信号均在CLK的上升沿采样[7]。RST#为异步复位信号;A/D信号线为数据及地址复用,支持64位扩展;CBE#信号在地址周期内传送总线命令,在数据周期内为字节使能信号;PAR为A/D和CBE#信号的奇偶校验信号。FRAME#、IRDY#、TRDY#、DEVSEL#4个总线控制信号决定了数据的传输方式和时序[8];REQ#和GNT#为总线仲裁信号,REQ#向仲裁器申请总线使用权,GNT#为仲裁器反馈的允许占用信号。

图4 PCI总线接口

PCI总线支持单一周期传输和突发周期传输,通过FRAME#和IRDY#信号不同时序组合可使单周期传输变为突发传输[9]。在地址期,单周期传输协议和突发传输协议相同;在数据期,主设备准备好接收或传送数据时,将IRDY#置为有效,如果FRAME#在IRDY#有效的同时无效,说明此操作为单一数据传输;如果FRAME#仍有效,则该方式为突发传输方式。

突发传送包括一系列微传送,第一个微传送的地址称基地址,在地址期获得,随后的传送地址将根据这一基地址做相应增加得到[10]。与单周期传输相同,当FRAME#无效而IRDY#有效时,说明突发传输正在进行最后一个周期的数据传送,当FRAME#和IRDY#都无效时传输结束。图5为PCI总线的突发读写时序。

图5 PCI总线突发读写时序

3.2 DMA传输设计与实现

传输卡采用FGPA作为主控器实现了PCI总线的DMA传输,逻辑设计主要由PCI主模式、PCI从模式和数据校验三个模块组成[11]。其中PCI从模式主要负责上电时对PEX8111的进行PCI读写配置以及上位下发的指令转发;PCI主模式主要负责DMA时序的控制;数据校验模块将AD信号和CBE#信号数据进行奇偶校验后输出。分模块编写可使PCI时序设计逻辑更加清晰,各模块关系如图6所示。

图6 PCI时序顶层设计

在进行DMA操作时,PCI设备需要从上位机获取数据传送的目的地址和传送大小,并在其地址空间中设置两个寄存器,分别保存这个目标地址和传送大小[12]。数据下发时,先选中寄存器所在地址,然后再将数值写入寄存器,完成DMA前期准备工作。

PCI总线的DMA传输过程如下:启动DMA时,系统首先通过上位机在计算机内存中开辟512KB的连续内存空间,同时,将中断类型值0x11传入master_reg状态寄存器中;其次,上位机通过调用底层驱动函数,判断出中断类型后,将本次传输字节的大小0x80000下发至count_reg寄存器中,同时将内存空间的起始地址传送至heard_reg寄存器中。由于LVDS解串后为8位数据,所以需要对数据进行拼接后写入32 bit×4096的FIFO中,当FIFO中数据量达到指定阈值时,状态指示prog_empty信号有效。系统在检测到prog_empty信号和master_reg中断状态寄存器同时有效时,FPGA模拟的PCI设备通过REQ#向PEX8111发出总线占用请求,PEX8111中的DMA控制器在收到请求后通过GNT#向FPGA发出总线响应,FPGA模拟的PCI从设备获得本地总线控制权,即可开始DMA数据传输。

当32位AD总线每传输一次数据,count_reg寄存器值减4,heard_reg寄存器的值加4;当count_reg寄存器中的值减为0时,将master_reg状态寄存器复位为0x00,并通过INTA#引脚发出中断信号,说明一次DMA数据传输已经完成。CPU在接收到中断指令后,将内存空间中的512 KB数据取走,同时准备下一次的DMA传输,程序流程如图7所示。

图7 DMA流程图

由于每次启动DMA时计算机系统需要一定的时间响应中断,此时FIFO中的数据量会逐渐积累,所以在每次DMA传输的前一部分时间为突发传输,当FIFO中数据量减至1个时,DMA传输变为单一周期传输。当PEX8111在进行DMA操作时,使用的目的地址不是存储器域的物理地址,而是PCI总线域的物理地址。因为PEX8111使用PCI协议时仅能识别PCI总线域的物理地址,而不能识别存储器域的物理地址[13]。

3.3 PCI主模式状态机

PCI总线时序逻辑由FRAME#、TIDY#、STOP#、IRDY#4个信号控制[14],在FPGA内通过状态机实现[15]。PCI主模块状态机包括空闲状态、读写地址状态、读写数据状态1、读写数据状态2、读写停止状态、读写返回状态,它们间相互转换关系如图8所示。

图8 主模式状态机设计

空闲状态:判断是否收到DMA读写请求,如果有则跳到读写地址状态,没有则保持当前状态。

读写地址状态:此状态下主设备使FRAME#和IRDY#信号有效,CBE#总线下发存储器读命令,AD总线上送出 DMA首地址。当目标设备在地址期完成译码后,置TRDY#信号有效,启动第一次数据传输,并跳到读写数据状态1开始连续多次传输;否则跳转到读写停止状态。

读写数据状态1:判断此次DMA传输是否完成以及FIFO中的数据量。如果本次DMA传输至最后一个数据期,或FIFO几乎为空,则跳到读写数据状态2。若在传输过程中目标设备发出stop中止交易信号,或总线传输延迟超过16个时钟周期,则跳转至读写停止状态。若以上情况都未发生,则保持此状态继续进行DMA突发传输。

读写数据状态2:判断本次DMA传输是否进入最后一个数据期或目标设备是否要求中断数据传输。若是则跳转到读写停止状态,否则保持此状态继续本次DMA传输。

读写停止状态:判断本次DMA传输是否进入最后一个数据期或目标设备是否要求中断数据传输。若是则跳转至读写返回状态,否则仍保持此状态继续本次DMA传输。

读写返回状态:返回空闲状态。

4 测试结果及其验证

通过SignalTapⅡ抓取的波形如图9所示,可以看到在frame、trdy、irdy、stop信号控制下,PCI总线数据正在进行单周期读操作。此时FIFO将数据送给A/D总线,同时FIFO中剩余的数据量始终保持在1~2个,证明没有发生数据溢出现象。测试采用发送00~F8的递增数,之后为4个字节的帧计数,帧尾添加EB 90标识,数据截图如图10所示。由于数据读取速度很快,计算机采用固态硬盘(Solid State Drives,SSD)存储数据,在连续读取50GB数据后分析无丢数现象,同时测试DMA速率达到了1.104 Gb/s,说明通过PCIE接口,数据可以准确无误的上传到上位机,此数据传输卡可满足如今高速数据传输的需求。

图9 FPGA时序图

图10 数据检测报告

5 结 语

本设计采用了PEX8111桥接芯片,通过FPGA进行时序逻辑控制,完成了PCIE协议与PCI协议的相互转化,实现了LVDS总线与PCIE接口的实时通信。整个设计占用的计算机资源很小,不仅实现了数据的准确传输,还可满足当今数据高速传输的需求。本产品通过了相关的性能测试,已成功应用在数据传输测试中。

猜你喜欢
寄存器时序差分
RLW-KdV方程的紧致有限差分格式
符合差分隐私的流数据统计直方图发布
清明
STM32和51单片机寄存器映射原理异同分析
数列与差分
Lite寄存器模型的设计与实现
基于不同建设时序的地铁互联互通方案分析
移位寄存器及算术运算应用
基于FPGA 的时序信号光纤传输系统
基于模体演化的时序链路预测方法