在当今数字化浪潮汹涌澎湃的时代,数据传输的速度与效率已然成为了科技领域中备受瞩目的焦点话题。据我了解,在 PCIe 通信案例中,采用不同方式呈现出了截然不同的传输速率,各项数据证明DMA方式在数据传输中存在巨大优势。

今天,我简单分享如何快速提升PCIe通信速率,是基于RK3568J + FPGA国产平台。这个案例我觉得还是非常值得学习了解,感兴趣的朋友可以一起往下看看!

 测试数据汇总

表 1

案例

时钟频率

测试结果

理论速率

PCIe通信案例

(DMA方式)

100MHz

读速率:595.24MB/s

写速率:791.14MB/s

782.50MB/s

PCIe通信案例

(非DMA方式)

读速率:2.674MB/s

写速率:35.511MB/s

(关注官网公众号,获取更多资讯)

 PCIe总线介绍

PCIe,即PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准。主要用于扩充计算机系统总线数据吞吐量以及提高设备通信速度。

1分钟学会如何提升PCIe通信速率,基于RK3568J + FPGA国产平台!_应用层

图 1

 DMA技术介绍

DMA(Direct Memory Access,直接内存访问)是一种让硬件外设直接与存储器进行数据交换的技术,无需CPU参与数据传输过程。

使用非DMA方式进行数据传输时,外设与内存之间的数据搬运需要依靠CPU来完成。这意味着每次数据传输都需要CPU的介入,导致CPU资源占用较高,并且数据传输速度相对较低。

使用DMA方式进行数据传输时,外设可以直接与内存进行数据交换。减少了CPU的介入和中断处理,数据传输过程更加流畅和高效。

1分钟学会如何提升PCIe通信速率,基于RK3568J + FPGA国产平台!_数据_02

图 2

 RK3568J + FPGA典型应用场景

1分钟学会如何提升PCIe通信速率,基于RK3568J + FPGA国产平台!_数据传输_03

图 3

 基于RK3568J + FPGA的PCIe通信案例

本文主要介绍基于RK3568J + FPGA的PCIe通信案例,适用开发环境如下:

Windows开发环境:Windows 7 64bit、Windows 10 64bit

Linux开发环境:VMware15.5.5、Ubuntu18.04.4 64bit

U-Boot:U-Boot-2017.09

Kernel:Linux-4.19.232、Linux-RT-4.19.232

LinuxSDK:LinuxSDK-[版本号](基于rk356x_linux_release_v1.3.1_20221120)

硬件平台:创龙科技TL3568F-EVM工业评估板

(基于瑞芯微RK3568J + 紫光同创Logos-2)

(点击视频,1分钟解锁RK3568J + FPGA工业核心板高光时刻!)

为了简化描述,本文仅摘录部分方案功能描述与测试结果,详细产品资料请扫描文末二维码下载。

案例说明

ARM端基于PCIe总线对FPGA DRAM进行读写测试。应用程序通过ioctl函数发送命令开启DMA传输数据后,等待驱动上报input事件;当应用层接收到input事件,说明DMA传输数据完成。

程序流程如下图所示。

1分钟学会如何提升PCIe通信速率,基于RK3568J + FPGA国产平台!_fpga开发_04

图 4 

(1)ARM端程序原理说明如下:

a)采用DMA方式;

b)将数据写至dma_memcpy驱动申请的连续内存空间(位于DDR);

c)配置DMA,如源地址、目标地址、传输的数据大小等;

d)写操作:通过ioctl函数启动DMA,通过PCIe总线将数据搬运至FPGA DRAM;

e)程序接收驱动上报input事件后,将通过ioctl函数获取DMA搬运数据耗时,并计算DMA传输速率(即写速率);

f)读操作:通过ioctl函数启动DMA,通过PCIe总线将FPGA DRAM中的数据搬运至dma_memcpy驱动申请的连续内存空间(位于DDR);

g)程序接收驱动上报input事件后,将数据从内核空间读取至用户空间,然后校验数据,同时通过ioctl函数获取DMA搬运数据耗时,并计算DMA传输速率(即读速率)。

(2) FPGA端程序原理说明如下:

a)实现PCIe Endpoint功能;

a)处理PCIe RC端发起的PCIe BAR0空间读写事务;

b)将PCIe BAR0读写数据缓存至FPGA DRAM中。

案例演示

评估板上电启动后,进入评估板文件系统执行如下命令,将随机数据先写入FPGA DRAM,再从FPGA DRAM读出。测试完成后,程序将会打印最终测试结果,包含读写平均传输耗时、读写平均传输速率、读写错误统计等信息。

Target#./dma_memcpy_demo -a 0xf0200000 -s 65536 -c 100 -d /dev/input/event6

1分钟学会如何提升PCIe通信速率,基于RK3568J + FPGA国产平台!_应用层_05

图 5

表 2 测试结果说明

write/read

写操作

读操作

time

DMA传输耗时,本次测试为79us

DMA传输耗时,本次测试为105us

rate

DMA传输速率,本次测试为791.14MB/s

DMA传输速率,本次测试为595.24MB/s

app time

应用层写数据至驱动Buffer耗时,本次测试为55us

应用层从驱动Buffer读取数据耗时,本次测试为288us

app rate

应用层写数据至驱动Buffer速率,本次测试为1132.10MB/s

应用层从驱动Buffer读取数据速率,本次测试为217.99MB/s

write_error/read_error

写数据过程中出错次数,本次测试为0

读数据过程中出错次数,本次测试为0

到这里,我们的演示步骤结束。想要查看更多创龙科技旗下的瑞芯微RK3568J + FPGA相关的案例演

1分钟学会如何提升PCIe通信速率,基于RK3568J + FPGA国产平台!_应用层_06

1分钟学会如何提升PCIe通信速率,基于RK3568J + FPGA国产平台!_应用层_07