Zynq实现SDI视频解码PCIE传输 提供工程源码和QT上位机源码加技术支持
1、前言
PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽,是目前各行业高速接口的优先选择方向,具有很高的实用价值和学习价值;
本设计使用Xilinx官方的XDMA方案搭建基于Xilinx系列FPGA的PCIE通信平台,该方案只适用于Xilinx系列FPGA,一并提供了XDMA的安装驱动和QT上位机源代码,省去了使用XDMA繁琐的驱动寻找和上位机软件开发的不知所措,并以搭建好vivado工程,省去了不知道如何使用XDMA的尴尬,使得PCIE的使用变得简单易上手,而不用关心其复杂的PCIE协议;由于我的开发板只支持PCIE X8,所以提供的代码是PCIE X8架构,若需要PCIE X1、 X2、 X8、 X16、 X32的朋友,可自行修改本工程,也可关注我,我会实时发布新的工程。
本工程实现基础的PCIE通信,和QT上位机之间进行测速试验。
本文详细描述了Zynq纯verilog解码SDI视频并发送PCIE到上位机用QT现实采集视频的实现设计方案,利用开发板自带的SDI输入接口,实时采集HDMI输入视频,缓存DDR3后,一路经HDMI输出芯片输出显示器,另一路经XDMA,通过PCIE发送给QT上位机显示程序显示;达到SDI采集视频环出和PCIE输出到电脑端显示的同步操作,属于FPGA图像采集领域的高端项目。。。
工程代码编译通过后上板调试验证,文章末尾有演示视频,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
2、我已有的SDI编解码方案
我的主页有SDI视频专栏,既有FPGA纯逻辑资源的SDI编解码,其中有基于GTX的,也有基于GTH的编解码,又有基于例如GS2971/GS2972的SDI视频收发工程,既有普通的SDI接受发送,也有SDI视频的缩放、拼接、UDP传输、SFP光纤传输、PCIE传输等等;以下是专栏地址:
点击直接前往
3、我已有的PCIE方案
我的主页有PCIE通信专栏,既有基于RIFFA实现的PCIE方案,也有基于XDMA实现的PCIE方案;既有简单的数据交互、测速,也有应用级别的图像采集传输;既有纯FPGA的PCIE,也有zynq的PCIE;以下是专栏地址:
点击直接前往
4、基于zynq架构的PCIE
PCIE理论部分可自行百度或csdn或知乎学习理论知识,其实用了XDMA,已经不太需要直到PCIE复杂的协议和理论了。。。
这里重点讲讲基于zynq架构的PCIE设计方法;
我们知道,PCIE要与PC进行数据交互,必然需要用到FPGA外挂的DDR存储器作为“中介”;但zynq架构的FPGA有个特点,他的PL和PS侧都可以外挂DDR,那是否两边的DDR都能作为PCIE通信的“中介”呢?显然是鱼和熊掌不可得兼的;
先来看看zynq的HP总线,HP的最高位宽仅为64位,如下:
如果zynq给PL的参考时钟为150M,那么HP总带宽为150000000x64=9.6Gb;就算把参考时钟提高到惊人的200M,那么HP总带宽为200000000x64=12.8Gb;而XDMA的PCIE2.0单Line先速率为5Gb,PCIEX8的总先速率则为5x8=40Gb;很显然,使用PS侧DDR作为PCIE与PC通信的“中介”是不可能达到贷款需求的,再加之由于编码、协议等开销,可用带宽只能达到 80%,PS侧DDR更不可能了,所以只能选择PL侧DDR作为PCIE与PC通信的“中介”;
下面看看PL侧DDR为啥可以:
PL侧调用MIG,MIG的用户操作时钟为200M,AXI数据位宽为256位,所以理论带宽=200000000x256=51.2Gb;实际带宽=51.2x80%=40.96Gb;刚好满足PCIEX8 2.0的40Gb线速率;
这么详细的计算告诉你选择zynq的PL侧DDR的原因,够保姆级教学了吧。。。
5、总体设计思路和方案
总体设计思路和方案如下:
SDI摄像头
我用到的SDI摄像头输出视频分辨率1080P@30Hz;根据不同相机有所区别;
Gv8601a单端转差
Gv8601a起到均衡 EQ 功能,这里选用Gv8601a是因为抄袭了Xilinx官方的板子,当然也可以用其他型号器件。
GTX解串
GTX负责解串,将原始SDI视频解为20位的并行数据,我的板子是K7,所以用GTX,如果是A7的板子则用GTP,这里使用GTX并没有调用IP,而是直接调用GTXE2_CHANNEL和GTXE2_COMMON源语,这一点可谓将Xilinx的GTX资源用到了极致水平,值得好好品读,其实调用IP无非也就是把调用源语变得界面化而已,直接调用源语或许理解更为深刻,这一点,在市面上的所谓FPGA教程里都学不到。
SDI解码
调用SMPTE-SDI IP核实现,GTX只是将高速串行数据解为了并行,但并没有解析SDI协议,SMPTE-SDI IP核则完成了SDI协议的解码,去掉了SDI协议中的数据包信息和控制信息,解析出有效的视频数据,详细的SMPTE-SDI IP核接口定义请参考官方的使用手册;
VGA时序恢复
此模块的作用就是解码恢复出hs、vs以及de信号,即恢复正常的VGA视频时序;
要恢复正常的VGA视频时序,首先得看懂下面这张图:
根据这张表即可恢复出图像时序,具体看代码,这里一两句话实在讲不清楚,如果要完全讲明白,写5本书都搓搓有余;
YUV转RGB
这里就简单了,YUV4:4:4转RGB8:8:8,几条公式和几行代码的事儿,属于低端操作;
至此,SDI解码过程就完成了,接下来就是图像输出过程;
具体的SDI解码部分原理讲解,请参考我之前的文章:点击直接前往
图像缓存
本设计调用VDMA作为缓存,VDMA通过zynq的SDK配置;
PCIE发送通路
调用Xilinx官方的XDMA作为PCIE发送引擎,不需要了解PCIE复杂的协议,XDMA集成AXI4接口,直接与DDR3交互,用户通过DDR3的指定地址做数据读写即可;
具体的PCIE发送通路部分原理讲解,请参考我之前的文章:点击直接前往
SDI同步输出通路
SDI视频采集缓存后,读出数据送HDMI输出现实,这一步可作为QT上位机的参考,同步输出可比较PCIE视频传输的正确性,有的项目也有PCIE和HDMI同步输出的需求,所以这里设计得高度贴近真实项目。。。
HDMI发送使用ADV7511芯片,ADV7511需要i2c配置才能使用;本设计用zynq配置;
6、vivado工程详解
开发板FPGA型号:Xilinx--zynq--xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:3G-SDI;分辨率1920X1080@30Hz;
输出1:PCIE X8至电脑端QT上位机;
输出2:HDMI输出;分辨率1920X1080@60Hz;;
应用:SDI视频采集卡;
工程BD如下:
综合后的工程代码架构如下:
SDI解码部分源码如下:
SDI解码部分源码位置如图:
综合编译完成后的FPGA资源消耗和功耗预估如下:
7、驱动安装
提供提供Win系统驱动,目录如下:
驱动安装参考前面的测速试验:点击直接前往
8、QT上位机软件
QT显示上位机:提供源代码和可执行程序,发开版本为QT5.6.2;位置如下:
9、上板调试验证
SDI同步HDMI输出验证
PCIE输出验证
开启上位机测程序进行 PCIe 显示测试,打开下图的显示软件 pcie2screen,软件在如下位置,实验结果如下:
打开上位机以后可以看到软件暂停播放:
点击中间的按钮,开始播放SDI输入视频源的视频:
10、福利:工程代码的获取
福利:工程代码的获取
代码太大,无法邮箱发送,以百度网盘链接方式发送,
通过微信获取资料:
网盘资料如下: