技术总结:FPGA基于GTX+RIFFA架构实现多功能SDI视频转PCIE采集卡设计方案

news2025/1/28 1:17:54

目录

  • 1、前言
    • 工程概述
    • 免责声明
  • 3、详细设计方案
    • 设计框图
    • SDI 输入设备
    • Gv8601a 均衡器
    • GTX 解串与串化
    • SMPTE SD/HD/3G SDI IP核
    • BT1120转RGB
    • FDMA图像缓存
    • RIFFA用户数据控制
    • RIFFA架构详解
    • Xilinx 7 Series Integrated Block for PCI Express
    • RIFFA驱动及其安装
    • QT上位机
    • HDMI输出
    • RGB转BT1120
    • Gv8500 驱动器
    • SDI转HDMI盒子
    • 工程设计源码层面架构
    • PCIE上板调试注意事项
    • FPGA工程编译注意事项
  • 4、设计方案1详解-->Kintex7-35T版本
  • 5、设计方案2详解-->Zynq7100版本
  • 6、工程移植说明
    • vivado版本不一致处理
    • FPGA型号不一致处理
    • 其他注意事项
  • 7、上板调试验证
    • 准备工作
    • SDI视频采集转PCIE输出效果演示

技术总结:FPGA基于GTX+RIFFA架构实现多功能SDI视频转PCIE采集卡设计方案

1、前言

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

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报文格式;本设计采用第二种方案,调用7 Series Integrated Block for PCI Express IP核,加上RIFFA架构实现PCIE通信,7 Series Integrated Block for PCI Express实现底层协议,RIFFA实现TLP报文组包、解包和轻量级DMA功能;本设计采用基于7 Series Integrated Block for PCI Express的RIFFA架构;

工程概述

本设计使用FPGA基于GTX+RIFFA架构实现多功能SDI视频采集卡;具体功能如下:
我的FPGA开发板硬件设计了2路SDI输入接口+2路SDI输出接口+PCIEX4接口+1路HDMI输出接口;
基于以上接口,设计了多功能SDI视频采集卡工程,具体如下:
第1路3G-SDI输入视频转PCIE输出给PC端电脑主机,并用QT上位机接收;
第1路3G-SDI输入视频转3G-SDI输出,并用显示器接收显示;
第2路3G-SDI输入视频转3G-SDI输出,并用显示器接收显示;
第2路3G-SDI输入视频转HDMI输出,并用显示器接收显示;

第1路SDI输入输出路径如下:
输入源为3G-SDI相机或者HDMI转3G-SDI盒子,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到FPGA开发板的BNC座子,然后同轴视频经过板载的Gv8601a芯片实现单端转差分和均衡EQ的功能;然后差分SDI视频信号进入FPGA内部的GTX高速资源,实现数据高速串行到并行的转换,本博称之为解串;解串后的并行视频再送入Xilinx系列FPGA特有的SMPTE SD/HD/3G SDI IP核,进行SDI视频解码操作并输出BT1120视频,至此,SDI视频解码操作已经完成,可以进行常规的图像处理操作了;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;然后使用2路本博主常用的FDMA图像缓存架构对采集视频做图像缓存,缓存介质为板载DDR3;其中1路视频从DDR3中读出,送入RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成SDI相机+RIFFA+PCIE+QT的高端架构;另外1路视频从DDR3中读出,送入纯Verilog实现的RGB转BT1120模块实现RGB888视频到BT1120视频流的转换;然后调用Xilinx官方的SMPTE SD/HD/3G SDI IP核实现HD-SDI视频编码操作;然后调用Xilinx官方的GTX原语,实现并行数据到高速串行的转换,差分高速信号再进入板载的Gv8500芯片实现差分转单端和驱动增强的功能,SDI视频通过FPGA开发板的BNC座子输出,最后通过同轴线连接到SDI转HDMI盒子连接到HDMI显示器;由此形成SDI相机+GTX+SDI输出的高端架构;

第2路SDI输入输出路径如下:
输入源为3G-SDI相机或者HDMI转3G-SDI盒子,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到FPGA开发板的BNC座子,然后同轴视频经过板载的Gv8601a芯片实现单端转差分和均衡EQ的功能;然后差分SDI视频信号进入FPGA内部的GTX高速资源,实现数据高速串行到并行的转换,本博称之为解串;解串后的并行视频再送入Xilinx系列FPGA特有的SMPTE SD/HD/3G SDI IP核,进行SDI视频解码操作并输出BT1120视频,至此,SDI视频解码操作已经完成,可以进行常规的图像处理操作了;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;然后使用2路本博主常用的FDMA图像缓存架构对采集视频做图像缓存,缓存介质为板载DDR3;其中1路视频从DDR3中读出,送入纯Verilog实现的RGB转BT1120模块实现RGB888视频到BT1120视频流的转换;然后调用Xilinx官方的SMPTE SD/HD/3G SDI IP核实现HD-SDI视频编码操作;然后调用Xilinx官方的GTX原语,实现并行数据到高速串行的转换,差分高速信号再进入板载的Gv8500芯片实现差分转单端和驱动增强的功能,SDI视频通过FPGA开发板的BNC座子输出,最后通过同轴线连接到SDI转HDMI盒子连接到HDMI显示器;由此形成SDI相机+GTX+SDI输出的高端架构;另外1路视频从DDR3中读出,送入纯verilog实现的GRB888转HDMI模块实现TMDS差分视频编码,最后视频输出到显示器显示;由此形成SDI相机+GTX+HDMI输出的高端架构;

针对市面上主流的FPGA,本博客设计了2套工程工程解决方案,具体如下:
在这里插入图片描述
现对上述2套工程工程解决方案做如下解释,方便读者理解:

工程解决方案1

开发板FPGA型号为Xilinx–>Kintex7–35T–xc7k325tffg484-2;输入源为2个3G-SDI相机或者HDMI转3G-SDI盒子,分辨率为1920x1080@60Hz,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;
第1路3G-SDI输入视频流向如下:
同轴的SDI视频通过同轴线连接到FPGA开发板的BNC座子,然后同轴视频经过板载的Gv8601a芯片实现单端转差分和均衡EQ的功能;然后差分SDI视频信号进入FPGA内部的GTX高速资源,实现数据高速串行到并行的转换,本博称之为解串;解串后的并行视频再送入Xilinx系列FPGA特有的SMPTE SD/HD/3G SDI IP核,进行SDI视频解码操作并输出BT1120视频,至此,SDI视频解码操作已经完成,可以进行常规的图像处理操作了;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;然后使用2路本博主常用的FDMA图像缓存架构对采集视频做图像缓存,缓存介质为板载DDR3;其中1路视频从DDR3中读出,送入RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机,输出分辨率为1920x1080@60Hz;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成SDI相机+RIFFA+PCIE+QT的高端架构;另外1路视频从DDR3中读出,送入纯Verilog实现的RGB转BT1120模块实现RGB888视频到BT1120视频流的转换;然后调用Xilinx官方的SMPTE SD/HD/3G SDI IP核实现HD-SDI视频编码操作;然后调用Xilinx官方的GTX原语,实现并行数据到高速串行的转换,差分高速信号再进入板载的Gv8500芯片实现差分转单端和驱动增强的功能,SDI视频通过FPGA开发板的BNC座子输出,最后通过同轴线连接到SDI转HDMI盒子连接到HDMI显示器;由此形成SDI相机+GTX+SDI输出的高端架构;
第2路3G-SDI输入视频流向如下:
同轴的SDI视频通过同轴线连接到FPGA开发板的BNC座子,然后同轴视频经过板载的Gv8601a芯片实现单端转差分和均衡EQ的功能;然后差分SDI视频信号进入FPGA内部的GTX高速资源,实现数据高速串行到并行的转换,本博称之为解串;解串后的并行视频再送入Xilinx系列FPGA特有的SMPTE SD/HD/3G SDI IP核,进行SDI视频解码操作并输出BT1120视频,至此,SDI视频解码操作已经完成,可以进行常规的图像处理操作了;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;然后使用2路本博主常用的FDMA图像缓存架构对采集视频做图像缓存,缓存介质为板载DDR3;其中1路视频从DDR3中读出,送入纯Verilog实现的RGB转BT1120模块实现RGB888视频到BT1120视频流的转换;然后调用Xilinx官方的SMPTE SD/HD/3G SDI IP核实现HD-SDI视频编码操作;然后调用Xilinx官方的GTX原语,实现并行数据到高速串行的转换,差分高速信号再进入板载的Gv8500芯片实现差分转单端和驱动增强的功能,SDI视频通过FPGA开发板的BNC座子输出,最后通过同轴线连接到SDI转HDMI盒子连接到HDMI显示器;由此形成SDI相机+GTX+SDI输出的高端架构;另外1路视频从DDR3中读出,送入纯verilog实现的GRB888转HDMI模块实现TMDS差分视频编码,最后视频输出到显示器显示,输出分辨率为1920x1080@60Hz;由此形成SDI相机+GTX+HDMI输出的高端架构;

工程解决方案2

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入源为2个3G-SDI相机或者HDMI转3G-SDI盒子,分辨率为1920x1080@60Hz,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;
第1路3G-SDI输入视频流向如下:
同轴的SDI视频通过同轴线连接到FPGA开发板的BNC座子,然后同轴视频经过板载的Gv8601a芯片实现单端转差分和均衡EQ的功能;然后差分SDI视频信号进入FPGA内部的GTX高速资源,实现数据高速串行到并行的转换,本博称之为解串;解串后的并行视频再送入Xilinx系列FPGA特有的SMPTE SD/HD/3G SDI IP核,进行SDI视频解码操作并输出BT1120视频,至此,SDI视频解码操作已经完成,可以进行常规的图像处理操作了;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;然后使用2路本博主常用的FDMA图像缓存架构对采集视频做图像缓存,缓存介质为Zynq PL端DDR3,不建议使用PS端DDR3做缓存,因为Zynq的HP接口数据位宽仅有64bit,可能影响视频传输效率;其中1路视频从DDR3中读出,送入RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机,输出分辨率为1920x1080@60Hz;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成SDI相机+RIFFA+PCIE+QT的高端架构;另外1路视频从DDR3中读出,送入纯Verilog实现的RGB转BT1120模块实现RGB888视频到BT1120视频流的转换;然后调用Xilinx官方的SMPTE SD/HD/3G SDI IP核实现HD-SDI视频编码操作;然后调用Xilinx官方的GTX原语,实现并行数据到高速串行的转换,差分高速信号再进入板载的Gv8500芯片实现差分转单端和驱动增强的功能,SDI视频通过FPGA开发板的BNC座子输出,最后通过同轴线连接到SDI转HDMI盒子连接到HDMI显示器;由此形成SDI相机+GTX+SDI输出的高端架构;
第2路3G-SDI输入视频流向如下:
同轴的SDI视频通过同轴线连接到FPGA开发板的BNC座子,然后同轴视频经过板载的Gv8601a芯片实现单端转差分和均衡EQ的功能;然后差分SDI视频信号进入FPGA内部的GTX高速资源,实现数据高速串行到并行的转换,本博称之为解串;解串后的并行视频再送入Xilinx系列FPGA特有的SMPTE SD/HD/3G SDI IP核,进行SDI视频解码操作并输出BT1120视频,至此,SDI视频解码操作已经完成,可以进行常规的图像处理操作了;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;然后使用2路本博主常用的FDMA图像缓存架构对采集视频做图像缓存,缓存介质为Zynq PL端DDR3,不建议使用PS端DDR3做缓存,因为Zynq的HP接口数据位宽仅有64bit,可能影响视频传输效率;其中1路视频从DDR3中读出,送入纯Verilog实现的RGB转BT1120模块实现RGB888视频到BT1120视频流的转换;然后调用Xilinx官方的SMPTE SD/HD/3G SDI IP核实现HD-SDI视频编码操作;然后调用Xilinx官方的GTX原语,实现并行数据到高速串行的转换,差分高速信号再进入板载的Gv8500芯片实现差分转单端和驱动增强的功能,SDI视频通过FPGA开发板的BNC座子输出,最后通过同轴线连接到SDI转HDMI盒子连接到HDMI显示器;由此形成SDI相机+GTX+SDI输出的高端架构;另外1路视频从DDR3中读出,送入纯verilog实现的GRB888转HDMI模块实现TMDS差分视频编码,最后视频输出到显示器显示,输出分辨率为1920x1080@60Hz;由此形成SDI相机+GTX+HDMI输出的高端架构;

免责声明

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

3、详细设计方案

设计框图

工程解决方案详细设计方案框图如下:
在这里插入图片描述

SDI 输入设备

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

Gv8601a 均衡器

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

GTX 解串与串化

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

SMPTE SD/HD/3G SDI IP核

SMPTE SD/HD/3G SDI IP核是Xilinx系列FPGA特有的用于SDI视频编解码的IP,该IP配置使用非常简单,vivado的UI界面如下:
在这里插入图片描述
SMPTE SD/HD/3G SDI IP核必须与GTX配合才能使用,对于SDI视频接收而言,该IP接收来自于GTX的数据,然后将SDI视频解码为BT1120视频输出,对于SDI视频发送而言,该IP接收来自于用户侧的的BT1120视频数据,然后将BT1120视频编码为SDI视频输出;该方案参考了Xilinx官方的设计;SMPTE SD/HD/3G SDI IP核代码架构如下:
在这里插入图片描述

BT1120转RGB

BT1120转RGB模块的作用是将SMPTE SD/HD/3G SDI IP核解码输出的BT1120视频转换为RGB888视频,它由BT1120转CEA861模块、YUV422转YUV444模块、YUV444转RGB888三个模块组成,该方案参考了Xilinx官方的设计;BT1120转RGB模块代码架构如下:
在这里插入图片描述

FDMA图像缓存

FDMA图像缓存架构实现的功能是将输入视频缓存到板载DDR3中再读出送RIFFA模块,目的是实现视频同步输出,实现输入视频到输出视频的跨时钟域问题,更好的呈现显示效果;由于调用了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帧图像的缓存,读视频与之一样;同时调用两个FIFO实现输入输出视频的跨时钟域处理,使得用户可以AXI4内部代码,以简单地像使用FIFO那样操作AXI总线,从而达到读写DDR的目的,进而实现视频缓存;本设计图像缓存方式为2帧乒乓缓存;图像缓存模块代码架构如下:
在这里插入图片描述

RIFFA用户数据控制

RIFFA用户数据控制模块的功能为产生读视频控制信号,控制视频读出并写入RIFFA模块;代码里设置了状态机,首先接收RIFFA模块的读数据请求,然后生成读视频控制信号控制视频读出,再根据RIFFA用户写时序将视频写入RIFFA,当写完一帧图像后再回来初始状态,由此形成循环;代码架构如下:
在这里插入图片描述

RIFFA架构详解

本设计使用的RIFFA 版本为RIFFA1.0;
RIFFA (Reusable Integration Framework for FPGA Accelerators) 是一个简单的框架,用于通过 PCI Express 总线将数据从主机 CPU 传输到 FPGA。该框架需要一个支持 PCIe 的工作站和一个带有 PCIe 连接器的主板上的 FPGA。RIFFA支持Windows和Linux,Altera和Xilinx,并绑定了C / C++,Python,MATLAB和Java。在软件方面有两个主要功能:数据发送和数据接收。这些函数通过 C/C++、Python、MATLAB 和 Java 中的用户库公开。该驱动程序支持每个系统多个 FPGA(最多 5 个)。软件绑定适用于 Linux 和 Windows 操作系统。用户只需编写几行代码即可与FPGA IP核进行通信。在硬件方面,用户访问具有独立发送和接收信号的接口。这些信号通过FIFO接口提供交易握手和第一个单词,用于读取/写入数据。无需了解总线地址、缓冲区大小或 PCIe 数据包格式。只需在FIFO接口上发送数据,在FIFO接口上接收数据即可。RIFFA不依赖于PCIe桥接器,因此不受网桥实现的限制。相反,RIFFA 直接与 PCIe 端点配合使用,并且运行速度足够快,使 PCIe 链路饱和。软件和硬件界面都得到了极大的简化。RIFFA架构如下:
在这里插入图片描述
RIFFA纯verilog代码架构如下:
在这里插入图片描述
复杂的代码架构需要长时间的品读才能消化,代码中提供了注释,感兴趣的可以去仔细研读并修改为自己项目需要的情景,对于普通开发者而言,其实只需要掌握RIFFA的用户逻辑即可完成数据读写操作,至于TLP包的封装与解包等操作,代码中已经做好了,一般不需要修改,除非需要定制功能和性能优化外;RIFFA用户逻辑接口及其详细注释如下:该接口位于riffa_wrapper.v;
在这里插入图片描述
RIFFA 框架不依赖 PCIe Bridge ,因此它不受桥连接的控制,这就实现了PCIe 通信链路的高带宽。下图显示了使用 32 位,64 位以及 128 位接口的RIFFA 框架性能图,图中的实线为理论上最大的带宽值,虚线为可实现的最大带宽值。PCIe Gen1 以及 PCIe Gen2 都是使用 8B/10B 编码方式,理论上的最大带宽利用率为 80%,在下图中我们可以看出在使用 32 位,64 位接口的情况下,RIFFA 框架可以实现理论上的最大带宽利用率 80%左右;在 128 位接口的情况下最大带宽利用率为 76%左右;
在这里插入图片描述
以PCIEX4为例,RIFFA模块资源消耗如下:
在这里插入图片描述

Xilinx 7 Series Integrated Block for PCI Express

7 Series Integrated Block for PCI Express是Xilinx官方推出的集成在FPGA内部的PCIE硬核IP;主要实现的是PCIe 的物理层、链路层和事务层,提供给用户的是以 AXI4-stream 接口定义的TLP 包,使用该IP 核,需要对PCIe 协议有清楚的理解,特别是对事务包TLP报文格式;7 Series Integrated Block for PCI Express例化使用十分简单,只是配置项比较多,但大部分保持默认即可,一般也用不到那么多功能,最主要的配置项如下:
在这里插入图片描述
7 Series Integrated Block for PCI Express在代码中调用如下:
在这里插入图片描述

RIFFA驱动及其安装

本设计提供RIFFA驱动源码,该源码既包括Windows也包括Linux,并提供Windows下的驱动安装可执行文件,如下:
在这里插入图片描述
Windows下驱动安装步骤如下:友情提示,Windows下驱动秩序安装一次即可;
第一步:使系统禁用签名并进入测试模式,方法如下:
在这里插入图片描述
也可百度其他方法实现上述目的,完成后电脑屏幕右下角应有如下显示:
在这里插入图片描述
第二步:修改可执行文件的兼容性,方法如下:
在这里插入图片描述
第三步:安装驱动,方法如下:
在这里插入图片描述
驱动装好后,下载FPGA工程bit,然后重启电脑,打开我的电脑–>管理–>设备管理器,应看到如下设备:
在这里插入图片描述

QT上位机

PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;QT上位机源码如下:
在这里插入图片描述
电脑端接收到 FPGA 开发板传来的数据是用户应用程序通过调用库函数fpga_rec才开始接收来自 FPGA 开发板的读请求,然后电脑端将数据分包接收;上位机运行样式如下:
在这里插入图片描述

HDMI输出

在HDMI输出方式下,使用HDMI输出模块将RGB视频编码为HDMI差分信号,HDMI输出模块采用verilog代码手写,可以用于FPGA的HDMI发送应用,代码如下:
在这里插入图片描述
关于这个模块,请参考我之前的博客,博客地址:点击直接前往

RGB转BT1120

在SDI输出方式下需要使用该模块;RGB转BT1200模块的作用是将用户侧的RGB视频转换为BT1200视频输出给SMPTE SD/HD/3G SDI IP核;RGB转BT1120模块由RGB888转YUV444模块、YUV444转YUV422模块、SDI视频编码模块、数据嵌入模块组成,该方案参考了Xilinx官方的设计;BT1120转RGB模块代码架构如下:
在这里插入图片描述

Gv8500 驱动器

Gv8500芯片实现差分转单端和增强驱动的功能,这里选用Gv8500是因为借鉴了了Xilinx官方的方案,当然也可以用其他型号器件。Gv8500驱动器原理图如下:
在这里插入图片描述

SDI转HDMI盒子

在SDI输出方式下需要使用到SDI转HDMI盒子,因为我手里的显示器没有SDI接口,只有HDMI接口,为了显示SDI视频,只能这么做,当然,如果你的显示器有SDI接口,则可直接连接显示,我的SDI转HDMI盒子在某宝购买,不到100块;

工程设计源码层面架构

工程源码由Bolck Design设计和模块例化组成,Bolck Design主要为基于FDMA架构的图像缓存;模块例化则为包括Bolck Design在内的整体代码架构;以设计方案1为例Bolck Design设计如下,其他设计方案与之类似:
在这里插入图片描述
以设计方案1为例,综合后的工程源码层面架构如下:
在这里插入图片描述

PCIE上板调试注意事项

1:必须先安装RIFFA-PCIE驱动,详情请参考第3章节的《RIFFA驱动及其安装》,驱动只需安装一次;
2:下载FPGA工程bit后需要重启电脑,电脑才能识别到RIFFA-PCIE驱动;程序固化后也需要重启电脑;
3:FPGA板卡插在主机上后一般不需要额外供电,如果你的板子元器件较多功耗较大,则需要额外供电,详情咨询开发板厂家,当然;
4:PCIE调试需要电脑主机,但笔记本电脑理论上也可以外接出来PCIE,详情百度自行搜索一下,电脑主机PCIE插槽不方便操作时可以使用延长线接出来,某宝有卖;

FPGA工程编译注意事项

由于RIFFA源码包含的头文件众多,所以在编译工程之前,必须设置全局包含文件,否则编译器找不到头文件导致报错,设置如下:
在这里插入图片描述

4、设计方案1详解–>Kintex7-35T版本

开发板FPGA型号:Xilinx-Kintex7–35T–xc7k325tffg484-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:2路3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;
第1路SDI输入视频的输出路径:PCIE2.0+3G-SDI,分辨率1920x1080@60Hz;
第2路SDI输入视频的输出路径:HDMI+3G-SDI,分辨率1920x1080@60Hz;
SDI视频解串方案:Xilinx–GTX高速接口解串;
SDI视频解码方案:Xilinx–SMPTE SD/HD/3G SDI解码;
HDMI视频编码方案:纯verilog编码;
图像缓存方案:FDMA图像缓存+DDR3颗粒;图像2帧乒乓缓存;
PCIE详情:PCIE2.0版本,X4,5GT/s单lane线速率;
PCIE底层方案:Xilinx 7 Series Integrated Block for PCI Express;
PCIE上层方案:RIFFA;
实现功能:FPGA基于GTX+RIFFA架构实现多功能SDI视频采集卡;
工程作用:此工程目的是让读者掌握FPGA基于GTX+RIFFA架构多功能SDI视频采集卡的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、设计方案2详解–>Zynq7100版本

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:2路3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;
第1路SDI输入视频的输出路径:PCIE2.0+3G-SDI,分辨率1920x1080@60Hz;
第2路SDI输入视频的输出路径:HDMI+3G-SDI,分辨率1920x1080@60Hz;
SDI视频解串方案:Xilinx–GTX高速接口解串;
SDI视频解码方案:Xilinx–SMPTE SD/HD/3G SDI解码;
HDMI视频编码方案:纯verilog编码;
图像缓存方案:FDMA图像缓存+PL端DDR3颗粒;图像2帧乒乓缓存;
PCIE详情:PCIE2.0版本,X4,5GT/s单lane线速率;
PCIE底层方案:Xilinx 7 Series Integrated Block for PCI Express;
PCIE上层方案:RIFFA;
实现功能:FPGA基于GTX+RIFFA架构实现多功能SDI视频采集卡;
工程作用:此工程目的是让读者掌握FPGA基于GTX+RIFFA架构多功能SDI视频采集卡的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

6、工程移植说明

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软核;

7、上板调试验证

准备工作

需要准备的器材如下:
SDI摄像头或HDMI转SDI盒子;
FPGA开发板;
PC主机;
显示器;
我的开发板连接如下:
在这里插入图片描述
下载FPGA工程bit,重启电脑,打开上位机软件,即可看到测速情况;

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

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

SDI-RIFFA-PCIE

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

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

相关文章

二叉树的最大深度(C语言详解版)

一、摘要 嗨喽呀大家,leetcode每日一题又和大家见面啦,今天要讲的是104.二叉树的最大深度,思路互相学习,有什么不足的地方欢迎指正!好啦让我们开始吧!!! 二、题目简介 给定一个二…

知识图谱抽取三元组技术介绍

知识图谱三元组抽取是知识图谱构建的重要步骤之一,其目的是从文本或数据中提取出结构化的信息,以形成实体、属性和关系之间的联系。这些三元组(Subject-Predicate-Object)是知识图谱的基本单元,用于描述实体之间的语义…

矩阵的秩在机器学习中具有广泛的应用

矩阵的秩在机器学习中具有广泛的应用,主要体现在以下几个方面: 一、数据降维与特征提取 主成分分析(PCA): PCA是一种常用的数据降维技术,它通过寻找数据中的主成分(即最大方差方向&#xff09…

【以音频软件FFmpeg为例】通过Python脚本将软件路径添加到Windows系统环境变量中的实现与原理分析

在Windows系统中,你可以通过修改环境变量 PATH 来使得 ffmpeg.exe 可在任意路径下直接使用。要通过Python修改环境变量并立即生效,如图: 你可以使用以下代码: import os import winreg as reg# ffmpeg.exe的路径 ffmpeg_path …

Linux-rt下卡死之hrtimer分析

Linux-rt下卡死之hrtimer分析 日志 超时读过程分析 #define readl_poll_timeout(addr, val, cond, delay_us, timeout_us) \readx_poll_timeout(readl, addr, val, cond, delay_us, timeout_us)34 #define readx_poll_timeout(op, addr, val, cond, sleep_us, timeout_us) \…

PHP防伪溯源一体化管理系统小程序

🔍 防伪溯源一体化管理系统,品质之光,根源之锁 🚀 引领防伪技术革命,重塑品牌信任基石 我们自豪地站在防伪技术的前沿,为您呈现基于ThinkPHP和Uniapp精心锻造的多平台(微信小程序、H5网页&…

WPF2-在xaml为对象的属性赋值

1. AttributeValue方式 1.1. 简单属性赋值1.2. 对象属性赋值 2. 属性标签的方式给属性赋值3. 标签扩展 (Markup Extensions) 3.1. StaticResource3.2. Binding 3.2.1. 普通 Binding3.2.2. ElementName Binding3.2.3. RelativeSource Binding3.2.4. StaticResource Binding (带参…

uart iic spi三种总线的用法

1、uart串口通信 这种连接方式抗干扰能力弱,旁边有干扰源就会对收发的电平数据造成干扰,进而导致数据失真 这种连接方式一般适用于一块板子上面的两个芯片之间进行数据传输 ,属于异步全双工模式。 1.空闲位:当不进行数据收发时&am…

Java 高级工程师面试高频题:JVM+Redis+ 并发 + 算法 + 框架

前言 在过 2 个月即将进入 3 月了,然而面对今年的大环境而言,跳槽成功的难度比往年高了很多,很明显的感受就是:对于今年的 java 开发朋友跳槽面试,无论一面还是二面,都开始考验一个 Java 程序员的技术功底…

【图文详解】lnmp架构搭建Discuz论坛

安装部署LNMP 系统及软件版本信息 软件名称版本nginx1.24.0mysql5.7.41php5.6.27安装nginx 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 关闭防火墙 systemctl stop firewalld &&a…

【番外篇】排列组合实现算法2(Java版)

一、说明 在牛客网的很多算法试题中,很多试题底层都是基于排列组合算法实现的,比如动态规划、最优解、最大值等常见问题。排列组合算法有一定的难度,并不能用一般的多重嵌套循环解决,没有提前做针对性的学习和研究,考…

PAT甲级-1020 Tree Traversals

题目 题目大意 给出一棵树的后序遍历和中序遍历,要求输出该树的层序遍历。 思路 非常典型的树的构建与遍历问题。后序遍历和中序遍历可以得出一个树的结构,用递归锁定根节点,然后再遍历左右子树,我之前发过类似题目的博客&…

GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁

利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统(GIS)在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…

【AppleID】注册M区AppleID 2025年

注册(一台电脑一天只能注册一个) https://account.apple.com/ 需任意邮箱,任意手机 手机上登录后填地址 示例

frida的常用api

1、Hook普通方法、打印参数和修改返回值 Hook函数 Hook代码 function hookTest1(){var utils Java.use("com.zj.wuaipojie.Demo");utils.a.implementation function(str){// a "test";var retval this.a(str);console.log(str , retval);return retva…

基于C语言的数组从入门到精通

简介:本篇文章主要介绍了一维数组,二维数组,字符数组的定义,数组的应用,数组的核心代码解析,适用于0基础的初学者. C语言数组 1.一维数组 1.1定义 1.1.1声明 语法:数据类型 数组名[数组大小];示例:int arr[5]; 1.1.2初始化 a.静态初始化 完全初始化:int arr[5] {1…

【Elasticsearch】inference ingest pipeline

Elasticsearch 的 Ingest Pipeline 功能允许你在数据索引之前对其进行预处理。通过使用 Ingest Pipeline,你可以执行各种数据转换和富化操作,包括使用机器学习模型进行推理(inference)。这在处理词嵌入、情感分析、图像识别等场景…

【线性代数】基础版本的高斯消元法

[精确算法] 高斯消元法求线性方程组 线性方程组 考虑线性方程组, 已知 A ∈ R n , n , b ∈ R n A\in \mathbb{R}^{n,n},b\in \mathbb{R}^n A∈Rn,n,b∈Rn, 求未知 x ∈ R n x\in \mathbb{R}^n x∈Rn A 1 , 1 x 1 A 1 , 2 x 2 ⋯ A 1 , n x n b 1…

漏洞修复:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)

文章目录 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修复建议升级Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修复建议III 安全警告引言 解决方案:升级到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…

算法每日双题精讲 —— 二分查找(山脉数组的峰顶索引,寻找峰值)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧💪 在算法的…