基于XDMA 中断模式的 PCIE 上位机与FPGA数据交互架构 提供工程源码和QT上位机源码

news/2024/7/21 0:03:00 标签: fpga开发, qt, XDMA, PCIE

目录

  • 1、前言
  • 2、我已有的PCIE方案
  • 3、PCIE理论
  • 4、总体设计思路和方案
    • 图像产生、发送、缓存
    • 数据处理
    • XDMA简介
    • XDMA中断模式
    • 图像读取、输出、显示
    • QT上位机及其源码
  • 5、vivado工程详解
  • 6、上板调试验证
  • 7、福利:工程代码的获取

1、前言

PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优先选择方向,具有很高的实用价值和学习价值;

本设计提供一种基于XDMA 中断模式的 PCIE 上位机与FPGA数据交互架构;该机构的主要作用如下:图中的箭头代表数据流向,数字代表数据流向的步骤;
在这里插入图片描述
QT上位机将电脑端的数据通过PCIE总线发送给FPGA开发板,FPGA侧的XDMAPCIE发来的数据缓存至DDR3,缓存完成后,XDMA产生中断信号,该信号通过AXI-GPIO发送给FDMA,通知FDMA去DDR3中读取数据,FDMA得到中断通知后,读取DDR3中的数据给FPGA逻辑做数据处理,数据处理完成后再通过FDMA将处理完成的数据写回到DDR3中缓存,XDMA再从DDR3中读取处理好的数据送入PCIE总线发送给电脑端,电脑端QT软件再接收处理好的数据;

本设计使用Xilinx官方的XDMA方案搭建基于Xilinx系列FPGA的PCIE通信平台,电脑端QT实时截取主机屏幕图片,QT软件会将图片发送给PCIE总线,XDMA驱动将PCIE总线上的数据发送出去;FPGA开发板的 XDMA IP 核将接收到的图片数据缓存至 DDR3,并以中断方式通知用户将DDR3中缓存的图片数据读出, FDMA控制器收到 XDMA 发来的中断信号后将图片从 DDR3 中读出,然后做数据处理,出于简单考虑,这里的数据处理我们仅做数据回环,当然你可以做更加负责的处理,比如图像缩放、图像增强,图像识别等,处理完成后,FDMA再将数据写入DDR3中缓存,XDMA读取处理完毕后的数据再通过PCIE发送给电脑上位机,QT最后将处理完成后的图像显示出来;

本设计的关键在于我们编写了一个 xdma_inter.v 的XDMA中断模块。该模块用来配合驱动处理中断,xdma_inter.v 提供了AXI-LITE 接口,上位机通过访问 user 空间地址读写 xdma_inter.v 的寄存器。该 模块 在 user_irq_req_i 输入的中断位,寄存中断位号,并且输出给 XDMA IP ,当上位机的驱动响应中断的时候,在中断里面写 xdma_inter.v 的寄存器,清除已经处理的中断。

该方案只适用于Xilinx系列FPGA,一并提供了XDMA的安装驱动和QT上位机源代码,省去了使用XDMA繁琐的驱动寻找和上位机软件开发的不知所措,并以搭建好vivado工程,省去了不知道如何使用XDMA的尴尬,使得PCIE的使用变得简单易上手,而不用关心其复杂的PCIE协议;由于我的开发板只支持PCIE X8,所以提供的代码是PCIE X8架构,若需要PCIE X1、 X2、 X8、 X16、 X32的朋友,可自行修改本工程,也可关注我,我会实时发布新的工程。
本工程实现进阶应用的PCIE通信,和QT上位机之间进行图片传输试验。
在这里插入图片描述
本文详细描述了基于XDMA搭建PCIE通信平台的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的高速接口领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

PCIE_18">2、我已有的PCIE方案

我的主页有PCIE通信专栏,该专栏基于XDMA的轮询模式实现与QT上位机的数据交互,既有基于RIFFA实现的PCIE方案,也有基于XDMA实现的PCIE方案;既有简单的数据交互、测速,也有应用级别的图像采集传输,以下是专栏地址:
点击直接前往
此外,我的主页有中断模式的PCIE通信专栏,该专栏基于XDMA的中断模式实现与QT上位机的数据交互,以下是专栏地址:点击直接前往

PCIE_22">3、PCIE理论

这部分可自行百度或csdn或知乎学习理论知识,其实用了XDMA,已经不太需要直到PCIE复杂的协议和理论了。。。

4、总体设计思路和方案

总体设计思路和方案如下:图中的箭头代表数据流向,数字代表数据流向的步骤;
在这里插入图片描述

图像产生、发送、缓存

QT上位机实时截取电脑桌面的屏幕图片,我的电脑分辨率为1920X1080,QT软件会将图片发送给PCIE总线,XDMA驱动将PCIE总线上的数据发送出去;FPGA开发板的 XDMA IP 核将接收到的图片数据缓存至 DDR3,并以中断方式通知用户将DDR3中缓存的图片数据读出;这里的中断采用AXI-GPIO传递;

数据处理

出于简单考虑,这里的数据处理我们仅做数据回环,当然你可以做更加负责的处理,比如图像缩放、图像增强,图像识别等;代码如下:
在这里插入图片描述

XDMA_32">XDMA简介

Xilinx 提供的 DMASubsystem for PCIExpressIP 是一个高性能,可配置的适用于 PCIE2.0,PCIE3.0 的 SG 模式 DMA,提供用户可选择的 AXI4 接口或者 AXI4-Stream 接口。一般情况下配置成 AXI4 接口可以加入到系统总线互联,适用于大数据量异步传输,通常情况都会使用到 DDR,AXI4-Stream 接口适用于低延迟数据流传输。
XDMA 是 SGDMA,并非 Block DMA,SG 模式下,主机会把要传输的数据组成链表的形式,然后将链表首地址通过 BAR 传送给 XDMAXDMA 会根据链表结构首地址依次完成链表所指定的传输任务,XDMA框图如下:
在这里插入图片描述
AXI4、AXI4-Stream,必须选择一个,用于数据传输AXI4-Lite Master 可选,用于实现 PCIE BAR 地址到 AXI4-lite 寄存器地址的映射,可以用于读写用户逻辑寄存器。
AXI4-Lite Slave 可选,用来将 XDMA 内部寄存器开放给用户逻辑,用户逻辑可以通过此接口访问 XDMA 内部寄存器,不会映射到 BAR。
AXI4 Bypass 接口,可选,用来实现 PCIE 直通用户逻辑访问,可用于低延迟数据传输。

XDMA_39">XDMA中断模式

本设计的关键在于我们编写了一个 xdma_inter.v 的XDMA中断模块。该模块用来配合驱动处理中断,xdma_inter.v 提供了AXI-LITE 接口,上位机通过访问 user 空间地址读写 xdma_inter.v 的寄存器。该 模块 在 user_irq_req_i 输入的中断位,寄存中断位号,并且输出给 XDMA IP ,当上位机的驱动响应中断的时候,在中断里面写 xdma_inter.v 的寄存器,清除已经处理的中断。
另外本方案中通过 AXI-BRAM 来演示用户 user 空间的读写访问测试。

图像读取、输出、显示

FDMA控制器收到 XDMA 发来的中断信号后将图片从 DDR3 中读出,然后将图像信息放入 VGA 时序的数据总线上形成 VGA 时序的视频流,在将视频流送入 HDMI 发送模块将 RGB 数据转换为 HDMI 差分数据通过 HDMI 线缆输出到显示器;VGA时序分辨率为1920X1080@60Hz;关于FDMA的详细设计说明,请参考我之前的文章:点击直接前往

QT上位机及其源码

QT上位机本方案使用 VS2015 + Qt 5.12.10 完成上位机开发软件环境搭建,QT程序调用XDMA官方API采用中断模式实现与FPGA的数据交互,本例程实现的是读写测速,提供QT上位机软件及其源码,路径如下:
在这里插入图片描述
QT源码部分截图如下:
在这里插入图片描述

5、vivado工程详解

开发板FPGA型号:Xilinx–xc7k325tffg900-2;
开发环境:Vivado2022.2;
输入:测试图片,QT上位机发送,分辨率为1920X1080;
输出:HDMI,分辨率为1920X1080@60Hz;
应用:QT上位机发送图像,FPGA接收显示试验;
工程BD如下:
在这里插入图片描述
XDMA需要设计中断数量,配置如下:
在这里插入图片描述
同时,XDMA中断模块的中断数量也设置为4,如下:
在这里插入图片描述
综合后的代码架构如下:
在这里插入图片描述
综合编译完成后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述

6、上板调试验证

开启上位机测程序进行 PCIe 接收视频测试,打开QT软件,实验结果如下:
在这里插入图片描述

7、福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/1005915.html

相关文章

dpc++(oneAPI)调用nvidiaGPU配置与验证

前提 1.安装Intel oneAPI Toolkits https://software.intel.com/content/www/us/en/develop/documentation/installation-guide-for-intel-oneapi-toolkits-linux/top.html 下载安装Base版,注意版本,尽量安装新版本 2.安装GPU驱动与CUDA https://devel…

堆的向下调整算法,堆排,TopK问题

文章目录 堆的向下调整算法堆的删除:堆排序向上调整建堆的时间复杂度向下调整建堆的时间复杂度为:TopK问题 堆的向下调整算法 我们在这里都已小堆为例: 在这里我们有一个数组 int array[] {27,15,19,18,28,34,65,49,25,37}; 我们通过把根节…

初学mybatis(七)缓存

学习回顾:初学mybatis(六) 一、简介 1、什么是缓存 [ Cache ]? 存在内存中的临时数据。将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询&#x…

拓展:IDEA如何使用不同版本的JDK?(改了还报错很可能因为没改全,以mac为例)

以下面的案例为例 Enhanced ‘switch’ blocks are not supported at language level ‘8’ 后面知道是因为Spring的版本和JDK的版本不对应,结果网上找到的解决方案都很简单。下载了一个新版本的JDK,然后IDEA里面Project Structure的Project标签里把SDK给…

C语言:移位操作注意事项

移位操作&#xff1a;因为操作符的原因&#xff0c;注意加括号。还有没必要在移位的时候进行&#xff08;uint32_t&#xff09;转换。 测试程序如下&#xff1a; #include <string.h> #include <stdlib.h> #include <stdio.h> #include <stdint.h>i…

第二批入围名单公示!争夺年度智能汽车软件竞争力奖项

过去几年&#xff0c;在特斯拉及新势力的带动下&#xff0c;车企的盈利模式正在寻求从“一次售卖”转变为“硬件预埋&#xff0b;软件付费解锁”&#xff0c;背后是驱动汽车软件架构的迭代&#xff0c;即从面向信号的软件架构&#xff0c;过渡至面向服务的SOA架构。 同时&…

层序遍历(借助于对列)

层序遍历&#xff08;借助于对列&#xff09; 1、Test.c2、Queue.h3、Queue.c 1、Test.c #define _CRT_SECURE_NO_WARNINGS 1//层序遍历&#xff0c;借助于队列的实现 #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "Queue.h&…

聚合函数group byhaving

聚合函数&group by group by 字段名 规定依据哪个字段分组聚合 group by核心子句是可选项&#xff0c;使用该子句是为了依据相同字段值分组后进行聚合运算&#xff0c;常和聚合函数联用 不使用group by 子句时使用聚合函数&#xff0c;select子句中只能写聚合函数和包含聚…