UltraScale系列FPGA实现SDI转PCIE3.0采集卡,基于UltraScale GTH+XDMA架构,提供工程源码和技术支持

目录

UltraScale系列FPGA实现SDI转PCIE3.0采集卡,基于UltraScale GTH+XDMA架构,提供工程源码和技术支持

1、前言

FPGA实现SDI视频编解码现状;

目前FPGA实现SDI视频编解码有两种方案:一是使用专用编解码芯片,比如典型的接收器GS2971,发送器GS2972,优点是简单,比如GS2971接收器直接将SDI解码为并行的YCrCb422,GS2972发送器直接将并行的YCrCb422编码为SDI视频,缺点是成本较高,可以百度一下GS2971和GS2972的价格;另一种方案是使用FPGA逻辑资源部实现SDI编解码,利用Xilinx系列FPGA的GTP/GTX/GTH/GTY等资源实现解串,利用Xilinx系列FPGA的SMPTE UHD-SDI资源实现SDI编解码,优点是合理利用了FPGA资源,GT高速接口资源不用白不用,缺点是操作难度大一些,对FPGA开发者的技术水平要求较高。有意思的是,这两种方案在本博这里都有对应的解决方案,包括硬件的FPGA开发板、工程源码等等。本设计使用UltraScale GTH高速接口资源;

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的中断模式实现PCIE3.0通信;本架构既有简单的测速实验,也有视频采集应用;

工程概述

本设计基于Xilinx的UltraScale系列FPGA开发板实现SDI视频编解码,输入源为一个3G-SDI相机或者HDMI转3G-SDI盒子,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到FPGA开发板的BNC座子,然后同轴视频经过板载的LMH1219RTWR芯片实现单端转差分和均衡EQ的功能;然后差分SDI视频信号进入FPGA内部的UltraScale GTH高速资源,实现数据高速串行到并行的转换,本博称之为解串;解串后的并行视频再送入Xilinx系列FPGA特有的SMPTE UHD-SDI IP核进行SDI视频解码操作,并输出BT1120视频,至此,SDI视频解码操作已经完成,可以进行常规的图像处理操作了;

本设计的目的是输出解码的SDI视频,针对目前市面上的主流项目需求,本博设计了PCIE3.0输出;解码后的SDI视频送入BT1120转RGB模块实现视频格式转换,输出RGB888视频流;然后使用本博常用的FDMA图像缓存架构实现图像4帧缓存,缓存介质为板载的DDR4;每当缓存一帧视频完毕,就发起一次用户中断给XDMA,XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,XDMA再从DDR中读取一帧视频并通过PCIE3.0总线发送给QT上位机,QT上位机接收并显示当前采集的视频;本博客提供1套工程源码,具体如下:

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

工程源码1

开发板FPGA型号为Xilinx-->Kintex UltraScale--xcku040-ffva1156-2-i;输入视频为3G-SDI相机或者HDMI转3G-SDI盒子,输入分辨率为1920x1080@60Hz,输入视频经过板载的LMH1219RTWR芯片实现单端转差分和均衡EQ后送入FPGA;再经过UltraScale GTH将SDI视频解串为并行数据;再经过SMPTE UHD-SDI IP核将SDI解码BT1120数据;再经过BT1120转RGB模块将BT1120转换为RGB888视频;再经过本博主常用的FDMA图像缓存方案将视频写入DDR4做4帧缓存;每当缓存一帧视频完毕,就发起一次用户中断给XDMA,XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,XDMA再从DDR中读取一帧视频并通过PCIE3.0总线发送给QT上位机,QT上位机接收并显示当前采集的视频;该工程需要缓存,适用于Xilinx的UltraScale高端系列FPGA实现SDI转PCIE3.0采集卡场景;

本博客详细描述了UltraScale系列FPGA实现SDI转PCIE3.0采集卡,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;

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

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

免责声明

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

2、相关方案推荐

我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目

其实一直有朋友反馈,说我的博客文章太多了,乱花渐欲迷人,自己看得一头雾水,不方便快速定位找到自己想要的项目,所以本博文置顶,列出我目前已有的所有项目,并给出总目录,每个项目的文章链接,当然,本博文实时更新。。。以下是博客地址:
点击直接前往

本博已有的 SDI 编解码方案

我的博客主页开设有SDI视频专栏,里面全是FPGA编解码SDI的工程源码及博客介绍;既有基于GS2971/GS2972的SDI编解码,也有基于GTP/GTX资源的SDI编解码;既有HD-SDI、3G-SDI,也有6G-SDI、12G-SDI等;专栏地址链接如下:
点击直接前往

我已有的PCIE方案

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

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

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

本博客方案的PCIE2.0版本

本博客详细描述了FPGA视频采集转PCIE3.0传输的设计方案,但并不是所有FPGA都支持PCIE3.0,对于低端FPGA而言,PCIE2.0或许具有更多应用场景,恰好之前写过一篇PCIE2.0方案,设计基本与本片博客一样,只是XDMA配置的PCIE版本不一样,感兴趣的可以查看之前的博客,博客链接如下:
点击直接前往

本博客方案的RIFFA版本

本文详细描述了FPGA视频采集转PCIE3.0传输的设计方案,但并不是所有FPGA都支持PCIE3.0,对于低端FPGA而言,PCIE2.0或许具有更多应用场景,恰好之前写过一篇PCIE2.0方案,设计基本与本片博客一样,但是没有使用XDMA方案,而使用传输效率更高的RIFFA方案,感兴趣的可以查看之前的博客,博客链接如下:
点击直接前往

3、详细设计方案

设计原理框图

设计原理框图如下:

注意!!!!

注意!!!!
紫色箭头为:当前帧视频缓存完成信号
红色箭头为:XDMA从DDR读取视频流

本设计参考了Xilinx官方设计文档,官方的参考设计框图如下:

SDI 输入设备

SDI 输入设备可以是SDI相机,代码兼容HD/SD/3G-SDI三种模式;SDI相机相对比较贵,预算有限的朋友可以考虑用HDMI转SDI盒子模拟SDI相机,这种盒子某宝一百块左右;当使用HDMI转SDI盒子时,输入源可以用笔记本电脑,即用笔记本电脑通过HDMI线连接到HDMI转SDI盒子的HDMI输入接口,再用SDI线连接HDMI转SDI盒子的SDI输出接口到FPGA开发板,如下:

LMH1219RTWR 均衡器

LMH1219RTWR芯片实现单端转差分和均衡EQ的功能,这里选用LMH1219RTWR是因为借鉴了了Xilinx官方的方案,当然也可以用其他型号器件。LMH1219RTWR均衡器原理图如下:

UltraScale GTH 高速接口-->解串

本设计使用Xilinx特有的UltraScale GTH高速信号处理资源实现SDI差分视频信号的解串,对于SDI视频接收而言,UltraScale GTH起到解串的作用,即将输入的高速串行的差分信号解为并行的数字信号;UltraScale GTH的使用一般需要例化IP核,通过vivado的UI界面进行配置,但本设计需要对SD-SDI、HD-SDI、3G-SDI视频进行自动识别和自适应处理,所以需要使得UltraScale GTH具有动态改变线速率的功能,该功能可通过DRP接口配置,也可通过UltraScale GTH的rate接口配置此外,为了动态配置UltraScale GTH线速率,还需要UltraScale GTH控制模块,该模块参考了Xilinx的官方设计方案,具有动态监测SDI模式,动态配置DRP等功能;该方案参考了Xilinx官方的设计;UltraScale GTH 解串与串化模块代码架构如下:

UltraScale GTH IP核配置如下:

SMPTE UDH-SDI IP核

SMPTE UDH-SDI IP核是Xilinx系列FPGA特有的用于SDI视频编解码的IP,该IP配置使用非常简单,vivado的UI界面如下:

SMPTE UDH-SDI IP核必须与UltraScale GTH配合才能使用,对于SDI视频接收而言,该IP接收来自于UltraScale GTH的数据,然后将SDI视频解码为BT1120视频输出,对于SDI视频发送而言,该IP接收来自于用户侧的的BT1120视频数据,然后将BT1120视频编码为SDI视频输出;该方案参考了Xilinx官方的设计;SMPTE UDH-SDI IP IP核代码架构如下:

BT1120转RGB

BT1120转RGB模块的作用是将SMPTE UDH-SDI IP核解码输出的BT1120视频转换为RGB888视频,它由BT1120转CEA861模块、YUV422转YUV444模块、YUV444转RGB888三个模块组成,该方案参考了Xilinx官方的设计;BT1120转RGB模块代码架构如下:

FDMA 图像缓存

FDMA图像缓存架构实现的功能是将输入视频缓存到板载DDR中再读出送后续模块,目的是实现视频同步输出,实现输入视频到输出视频的跨时钟域问题,更好的呈现显示效果;由于调用了Xilinx官方的MIG作为DDR控制器,所以FDMA图像缓存架构就是实现用户数据到MIG的桥接作用;架构如下:

FDMA图像缓存架构由FDMA控制器+FDMA组成;FDMA实际上就是一个AXI4-FULL总线主设备,与MIG对接,MIG配置为AXI4-FULL接口;FDMA控制器实际上就是一个视频读写逻辑,以写视频为例,假设一帧图像的大小为M×N,其中M代表图像宽度,N代表图像高度;FDMA控制器每次写入一行视频数据,即每次向DDR中写入M个像素,写N次即可完成1帧图像的缓存,读视频与之一样;同时调用两个FIFO实现输入输出视频的跨时钟域处理,使得用户可以AXI4内部代码,以简单地像使用FIFO那样操作AXI总线,从而达到读写DDR的目的,进而实现视频缓存;本设计图像缓存方式为4帧缓存;本设计只用到了FDMA控制器的写功能,FDMA控制器IP配置如下:

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

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线速率配置为8GT/s,这是PCIE3.0标准,如下:

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缓存一帧视频完毕,就通知用户中断发起逻辑发起一次用户中断操作,中断号几位当前缓存视频帧的帧号;用户中断通过中断模块发送给XDMA;XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,该过程同样由中断模块转发,XDMA再从DDR3中读取当前一帧视频并通过PCIE总线发送给QT上位机,QT上位机接收并显示当前采集的视频;核心代码如下:

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

QT上位机

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

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

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

Linux下必须先安装QT软件,然后打开QT工程才能运行,如下:

QT上位机运行效果如下:

工程源码架构

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

提供1套工程源码,以工程源码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插槽不方便操作时可以使用延长线接出来,某宝有卖;

4、工程源码1详解-->KU040版本

开发板FPGA型号:Xilinx-Kintex-UltraScale--xcku040-ffva1156-2-i;

开发环境:Vivado2019.1;

QT开发环境:VS2015 + Qt 5.12.10;

输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;

输出:PCIE3.0,分辨率1920x1080@60Hz;

SDI视频解串方案:Xilinx--UltraScale GTH高速接口解串;

SDI视频解码方案:Xilinx--SMPTE UHD-SDI 解码;

图像缓存方案:FDMA图像缓存+DDR4颗粒+图像4帧缓存;

PCIE物理层方案:Xilinx XDMA IP核,中断模式;

PCIE接口详情:PCIE3.0版本,8 Lane,8GT/s单lane线速率;

实现功能:UltraScale系列FPGA实现SDI转PCIE3.0采集卡;

工程作用:此工程目的是让读者掌握Xilinx UltraScale系列FPGA实现SDI转PCIE3.0采集卡的设计能力,以便能够移植和设计自己的项目;

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

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

5、工程移植说明

vivado版本不一致处理

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

2:如果你的ivado版本低于本工程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软核;

6、上板调试验证

准备工作

需要准备的器材如下:

FPGA开发板;

SDI摄像头或HDMI转SDI盒子;

SDI转HDMI盒子;

HDMI显示器;

我的开发板了连接如下:

SDI视频采集转PCIE输出效果演示

SDI视频采集转PCIE输出效果如下:

SDI-XDMA

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

福利:工程代码的获取

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

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

网盘资料如下:

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

相关推荐
尤老师FPGA5 小时前
LVDS系列9:Xilinx 7系可编程输入延迟(二)
单片机·嵌入式硬件·fpga开发
内有小猪卖9 小时前
时序约束 记录
fpga开发
Cao12345678932112 小时前
FPGA时钟设计
fpga开发
JNTeresa15 小时前
锁存器知识点详解
fpga开发
Cao12345678932118 小时前
FPGA基础之基础语法
fpga开发
一大Cpp19 小时前
通过Quartus II实现Nios II编程
fpga开发
7yewh19 小时前
Verilog 语法 (二)
fpga开发
边缘计算社区1 天前
FPGA与边缘AI:计算革命的前沿力量
人工智能·fpga开发
S&Z34631 天前
[官方IP] Shift RAM
网络协议·tcp/ip·fpga开发
S&Z34631 天前
[FPGA Video IP] Video Processing Subsystem
网络协议·tcp/ip·fpga开发·video