FPGA实现PCIE图片采集转HDMI输出,基于XDMA中断架构,提供3套工程源码和技术支持

目录

FPGA实现PCIE图片采集转HDMI输出,基于XDMA中断架构,提供3套工程源码和技术支持

1、前言

FPGA实现PCIE数据传输现状;

目前基于Xilinx系列FPGA的PCIE通信架构主要有以下2种,一种是简单的、傻瓜式的、易于开发的、对新手友好的XDMA架构,该架构对PCIE协议底层做了封装,并加上了DMA引擎,使得使用的难度大大降低,加之Xilinx提供了配套的Windows和Linux系统驱动和上位机参考源代码,使得XDMA一经推出就让工程师们欲罢不能;另一种是更为底层的、需要设计者有一定PCIE协议知识的、更易于定制化开发的7 Series Integrated Block for PCI Express架构,该IP实现的是PCIe 的物理层、链路层和事务层,提供给用户的是以 AXI4-stream 接口定义的TLP 包,使用该IP 核,需要对PCIe 协议有清楚的理解,特别是对事务包TLP报文格式;本设计采用第一种方案,使用XDMA的中断模式实现PCIE通信;本架构既有简单的测速实验,也有视频采集应用;

工程概述

本设计使用Xilinx系列FPGA为平台,调用Xilinx官方的XDMA方案搭建基中断模式下的PCIE图片采集转HDMI输出;输入源为电脑端的一张测试图片,大小为1920x1080,图片格式要求为BMP;打开QT上位机,将测试图片加载到QT上位机中,QT上位机将图片通过PCIE总线发送到FPGA板卡,还可以从FPGA板卡读回图片并显示;FPGA内部的XDMA IP核接收到电脑端发来的图片后,将图片写入板载DDR3中缓存;同时使用本博主常用的FDMA图像缓存架构将图片从板载DDR3中读出,在Native视频时序的同步下生成1920x1080@60Hz的RGB视频流,然后使用本博主常用的RGB转HDMI模块实现RGB视频到HDMI视频转换,并通过板载的HDMI视频接口输出;最后用显示器显示图片即可;本博客提供3套工程源码,具体如下:

现对上述3套工程源码做如下解释,方便读者理解:

工程源码1

开发板FPGA型号为Xilinx-->Artix7-100T--xc7a100tfgg484-2;输入源为电脑端的一张测试图片,大小为1920x1080,图片格式要求为BMP;打开QT上位机,将测试图片加载到QT上位机中,QT上位机将图片通过PCIE总线发送到FPGA板卡,还可以从FPGA板卡读回图片并显示;FPGA内部的XDMA IP核接收到电脑端发来的图片后,将图片写入板载DDR3中缓存;同时使用本博主常用的FDMA图像缓存架构将图片从板载DDR3中读出,在Native视频时序的同步下生成1920x1080@60Hz的RGB视频流,然后使用本博主常用的RGB转HDMI模块实现RGB视频到HDMI视频转换,并通过板载的HDMI视频接口输出;最后用显示器显示图片即可;板载PCIE为1 Lane的PCIE2.0;单Lane线速率配置为5GT/s;由此形成QT上位机+PCIE+XDMA+HDMI的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码2

开发板FPGA型号为Xilinx-->Kintex7--35T--xc7k325tffg900-2;输入源为电脑端的一张测试图片,大小为1920x1080,图片格式要求为BMP;打开QT上位机,将测试图片加载到QT上位机中,QT上位机将图片通过PCIE总线发送到FPGA板卡,还可以从FPGA板卡读回图片并显示;FPGA内部的XDMA IP核接收到电脑端发来的图片后,将图片写入板载DDR3中缓存;同时使用本博主常用的FDMA图像缓存架构将图片从板载DDR3中读出,在Native视频时序的同步下生成1920x1080@60Hz的RGB视频流,然后使用本博主常用的RGB转HDMI模块实现RGB视频到HDMI视频转换,并通过板载的HDMI视频接口输出;最后用显示器显示图片即可;板载PCIE为4 Lane的PCIE2.0;单Lane线速率配置为5GT/s;由此形成QT上位机+PCIE+XDMA+HDMI的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码3

开发板FPGA型号为Xilinx-->Zynq7100--xc7z100ffg900-2;输入源为电脑端的一张测试图片,大小为1920x1080,图片格式要求为BMP;打开QT上位机,将测试图片加载到QT上位机中,QT上位机将图片通过PCIE总线发送到FPGA板卡,还可以从FPGA板卡读回图片并显示;FPGA内部的XDMA IP核接收到电脑端发来的图片后,将图片写入板载DDR3中缓存;同时使用本博主常用的FDMA图像缓存架构将图片从板载DDR3中读出,在Native视频时序的同步下生成1920x1080@60Hz的RGB视频流,然后使用本博主常用的RGB转HDMI模块实现RGB视频到HDMI视频转换,并通过板载的HDMI视频接口输出;最后用显示器显示图片即可;板载PCIE为8 Lane的PCIE2.0;单Lane线速率配置为5GT/s;由此形成QT上位机+PCIE+XDMA+HDMI的高端架构;该工程适用于PCIE接口的视频采集卡应用;

本文详细描述了FPGA实现PCIE图片采集转HDMI输出的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的高速接口领域;

提供完整的、跑通的工程源码和技术支持;

工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。

2、相关方案推荐

我已有的PCIE方案

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

此外,我的主页有中断模式的PCIE通信专栏,该专栏基于XDMA的中断模式实现与QT上位机的数据交互,以下是专栏地址:
点击直接前往

此外,还有基于RIFFA架构的PCIE通信专栏,以下是专栏地址:
点击直接前往

3、PCIE基础知识扫描

PCIe 总线架构与以太网的 OSI 模型类似,是一种分层协议架构,分为事务层(Transaction Layer)、数据链路层(Data Link Layer) 和物理层(Physical Layer)。这些层中的每一层都分为两部分:一部分处理出站(要发送的)信息,另一部分处理入站(接收的)信息,如下图:

事务层

事务层的主要责任是事务层包 TLP(Transaction Layer Packet)的组装和拆卸。事务层接收来自 PCIe 设备核心层的数据,并将其封装为 TLP。TLP 用于传达事务,例如读取和写入,以及确定事件的类型。事务层还负责管理 TLP 的基于信用的流控制。每个需要响应数据包的请求数据包都作为拆分事务实现。每个数据包都有一个唯一标识符,该标识符使响应数据包可以定向到正确的始发者。数据包格式支持不同形式的寻址,具体取决于事务的类型(内存、I/O、配置和消息)。数据包可能还具有诸如 No Snoop、Relaxed Ordering 和基于 ID 的排序(IDO)之类的属性。事务层支持四个地址空间:包括三个 PCI 地址空间(内存、I/O 和配置)并添加消息空间。该规范使用消息空间来支持所有先前 PCI 的边带信号,例如中断、电源管理请求等,作为带内消息事务。

数据链路层

数据链路层充当事务层和物理层之间的中间阶段。数据链路层的主要职责包括链路管理和数据完整性,包括错误检测和错误纠正。数据链路层的发送方接受事务层组装的 TLP,计算并应用数据保护代码和 TLP序列号,以及将它们提交给物理层以在链路上传输。接收数据链路层负责检查接收到的 TLP 的完整性,并将它们提交给事务层以进行进一步处理。在检测到 TLP 错误时,此层负责请求重发 TLP,直到正确接收信息或确定链路失败为止。数据链路层还生成并使用用于链路管理功能的数据包。为了将这些数据包与事务层(TLP)使用的数据包区分开,当指代在数据链路层生成和使用的数据包时,将使用术语"数据链路层数据包(DLLP)"。

物理层

PCIe 总线的物理层为 PCIe 设备间的数据通信提供传送介质,为数据传送提供可靠的物理环境。物理层包括用于接口操作的所有电路,包括驱动器和输入缓冲器、并行至串行和串行至并行转换、PLL 和阻抗匹配电路。它还包括与接口初始化和维护有关的逻辑功能。物理层以实现特定的格式与数据链路层交换信息。该层负责将从数据链路层接收的信息转换为适当的序列化格式,并以与连接到链路另一端的设备兼容的频率和通道宽度在 PCI Express 链路上传输该信息。物理层是 PCIe 体系结构最重要,也是最难以实现的组成部分(该层对用户透明,开发 PCIe 程序时无需关心)。PCIe 总线的物理层定义了 LTSSM (Link Training and Status State Machine)状态机,PCIe 链路使用该状态机管理链路状态,并进行链路训练、链路恢复和电源管理。PCIe 总线使用端到端的连接方式,在一条PCIe 链路的两端只能各连接一个设备,这两个设备互为数据发送端和数据接收端。由于 PCIe 是支持全双工通信的,所以发送端和接收端中都含有TX (发送逻辑) 和RX (接收逻辑)。在PCIe 总线的物理链路的一个数据通路(Lane) 中,有两组差分信号,共4 根信号线组成。其中发送端的TX 与接收端的RX 使用一组差分信号连接,该链路也被称为发送端的发送链路,也是接收端的接收链路;而发送端的RX 与接收端的TX 使用另一组差分信号连接,该链路也被称为发送端的接收链路,也是接收端的发送链路。一个PCIe 链路可以由多个Lane 组成。目前PCIe 链路可以支持1、2、4、8、12、16 和32 个Lane,即×1、×2、×4、×8、×12、×16 和×32 宽度的PCIe 链路。每一个Lane 上使用的总线频率与PCIe 总线使用的版本相关。

4、工程详细设计方案

工程设计原理框图

工程设计原理框图如下:

测试图片

输入源为电脑端的一张测试图片,大小为1920x1080,图片格式要求为BMP;我用到的测试图片如下:

该图片以放在QT上位机中,用户可直接使用,如下:

QT上位机

仅提供Win10版本的QT上位机,位置如下:

以Win10版本为例,源码位置如下:

以Win10版本下,可以点击已经编译好的QT软件直接运行,位置如下:

QT上位机运行效果如下:

XDMA配置及使用

根据Xilinx官方手册,XDMA框图如下:

由图可知,XDMA封装了Integrated Block for PCI Express IP,不仅完成了事务层的组包解包,还添加了完整的 DMA 引擎;

XDMA 一般情况下使用AXI4 接口,AXI4 接口可以加入到系统总线互联,适用于大数据量异步传输,而且通常情况下使用 XDMA 都会使用到 BRAM 或 DDR 内存;AXI4-Stream 接口适用于低延迟数据流传输。XDMA 允许在主机内存和 DMA 子系统之间移动数据。它通过对包含有关要传输的数据的源、目标和数量的信息的"描述符"进行操作来实现此目的。这些直接内存传输既可以用于主机到卡(Host to Card,H2C)的传输,也可以用与卡到主机(Card to Host,C2H)的传输。可以将 DMA 配置为由所有通道共享一个 AXI4 Master 接口,或者为每个启用的通道提供一个 AXI4-Stream 接口。内存传输是基于每个通道的描述符链接列表指定的,DMA 从主机内存和进程中获取这些链接列表。诸如描述符完成和错误之类的事件通过中断来发出信号。XDMA 还提供多达 16 条用户中断线,这些中断线会向主机生成中断。本设计需要配置为中断模式;如下图:

XDMA详情参考《AXI Bridge for PCI Express Gen3 Subsystem Product Guide(PG194)》;XDMA在Block Design中如下:

XDMA中断模块

XDMA中断模块和XDMA IP配合使用,XDMA中断模块主要执行两个任务,一是获取XDMA的状态,输出用户中断使能信号,以指示用户此时可以发起中断,该任务通过AXI_Lite接口与XDMA连接,其从机地址受PC端软件控制;二是转发用户中断给XDMA,当用户侧检测到XDMA处于可接受中断状态时,用户逻辑可以发起中断,XDMA中断模块将此中断转发给XDMA IP;将模块直接拖入Block Design中,显示如下:

FDMA图像缓存

FDMA图像缓存架构实现的功能是将输入视频缓存到板载DDR3中,由于调用了Xilinx官方的MIG作为DDR控制器,所以FDMA图像缓存架构就是实现用户数据到MIG的桥接作用;架构如下:

FDMA图像缓存架构由FDMA控制器+FDMA组成;FDMA实际上就是一个AXI4-FULL总线主设备,与MIG对接,MIG配置为AXI4-FULL接口;FDMA控制器实际上就是一个视频读写逻辑,以写视频为例,假设一帧图像的大小为M×N,其中M代表图像宽度,N代表图像高度;FDMA控制器每次写入一行视频数据,即每次向DDR3中写入M个像素,写N次即可完成1帧图像的缓存,本设计只用到了FDMA控制器的读功能,FDMA控制器IP配置如下:

FDMA图像缓存架构在Block Design中如下:

Native视频时序生成

Native视频时序模块负责生成1920x1080@60Hz的视频时序,用以同步FDMA输出的视频,并输出完整的RGB视频流,该模块十分简单,设计巧妙,用宏定义的方式定义了多种标准时序,用户可自由选择切换,如下:

该模块在代码架构中例化如下:

RGB转HDMI输出模块

RGB转HDMI输出模块将RGB视频编码为HDMI差分信号,HDMI输出模块采用verilog代码手写,可以用于FPGA的HDMI发送应用,该模块在代码架构中例化如下:

关于这个模块,请参考我之前的博客,博客地址:
点击直接前往

Windows版本XDMA驱动安装

提供Windows和Linux系统驱动,本章节介绍Windows下XDMA驱动安装;

Windows下驱动安装步骤如下:友情提示,Windows下驱动秩序安装一次即可;

第一步:使系统禁用签名并进入测试模式,方法如下:

也可百度其他方法实现上述目的,完成后电脑屏幕右下角应有如下显示:

第二步:定位到驱动目录下,提供Windows7和Windows10两个版本驱动,由于我的电脑选择Windows10,如下:

单击鼠标右键安装即可,如下:


第三步:下载FPGA工程bit到FPGA开发板,然后重启电脑,打开我的电脑-->管理-->设备管理器,应看到如下设备:

Linux版本XDMA驱动安装

提供Windows和Linux系统驱动,本章节介绍Linux下XDMA驱动安装;

Linux下驱动安装步骤如下:友情提示,Linux下,每次下载FPGA bit后都需要重启电脑才能安装驱动;

进入到Linux驱动目录下,一次执行以下两条指令即可安装,如下:

• 驱动编译终端指令:make -j8

•驱动安装终端指令:sudo insmod xdma.ko

工程源码架构

提供3套工程源码,以工程源码1为例,工程Block Design设计如下:

提供3套工程源码,以工程源码1为例,综合后的工程源码架构如下:

Vivado工程注意事项

Vivado工程需要配合修改过的Xilinx官方XDMA驱动和QT上位机一起使用,所以Vivado工程必须做到以下几点:

1:XDMA中的AXI4_Lite基地址必须设为0x44A00000,这是XDMA驱动修改的规定,感兴趣的可以去看驱动源码,配置如下;

2:MIG的DDR基地址必须从0x00000000开始,这是QT上位机代码的规定,感兴趣的可以去看QT源码,配置如下;

PCIE上板调试注意事项

1:必须先安装本博提供的XDMA驱动,详情请参考第4章节的《XDMA驱动及其安装》,Windows版本驱动只需安装一次;

2:Windows版本下载FPGA工程bit后需要重启电脑,电脑才能识别到XDMA驱动;程序固化后也需要重启电脑;Linux版本每次载FPGA工程bit后都需要重启电脑,都需要安装XDMA驱动;

3:FPGA板卡插在主机上后一般不需要额外供电,如果你的板子元器件较多功耗较大,则需要额外供电,详情咨询开发板厂家,当然,找我买板子的客户可以直接问我;

4:PCIE调试需要电脑主机,但笔记本电脑理论上也可以外接出来PCIE,详情百度自行搜索一下,电脑主机PCIE插槽不方便操作时可以使用延长线接出来,某宝有卖;

5、vivado工程源码1详解-->Artix7-100T,PCIE图片采集转HDMI输出版本

开发板FPGA型号:Xilinx--Artix7--xc7a100tfgg484-2;

FPGA开发环境:Vivado2019.1;

QT开发环境:VS2015 + Qt 5.12.10;

输入:电脑测试图片,分辨率1920x1080;

输出:HDMI,分辨率1920x1080@60Hz;

PC端到FDMA传输方案:PCIE传输;

图像缓存方案:FDMA图像缓存+DDR3颗粒;

PCIE底层方案:Xilinx XDMA;

PCIE详情:PCIE2.0版本,X1,5GT/s单lane线速率;

实现功能:FPGA实现PCIE图片采集转HDMI输出;

工程作用:此工程目的是让读者掌握FPGA实现PCIE图片采集转HDMI输出的设计能力,以便能够移植和设计自己的项目;

工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;

工程的资源消耗和功耗如下:

6、vivado工程源码2详解-->Kintex7-35T,PCIE图片采集转HDMI输出版本

开发板FPGA型号:Xilinx-->Kintex7--35T--xc7k325tffg900-2;

FPGA开发环境:Vivado2019.1;

QT开发环境:VS2015 + Qt 5.12.10;

输入:电脑测试图片,分辨率1920x1080;

输出:HDMI,分辨率1920x1080@60Hz;

PC端到FDMA传输方案:PCIE传输;

图像缓存方案:FDMA图像缓存+DDR3颗粒;

PCIE底层方案:Xilinx XDMA;

PCIE详情:PCIE2.0版本,X4,5GT/s单lane线速率;

实现功能:FPGA实现PCIE图片采集转HDMI输出;

工程作用:此工程目的是让读者掌握FPGA实现PCIE图片采集转HDMI输出的设计能力,以便能够移植和设计自己的项目;

工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;

工程的资源消耗和功耗如下:

7、vivado工程源码3详解-->Zynq7100,PCIE图片采集转HDMI输出版本

开发板FPGA型号:Xilinx-->Zynq7100--xc7z100ffg900-2;

FPGA开发环境:Vivado2019.1;

QT开发环境:VS2015 + Qt 5.12.10;

输入:电脑测试图片,分辨率1920x1080;

输出:HDMI,分辨率1920x1080@60Hz;

PC端到FDMA传输方案:PCIE传输;

图像缓存方案:FDMA图像缓存+DDR3颗粒;

PCIE底层方案:Xilinx XDMA;

PCIE详情:PCIE2.0版本,X8,5GT/s单lane线速率;

实现功能:FPGA实现PCIE图片采集转HDMI输出;

工程作用:此工程目的是让读者掌握FPGA实现PCIE图片采集转HDMI输出的设计能力,以便能够移植和设计自己的项目;

工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;

工程的资源消耗和功耗如下:

8、工程移植说明

vivado版本不一致处理

1:如果你的vivado版本与本工程vivado版本一致,则直接打开工程;

2:如果你的vivado版本低于本工程vivado版本,则需要打开工程后,点击文件-->另存为;但此方法并不保险,最保险的方法是将你的vivado版本升级到本工程vivado的版本或者更高版本;

3:如果你的vivado版本高于本工程vivado版本,解决如下:

打开工程后会发现IP都被锁住了,如下:

此时需要升级IP,操作如下:

FPGA型号不一致处理

如果你的FPGA型号与我的不一致,则需要更改FPGA型号,操作如下:


更改FPGA型号后还需要升级IP,升级IP的方法前面已经讲述了;

其他注意事项

1:由于每个板子的DDR不一定完全一样,所以MIG IP需要根据你自己的原理图进行配置,甚至可以直接删掉我这里原工程的MIG并重新添加IP,重新配置;

2:根据你自己的原理图修改引脚约束,在xdc文件中修改即可;

3:纯FPGA移植到Zynq需要在工程中添加zynq软核;

9、上板调试验证

准备工作

需要准备的器材如下:

测试图片;

FPGA开发板,没有开发板可以找本博提供;

带PCIE卡槽的电脑主机;

我的开发板了连接如下:

PCIE图片采集转HDMI输出效果演示

PCIE图片采集转HDMI输出效果如下:

XDMA图片转HDMI

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

福利:工程代码的获取

代码太大,无法邮箱发送,以某度网盘链接方式发送,

资料获取方式:私,或者文章末尾的V名片。

网盘资料如下:

此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务:

相关推荐
仲南音16 小时前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner1 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20201 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy2 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
无线视频解决方案2 天前
【无标题】
无线图传·hdmi·炬力北方·am8360d·编码芯片·方案商·未领科技
Rambo.xia2 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20202 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子2 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安3 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun3 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd