基于AGX ORIN与FPGA K7实现PCIE高速数据通信/Orin与FPGA高速数据传输/XDMA在linux系统使用教程

因最近想学习AGX orin和FPGA实现数据高速通信,借此机会和大家一起学习AGX orin和FPGA

制作不易,记得三连哦,给我动力,持续更新!!!   

完整工程文件下载:AGX orin与FPGA实现PCIE完整工程   提取码:985w


        在现代高速数据传输领域,PCIe(Peripheral Component Interconnect Express)已经成为了一种广泛应用的技术标准。它不仅提供了高带宽和低延迟的数据传输能力,还在多种应用场景中表现出色。本文将深入探讨如何利用NVIDIA的AGX ORIN平台与Xilinx的FPGA K7,通过PCIe接口实现高速数据通信。

AGX ORIN与FPGA A7的概述

        AGX ORIN是NVIDIA最新一代的AI计算平台,具有强大的计算能力和广泛的应用前景,特别是在自动驾驶、机器人和高性能计算等领域。而Xilinx FPGA A7则是FPGA领域的一个重要产品,因其灵活的硬件配置和高效的数据处理能力,广泛应用于信号处理和嵌入式系统中。

本文将详细介绍如何使用他们,并提供具体的技术实现方案,包括:

  • 硬件设计与配置:如何配置AGX ORIN和FPGA A7的硬件接口,使其能够通过PCIe进行高速数据通信。
  • 驱动程序开发:开发并优化PCIe驱动程序,以支持高效的数据传输。
  • 数据传输协议:设计高效的数据传输协议,确保数据传输的高效性和可靠。

一、硬件介绍

FPGA:

        本次设计采用的是xilinx家的K7 325T(全称xc7k325tffg900-2L),采用我们自己设计的开发板进行开发,如果芯片一样的读者,也可以直接使用你自己的开发板来设计。下面是325T官方的PCIE资源介绍:

XC7K325TFFG900 的 PCIe 资源

  1. 内置 PCIe 硬核 (PCIe Hard IP)

    • PCIe Gen2 支持: XC7K325TFFG900 支持 PCIe Gen2 标准,提供高达 5 GT/s 的数据传输速率。
    • 支持的通道数: 支持 x1、x2、x4 和 x8 通道配置,根据应用需求灵活选择不同的带宽。
  2. 灵活的配置选项

    • 可编程端点和根端口: 支持将 FPGA 配置为 PCIe 端点 (Endpoint) 或根端口 (Root Port),适用于不同的应用场景。
    • 多功能支持: 允许实现多功能设备,使单个 PCIe 端点能够支持多个独立功能。
  3. 高性能 SerDes

    • 高达 16 个高速串行解串行器 (SerDes) 通道: 每个通道支持高达 6.6 Gb/s 的数据传输速率,确保了 PCIe 通道的高性能传输能力。
    • 集成时钟和数据恢复 (CDR) 电路: 提供稳定的高速数据传输,减少信号抖动和误码率

AGX ORIN:

        本次设计的Orin为 JETSON AGX Orin 64G,同理32G的版本也是一样的,下面是总结的AGX Orin的PCIE资源介绍:

AGX Orin 的 PCIe 资源

  1. PCIe 版本和速率

    • PCIe Gen4 支持: AGX Orin 支持 PCIe 4.0 标准,提供高达 16 GT/s 的数据传输速率,比 PCIe 3.0 的带宽翻倍,适合高带宽需求的应用。
  2. PCIe 通道数

    • 多达 16 条 PCIe 通道: 允许配置为多种通道组合(如 x16、x8、x4、x2 和 x1),以满足不同设备和应用的带宽需求。
  3. 灵活的接口配置

    • 多功能支持: 支持多种 PCIe 配置和设备树设计,灵活配置端点和根端口角色,适用于多种系统架构和应用需求。
    • 多主机支持: 能够配置多个独立的 PCIe 控制器,使其可以同时连接多个 PCIe 设备,提升系统扩展性。
  4. 高性能和低延迟

    • 高吞吐量和低延迟: PCIe 4.0 提供了高吞吐量和低延迟的特点,能够满足实时应用和数据密集型计算的需求。
    • 内存访问: 支持直接内存访问 (DMA) 和远程直接内存访问 (RDMA),提高数据传输效率和系统性能。

二、FPGA设计

设计工具

        设计开发vivado版本:vivado2019.2

        设计语言:verilog、block design

设计需求:

        完成 FPGA 与 AGX Orin 的数据交互,并通过 PCIe 接口实现高速数据传输,同时测量和评估通信速度及其性能表现。

本设计主要是采用vivado中的block design设计,然后其中还添加了自己设计的一些代码:AXI接口读写模块和模拟数据产生模块。整体设计如下所示:

PCIE采用的是xilinx官方的XDMA IP:

        主要配置为:PCIE 2.0  x8工作模式  (此芯片的最高配)

三、AGX Orin平台配置

开机:

        首先拿到设备之后,根据官方的提示和步骤完成开机步骤,默认安装的ubuntu系统,开机之后就和正常的linux虚机没什么区别了

参考文献:AGX Orin官方开机测试指南

安装xdma驱动(linux版)

驱动下载

可以从官方下载驱动,也可以从我这里下载我使用的版本

官方驱动下载:GitHub - Xilinx/dma_ip_drivers: Xilinx QDMA IP Drivers

本设计使用的驱动:xdma_linux驱动下载

驱动安装

1、检查pci驱动

打开 Linux 终端,输入“lspci”命令并执行, 如下图所示:

可以看到,没有 Xilinx 相关的信息,这是因为没有安装 XDMA 的 Linux 系统驱动。
2、驱动安装

下载好的驱动,存放到AGX orin上面

由于提供的都是源码,需要编译安装然后才能使用。打开终端,输入如下命令:

cd ./dma_ip_drivers/XDMA/linux-kernel/xdma/
sudo apt install build-essential #(如果之前没有安装过 build-essential,需要安装)
sudo make install

驱动安装完成后,重启 Linux 系统主机。

3、加载驱动

现在打开终端,输入如下命令进入 xdma 驱动目录下的 tests 目录:

cd ./dma_ip_drivers/XDMA/linux-kernel/tests

该目录提供了驱动加载脚本及应用测试脚本,其中的 load_driver.sh 即为 XDMA 的驱动加载脚

本。执行该脚本前需要先给该脚本赋予可执行权限,然后以 root 身份执行,命令如下:

chmod +x load_driver.sh
sudo ./load_driver.sh

可以看到 XDMA 驱动已正确加载。

4、检测XDMA设备

在终端中输入“lspci”命令

在终端中输入“ls /dev”命令并执行,可以在/dev 目录下看到以 xdma0 开头的设备文件,如下图所示:

以下是每个设备文件的简要说明:

  1. /dev/xdma0_control:用于控制和配置DMA设备。
  2. /dev/xdma0_user:用于用户自定义用途。
  3. /dev/xdma0_xvc:用于虚拟JTAG功能。
  4. /dev/xdma0_events_*:用于处理DMA事件(中断)。
  5. /dev/xdma0_c2h_*:用于从卡到主机(Card to Host,简称C2H)的DMA数据传输。
  6. /dev/xdma0_h2c_*:用于从主机到卡(Host to Card,简称H2C)的DMA数据传输。

这表明 AGX orin系统已正确安装 XDMA 驱动并检测到了 XDMA 设备。

四、下板测试

把第三章的vivado工程生成的bit文件,烧录到FPGA开发板的FLASH,然后重启AGX orin

1、应用测试

打开终端,输入如下命令进入 xdma 目录下的tests 目录:

cd ./dma_ip_drivers/XDMA/linux-kernel/
cd tests/

需要给他们添加可执行权限:

输入如下命令以执行 run_test.sh 脚本:

chmod +x run_test.sh
chmod +x dma_memory_mapped_test.sh
sudo ./run_test.sh

run_test.sh 脚本用于测试基本的 XDMA 传输,并具有如下功能:
✓ 检测设计是基于 AXI-MM 接口还是 AXI_ST 接口,并查看启用了多少个通道;
✓ 对所有启用的通道进行基本传输测试;
✓ 检查数据完整性;
✓ 报告通过或失败

测试结果的最后两行 passed 表明我们搭建的基于 XDMA 的 PCIe 通信子系统正确,且 XDMA 驱动安装和驱动示例程序运行正常。

2、PCIE的读和写

Linux 的 XDMA 测试应用是源码提供的,需要先编译。打开终端,输入如下命令进入 xdma 目录下的tools 目录并编译:

cd ./dma_ip_drivers/XDMA/linux-kernel/
cd tools/
make

编译后, tools 目录下有四个 XDMA 相关的测试应用,如下图所示:(第一次进来没有data_rd.bin文件)

dma_to_device

  • 这是一个可执行文件,用于将数据从主机内存写入到 FPGA 设备。

dma_from_device

  • 这是一个可执行文件,用于从 FPGA 设备读取数据到主机内存。

performance

  • 这是一个可执行文件,可能用于测试和评估 DMA 性能

reg_rw

  • 这是一个可执行文件,可能用于读取和写入 FPGA 寄存器
测试写入

打开终端,进入tools目录,然后输入以下指令(首先准备好一个测试数据datafile4K.bin):

sudo ./dma_to_device -d /dev/xdma0_h2c_0 -a 0x00000000 -s 2048 -f datafile4K.bin

这个命令将 data_to_write.bin 文件中的数据写入到 /dev/xdma0_h2c_0 设备的地址 0x00000000,长度为 2048 字节。

表示写入完成!!!

测试读取

打开终端,进入tools目录,然后输入以下指令

sudo ./dma_from_device -d /dev/xdma0_c2h_0 -a 0x00000000 -s 2048 -f data_rd.bin

这个命令从 /dev/xdma0_c2h_0 设备开始的地址 0x00000000 读取 2048 字节的数据,并保存到 data_rd.bin 文件中。

表示读取完成!!!

验证读写

通过xxd命令来打开.bin文件:

首先打开写入的数据文件datafile4K.bin,输入以下指令

xxd datafile4K.bin

然后再读取从PCIE读取出来的数据data_rd.bin,输入以下指令

xxd data_rd.bin

可以看见写入数据和读出的数据一样

3、读取FPGA写入的数据

由第二章设计的FPGA工程可以得到,我们通过FPGA端向PCIE不停地写数据,我们先通过vivado的ila来查看写入的数据:

然后我们通过读取指令,来读取这个地址的数据,并通过xxd查看

sudo ./dma_from_device -d /dev/xdma0_c2h_0 -a 0x00A00000 -s 2048 -f data_rd.binxxd data_rd.bin

因大小端的问题,这个数据应该和ila的按字节取反即可

可见和ila抓的完全相同。说明FPGA写入,PCIE读取没问题!!!

五、测试板卡速度

        perform_hwcount.sh 脚本用于测试 XDMA 的硬件性能(读写速率),并将测试结果复制到hw_log_h2c.txt和 hw_log_c2h.txt 文本文件。 hw_log_h2c.txt 为写测试结果, hw_log_c2h.txt 为读测试结果。

打开终端,进入tests目录,然后输入以下指令

chmod +x perform_hwcount.sh
sudo ./perform_hwcount.sh 1 1

参数 1 1 是指要测试的读写通道数。

然后输入以下命令查看写速度:

grep -i 'data rate' hw_log_h2c.txt

可以看到,对与写速率, 开始时传输长度越大,相应的传输速率 rate 也越大,当传输长度达到一定值时,对传输速率的影响就不大了。

由此可以验证本次设计整体没问题!!,终于大功告成啦!!!

完整工程文件下载:AGX orin与FPGA实现PCIE完整工程   提取码:985w

如果感觉文章对您有用,麻烦三连支持一下,方便下次用到的时候,就可以快速找到我,非常感谢您的支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/41095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通证经济重塑经济格局

在数字化转型的全球浪潮中,通证经济模式犹如一股新兴力量,以其独特的价值传递与共享机制,重塑着经济格局,引领我们步入数字经济的新纪元。 通证,作为这一模式的核心,不仅是权利与权益的数字化凭证&#xf…

C语言 | Leetcode C语言题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; int robRange(int* nums, int start, int end) {int first nums[start], second fmax(nums[start], nums[start 1]);for (int i start 2; i < end; i) {int temp second;second fmax(first nums[i], second);first temp;}retur…

Golang基础问题

Go基础 文章目录 Go基础● Go有那些关键字&#xff1f;● Go方法与函数的区别&#xff1f;● Go函数返回局部变量的指针是否安全&#xff1f;● Go函数参数传递是值传递还是引用传递&#xff1f;● defer关键字的实现原理&#xff1f;● 内置函数make和new的区别&#xff1f;●…

kotlin协程的理解

伴生对象&#xff1a;companion object 其实质等同于Java中的单例模式 协程&#xff1a;通常实现是用户态的任务协作式调度 一段可执行代码可挂起/可恢复执行概念上与语言无关&#xff0c;协程这个概念于1958年提出 依赖框架&#xff1a; 协程的启动&#xff1a; 1.协程体&a…

大模型LLMs概述:利用大模型 (LLMs) 解决信息抽取任务

论文标题&#xff1a;Large Language Models for Generative Information Extraction: A Survey 论文链接&#xff1a;https://arxiv.org/pdf/2312.17617.pdf 论文主要探讨了大型语言模型&#xff08;LLMs&#xff09;在生成式信息抽取&#xff08;IE&#xff09;任务中的应用…

属性描述符初探——Vue实现数据劫持的基础

目录 属性描述符——Vue实现数据劫持的基础 一、属性描述符是什么&#xff1f; ​编辑 1.1、属性描述符示例 1.2、用属性描述符定义属性及获取对象的属性描述符 1.3、带有读取器和设置器的属性描述符 二、使用属性描述符的情景 2.1、封装和数据隐藏 使用getter和setter…

Desktop docker 部署 WordPress

Desktop Docker 部署 WordPress 之前都是在Linux里面玩的,今天看到别人在windwos下安装docker,一时兴起装了一个试试,效果一般,很吃硬盘空间和内存。 首先在docker官方下载桌面版,安装下一步一直到完成。 安装完docker会自动加入到环境变量,而且docker-compose也会一并安…

sql业务场景分析思路参考

1、时间可以进行排序&#xff0c;也可以用聚合函数对时间求最大值max&#xff08;时间&#xff09; 例如下面的例子&#xff1a;取最晚入职的人&#xff0c;那就是将入职时间倒序排序&#xff0c;然后limit 1 表&#xff1a; 场景&#xff1a;查找最晚入职员工的所有信息 se…

第十四届蓝桥杯省赛C++B组F题【岛屿个数】题解(AC)

题目大意 给定一个 01 地图&#xff0c;分别表示陆地和海&#xff0c;问地图中一共有多少块岛屿&#xff1f;另外&#xff0c;若一个岛屿在另一个岛屿的内部&#xff0c;则不统计。如下图中的大岛屿包含着内部的小岛屿&#xff0c;故内部小岛屿不计算&#xff0c;最终输出 1。…

vue3自定义全局指令和局部指令

1.全局指令 el&#xff1a;指令绑定到的DOM元素&#xff0c;可以用于直接操作当前元素&#xff0c;默认传入钩子的就是el参数&#xff0c;例如我们开始实现的focus指令&#xff0c;就是直接操作的元素DOM binding&#xff1a;这是一个对象&#xff0c;包含以下属性&#xff1a;…

【C#】ProgressBar进度条异步编程思想

1.控件介绍 进度条通常用于显示代码的执行进程进度&#xff0c;在一些复杂功能交互体验时告知用户进程还在继续。 在属性栏中&#xff0c;有三个值常用&#xff1a; Value表示当前值&#xff0c;Minimum表示进度条范围下限&#xff0c;Maximum表示进度条范围上限。 2.简单实…

简单的git pull fail Can‘t update has no tracked branch解决记录

简单的git pull fail Can‘t update has no tracked branch解决记录 1. 问题描述 上午同事使用idea拉取代码的时候&#xff0c;发现拉取不了&#xff0c;提示用户权限问题&#xff0c;之后修改了git用户信息&#xff0c;发现还是拉取不了分支代码&#xff0c;然后删除了git r…

对FPGA开发流程系统的学习

FPGA 开发流程&#xff1a; HDL&#xff08;Hardware Design Language&#xff09;和原理图是两种最常用的数字硬件电路描述方法&#xff0c;HDL 设计法具有更好的可移植性、通用性和模块划分与重用性的特点&#xff0c;在目前的工程设计中被广泛使用。所以&#xff0c;我们在…

WPF在.NET9中的重大更新:Windows 11 主题

在2023年的2月20日&#xff0c;在WPF的讨论区&#xff0c;WPF团队对路线的优先级发起了一次讨论。 对三个事项发起了投票。 第一个是Windows 11 主题 第二个是更新的控件 第三个是可空性注释 最终Windows 11 主题得票最高&#xff0c;WPF团队2023-2024的工作优先级就是Windows…

网安小贴士(8)IPv4与IPv6

一、前言 IPv4和IPv6都是互联网协议&#xff08;IP&#xff09;的版本&#xff0c;它们用于在互联网上标识和定位设备。 二、定义 IPv4&#xff08;互联网协议第四版&#xff09;&#xff1a; IPv4是互联网协议的第一个广泛使用的版本&#xff0c;最初在1981年被标准化为RFC 7…

交换数字00

题目链接 交换数字 题目描述 注意点 numbers.length 2-2147483647 < numbers[i] < 2147483647 解答思路 不适用临时变量&#xff0c;可以先将numbers[0]和numbers[1]的信息都存到某个位置&#xff08;可以相加可以相减或其他位操作&#xff09;&#xff0c;然后另一…

SpringBoot 通过Knife4j集成API文档 在线调试

介绍 Knife4j 是一款基于 Swagger 构建的增强型 API 文档生成工具&#xff0c;它提供了更多的定制化功能和界面优化&#xff0c;使得生成的 API 文档更加美观和易用。它可以帮助开发者快速生成和管理 API 文档&#xff0c;支持在线调试和交互。 依赖 <!--knife4j--> &…

期末C语言易错知识点整理

1.在定义多维数组时&#xff0c;除了最左边的维度&#xff0c;其余的维度必须明确指定大小 2.int m[1][4]{4}; 定义的是一个 1 行 4 列的二维数组&#xff0c;初始化时提供了一个元素 4&#xff0c;其余元素默认初始化为 0&#xff0c;因此是正确的。 3.二维数组 a[3][6] 中的索…

谷粒商城学习笔记-05-项目微服务划分图

文章目录 一&#xff0c;商城业务服务-前端服务二&#xff0c;商城业务服务-后端服务三&#xff0c;存储服务四&#xff0c;第三方服务五&#xff0c;服务治理六&#xff0c;日志七&#xff0c;监控预警系统1&#xff0c;Prometheus2&#xff0c;Grafana3&#xff0c;Prometheu…