### 基于Xilinx PCIe Core的DMA设计详解
#### 摘要
本文档详细介绍了一种基于Xilinx Endpoint Block Plus PCIe IP Core的DMA(直接内存访问)设计。该设计支持由板卡主动发起的DMA操作,允许快速传输数据至PC或从PC获取数据。通过使用通用的Local Link接口,该设计兼容多种Xilinx PCIe硬核器件,包括Virtex 5、Virtex 6和Spartan 6系列,并已在ML555和ML605开发板上进行了验证。
#### 简介
本设计的主要功能包括:
1. **支持板卡发起的DMA操作**:这种操作可以高效地将数据从板卡传输到PC,或者反方向传输。DMA可以通过PCIe的BAR0空间进行控制。
2. **兼容多种Xilinx系列**:利用Xilinx LogiCORE Endpoint Block Plus硬核,本设计支持Virtex 5、Virtex 6和Spartan 6系列,并无缝支持PCIe x8、x4和x1速率。
3. **灵活的数据接入**:板卡终端采用标准FIFO接口,可以接入各种类型的数据,如AD采样数据、光纤数据或DA数据。
4. **高效的驱动代码**:使用DriverStudio生成的驱动代码,以最大限度提高连续传输速率的同时减少PC的处理负担。
5. **用户自定义BAR2空间**:用于自定义控制,提供更多灵活性。
6. **支持32位和64位操作系统**:确保广泛的兼容性。
#### 典型系统结构
PC与PCIe板卡之间的交互有两种主要方式:
1. **PC主动读写板卡内容**:在这种模式下,板卡通过BAR空间的形式呈现给PC,使得PC能够简单地控制和读写这些空间中的数据。然而,这种模式下的传输速率有限,通常不超过10MBps,且会导致较高的CPU负载。
2. **PCIe板卡主动发起读写PC总线数据**:这种方式使用板卡内的DMA引擎实现更高效的数据传输。具体过程如下:
- **数据从板卡到PC**:
1. PC申请一段连续的物理内存空间并锁定,以防被其他程序使用。
2. 当FPGA内部的数据积累到一定规模时,向PC发送中断通知。
3. PC接收中断后,通过写入BAR0空间的寄存器来指定目标物理地址及其大小,并启动DMA。
4. FPGA内部的DMA引擎接收到启动命令后,主动组织PCIe Memory Write TLPs包发送到PC,其中包含用户需要传输的数据。DMA引擎自动填充TLP包的地址等信息直至达到预设长度。
5. 完成传输后,FPGA向PC发送中断通知,PC读取BAR0空间的状态寄存器并做出相应处理。
- **数据从PC到板卡**:
1. 同样地,PC首先申请并锁定一段连续的物理内存空间。
2. 当FPGA内部有足够的空闲空间时,向PC发送中断请求数据。
3. PC接收中断后,同样通过BAR0空间寄存器指定源物理地址及大小,并启动DMA。
4. FPGA内部的DMA引擎组织PCIe Memory Read TLPs包发送到PC,PC自动将物理空间中的数据组织成Completion TLPs回送给FPGA。
5. FPGA接收并分析数据后,按顺序存储在缓冲区内,并向PC发送中断通知;PC读取BAR0空间的状态寄存器并处理后续动作。
#### DMA控制逻辑
DMA控制逻辑的设计如图2所示。通过这种方式,可以有效地管理数据的流动,提高数据传输效率并减轻PC的负担。本设计的关键在于DMA引擎的高效组织与控制,以及通过PCIe TLPs的有效利用来加速数据传输。这种设计特别适用于需要高速数据交换的应用场景,如信号处理、图像处理等领域。
基于Xilinx PCIe Core的DMA设计是一种高效、灵活的数据传输方案,它不仅可以提高系统的整体性能,还具有良好的扩展性和兼容性,非常适合应用于各种高性能计算和通信领域。