FPGA多路GS2971解码SDI视频缩放拼接转PCIE传输,基于XDMA中断架构,提供8套工程源码和技术支持

目录


FPGA多路GS2971解码SDI视频缩放拼接转PCIE传输,基于XDMA中断架构,提供8套工程源码和技术支持

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开发板、工程源码等等。本设计采用GS2971芯片解码方案;

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视频传输;输入源为一个3G-SDI相机或者HDMI转3G-SDI盒子,也可以使用SD-SDI或者HD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴串行的SDI视频解码为并行的BT1120格式视频,至此,SDI视频解码操作已经完成,可以进行常规的图像处理操作了;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;然后使用自研的、纯verilog实现的、支持任意比例缩放的图像缩放模块实现对输入视频的图像缩放操作,本设计由1920x1080缩放为96x540,你也可以缩放为自己需要的分辨率;然后使用本博常用的FDMA图像缓存架构实现图像缓存+多路视频拼接,该架构简单灵活,将不同的视频写入不同的内存地址再统一读出来,以达到拼接效果,缓存介质为板载DDR3;每当缓存一帧视频完毕,就发起一次用户中断给XDMA,XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,XDMA再从DDR中读取一帧视频并通过PCIE总线发送给QT上位机,QT上位机接收并显示当前采集的视频;本博客提供8套工程源码,具体如下:
在这里插入图片描述
现对上述8套工程源码做如下解释,方便读者理解:

工程源码1

开发板FPGA型号为Xilinx–>Artix7-100T–xc7a100tfgg484-2;输入源为一个3G-SDI相机或者HDMI转3G-SDI盒子,分辨率为1920x1080@60Hz,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴串行的SDI视频解码为并行的BT1120格式视频;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;转换后的RGB888视频复制为2份,以模拟2路视频输入;然后例化2路自研的、纯verilog实现的、支持任意比例缩放的图像缩放模块对输入SDI视频进行缩放操作,本设计由1920x1080缩放为960x540;然后例化2路本博常用的FDMA图像缓存方案将视频写入DDR3做4帧缓存,2路视频缓存地址不一样;每当缓存一帧视频完毕,就发起一次用户中断操作,用户中断通过中断模块发送给XDMA;XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,该过程同样由中断模块转发;XDMA再从DDR3中读取当前一帧视频,2路缓存地址不一样的视频从内存中一次性读出来,以达到拼接效果,然后通过PCIE总线发送给QT上位机,QT上位机接收并显示当前采集的视频;输出分辨率为1920x1080@60Hz背景下叠加显示2路960x540的有效图像,即2分屏,详细显示效果请看文章末尾的输出演示视频;板载PCIE为2 Lane的PCIE2.0;单Lane线速率配置为5GT/s;由此形成SDI相机+XDMA+PCIE+QT的高端架构;该工程适用于PCIE接口的SDI视频采集卡应用;

工程源码2

开发板FPGA型号为Xilinx–>Artix7-100T–xc7a100tfgg484-2;输入源为一个3G-SDI相机或者HDMI转3G-SDI盒子,分辨率为1920x1080@60Hz,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴串行的SDI视频解码为并行的BT1120格式视频;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;转换后的RGB888视频复制为4份,以模拟4路视频输入;然后例化4路自研的、纯verilog实现的、支持任意比例缩放的图像缩放模块对输入SDI视频进行缩放操作,本设计由1920x1080缩放为960x540;然后例化4路本博常用的FDMA图像缓存方案将视频写入DDR3做4帧缓存,4路视频缓存地址不一样;每当缓存一帧视频完毕,就发起一次用户中断操作,用户中断通过中断模块发送给XDMA;XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,该过程同样由中断模块转发;XDMA再从DDR3中读取当前一帧视频,4路缓存地址不一样的视频从内存中一次性读出来,以达到拼接效果,然后通过PCIE总线发送给QT上位机,QT上位机接收并显示当前采集的视频;输出分辨率为1920x1080@60Hz背景下叠加显示4路960x540的有效图像,即4分屏,详细显示效果请看文章末尾的输出演示视频;板载PCIE为2 Lane的PCIE2.0;单Lane线速率配置为5GT/s;由此形成SDI相机+XDMA+PCIE+QT的高端架构;该工程适用于PCIE接口的SDI视频采集卡应用;

工程源码3

开发板FPGA型号为Xilinx–>Kintex7–35T–xc7k325tffg900-2;输入源为一个3G-SDI相机或者HDMI转3G-SDI盒子,分辨率为1920x1080@60Hz,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴串行的SDI视频解码为并行的BT1120格式视频;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;转换后的RGB888视频复制为2份,以模拟2路视频输入;然后例化2路自研的、纯verilog实现的、支持任意比例缩放的图像缩放模块对输入SDI视频进行缩放操作,本设计由1920x1080缩放为960x540;然后例化2路本博常用的FDMA图像缓存方案将视频写入DDR3做4帧缓存,2路视频缓存地址不一样;每当缓存一帧视频完毕,就发起一次用户中断操作,用户中断通过中断模块发送给XDMA;XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,该过程同样由中断模块转发;XDMA再从DDR3中读取当前一帧视频,2路缓存地址不一样的视频从内存中一次性读出来,以达到拼接效果,然后通过PCIE总线发送给QT上位机,QT上位机接收并显示当前采集的视频;输出分辨率为1920x1080@60Hz背景下叠加显示2路960x540的有效图像,即2分屏,详细显示效果请看文章末尾的输出演示视频;板载PCIE为8 Lane的PCIE2.0;单Lane线速率配置为5GT/s;由此形成SDI相机+XDMA+PCIE+QT的高端架构;该工程适用于PCIE接口的SDI视频采集卡应用;

工程源码4

开发板FPGA型号为Xilinx–>Kintex7–35T–xc7k325tffg900-2;输入源为一个3G-SDI相机或者HDMI转3G-SDI盒子,分辨率为1920x1080@60Hz,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴串行的SDI视频解码为并行的BT1120格式视频;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;转换后的RGB888视频复制为4份,以模拟4路视频输入;然后例化4路自研的、纯verilog实现的、支持任意比例缩放的图像缩放模块对输入SDI视频进行缩放操作,本设计由1920x1080缩放为960x540;然后例化4路本博常用的FDMA图像缓存方案将视频写入DDR3做4帧缓存,4路视频缓存地址不一样;每当缓存一帧视频完毕,就发起一次用户中断操作,用户中断通过中断模块发送给XDMA;XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,该过程同样由中断模块转发;XDMA再从DDR3中读取当前一帧视频,4路缓存地址不一样的视频从内存中一次性读出来,以达到拼接效果,然后通过PCIE总线发送给QT上位机,QT上位机接收并显示当前采集的视频;输出分辨率为1920x1080@60Hz背景下叠加显示4路960x540的有效图像,即4分屏,详细显示效果请看文章末尾的输出演示视频;板载PCIE为8 Lane的PCIE2.0;单Lane线速率配置为5GT/s;由此形成SDI相机+XDMA+PCIE+QT的高端架构;该工程适用于PCIE接口的SDI视频采集卡应用;

工程源码5

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入源为一个3G-SDI相机或者HDMI转3G-SDI盒子,分辨率为1920x1080@60Hz,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴串行的SDI视频解码为并行的BT1120格式视频;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;转换后的RGB888视频复制为2份,以模拟2路视频输入;然后例化2路自研的、纯verilog实现的、支持任意比例缩放的图像缩放模块对输入SDI视频进行缩放操作,本设计由1920x1080缩放为960x540;然后例化2路本博常用的FDMA图像缓存方案将视频写入DDR3做4帧缓存,2路视频缓存地址不一样;每当缓存一帧视频完毕,就发起一次用户中断操作,用户中断通过中断模块发送给XDMA;XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,该过程同样由中断模块转发;XDMA再从DDR3中读取当前一帧视频,2路缓存地址不一样的视频从内存中一次性读出来,以达到拼接效果,然后通过PCIE总线发送给QT上位机,QT上位机接收并显示当前采集的视频;输出分辨率为1920x1080@60Hz背景下叠加显示2路960x540的有效图像,即2分屏,详细显示效果请看文章末尾的输出演示视频;板载PCIE为8 Lane的PCIE2.0;单Lane线速率配置为5GT/s;由此形成SDI相机+XDMA+PCIE+QT的高端架构;该工程适用于PCIE接口的SDI视频采集卡应用;

工程源码6

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入源为一个3G-SDI相机或者HDMI转3G-SDI盒子,分辨率为1920x1080@60Hz,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴串行的SDI视频解码为并行的BT1120格式视频;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;转换后的RGB888视频复制为4份,以模拟4路视频输入;然后例化4路自研的、纯verilog实现的、支持任意比例缩放的图像缩放模块对输入SDI视频进行缩放操作,本设计由1920x1080缩放为960x540;然后例化4路本博常用的FDMA图像缓存方案将视频写入DDR3做4帧缓存,4路视频缓存地址不一样;每当缓存一帧视频完毕,就发起一次用户中断操作,用户中断通过中断模块发送给XDMA;XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,该过程同样由中断模块转发;XDMA再从DDR3中读取当前一帧视频,4路缓存地址不一样的视频从内存中一次性读出来,以达到拼接效果,然后通过PCIE总线发送给QT上位机,QT上位机接收并显示当前采集的视频;输出分辨率为1920x1080@60Hz背景下叠加显示4路960x540的有效图像,即4分屏,详细显示效果请看文章末尾的输出演示视频;板载PCIE为8 Lane的PCIE2.0;单Lane线速率配置为5GT/s;由此形成SDI相机+XDMA+PCIE+QT的高端架构;该工程适用于PCIE接口的SDI视频采集卡应用;

工程源码7

开发板FPGA型号为Xilinx–Kintex UltraScale–xcku060-ffva1156-2-i;输入源为一个3G-SDI相机或者HDMI转3G-SDI盒子,分辨率为1920x1080@60Hz,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴串行的SDI视频解码为并行的BT1120格式视频;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;转换后的RGB888视频复制为2份,以模拟2路视频输入;然后例化2路自研的、纯verilog实现的、支持任意比例缩放的图像缩放模块对输入SDI视频进行缩放操作,本设计由1920x1080缩放为960x540;然后例化2路本博常用的FDMA图像缓存方案将视频写入DDR4做4帧缓存,2路视频缓存地址不一样;每当缓存一帧视频完毕,就发起一次用户中断操作,用户中断通过中断模块发送给XDMA;XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,该过程同样由中断模块转发;XDMA再从DDR4中读取当前一帧视频,2路缓存地址不一样的视频从内存中一次性读出来,以达到拼接效果,然后通过PCIE总线发送给QT上位机,QT上位机接收并显示当前采集的视频;输出分辨率为1920x1080@60Hz背景下叠加显示2路960x540的有效图像,即2分屏,详细显示效果请看文章末尾的输出演示视频;板载PCIE为8 Lane的PCIE3.0;单Lane线速率配置为5GT/s;由此形成SDI相机+XDMA+PCIE+QT的高端架构;该工程适用于PCIE接口的SDI视频采集卡应用;

工程源码8

开发板FPGA型号为Xilinx–Kintex UltraScale–xcku060-ffva1156-2-i;输入源为一个3G-SDI相机或者HDMI转3G-SDI盒子,分辨率为1920x1080@60Hz,也可以使用HD-SDI或者SD-SDI相机,因为本设计是三种SDI视频自适应的;同轴的SDI视频通过同轴线连接到GS2971转接板,GS2971解码芯片将同轴串行的SDI视频解码为并行的BT1120格式视频;然后使用纯verilog实现的BT1120转RGB模块实现视频格式转换后输出RGB888视频;转换后的RGB888视频复制为4份,以模拟4路视频输入;然后例化4路自研的、纯verilog实现的、支持任意比例缩放的图像缩放模块对输入SDI视频进行缩放操作,本设计由1920x1080缩放为960x540;然后例化4路本博常用的FDMA图像缓存方案将视频写入DDR4做4帧缓存,4路视频缓存地址不一样;每当缓存一帧视频完毕,就发起一次用户中断操作,用户中断通过中断模块发送给XDMA;XDMA收到用户中断后通知QT上位机发起一次XDMA读数据操作,该过程同样由中断模块转发;XDMA再从DDR4中读取当前一帧视频,4路缓存地址不一样的视频从内存中一次性读出来,以达到拼接效果,然后通过PCIE总线发送给QT上位机,QT上位机接收并显示当前采集的视频;输出分辨率为1920x1080@60Hz背景下叠加显示4路960x540的有效图像,即4分屏,详细显示效果请看文章末尾的输出演示视频;板载PCIE为8 Lane的PCIE3.0;单Lane线速率配置为5GT/s;由此形成SDI相机+XDMA+PCIE+QT的高端架构;该工程适用于PCIE接口的SDI视频采集卡应用;

本文详细描述了FPGA基于XDMA中断模式实现PCIE视频缩放拼接传输的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的高速接口领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

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

2、相关方案推荐

我已有的PCIE方案

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

本博已有的 SDI 编解码方案

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

本博已有的FPGA图像缩放方案

我的主页目前有FPGA图像缩放专栏,改专栏收录了我目前手里已有的FPGA图像缩放方案,从实现方式分类有基于HSL实现的图像缩放、基于纯verilog代码实现的图像缩放;从应用上分为单路视频图像缩放、多路视频图像缩放、多路视频图像缩放拼接;从输入视频分类可分为OV5640摄像头视频缩放、SDI视频缩放、MIPI视频缩放等等;以下是专栏地址:
点击直接前往

本博已有的已有的FPGA视频拼接叠加融合方案

我的主页目前有FPGA视频拼接叠加融合专栏,改专栏收录了我目前手里已有的FPGA视频拼接叠加融合方案,从实现方式分类有基于HSL实现的视频拼接、基于纯verilog代码实现的视频拼接;从应用上分为单路、2路、3路、4路、8路、16路视频拼接;视频缩放+拼接;视频融合叠加;从输入视频分类可分为OV5640摄像头视频拼接、SDI视频拼接、CameraLink视频拼接等等;以下是专栏地址:
点击直接前往

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、工程详细设计方案

工程设计原理框图

以工程源码1,2路SDI视频缩放拼接为例,工程详细设计方案框图如下:
在这里插入图片描述

SDI 输入设备

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

GS2971

本设计采用GS2971芯片解码SDI,GS2971不需要软件配置,硬件电阻上下拉即可完成配置,本设计配置为输出BT1120格式视频,当然,你在设计电路时也可以配置为输出CEA861格式视频;GS2971硬件架构如下,提供PDF格式原理图:
在这里插入图片描述

BT1120转RGB

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

纯Verilog图像缩放模块详解

本设计图像缩放模块使用纯Verilog方案,功能框图如下,由跨时钟FIFO、插值+RAM阵列构成,跨时钟FIFO的目的是解决跨时钟域的问题,比如从低分辨率视频放大到高分辨率视频时,像素时钟必然需要变大,这是就需要异步FIFO了,插值算法和RAM阵列具体负责图像缩放算法层面的实现;
在这里插入图片描述
插值算法和RAM阵列以ram和fifo为核心进行数据缓存和插值实现,设计架构如下:
在这里插入图片描述
图像缩放模块代码架构如下:模块的例化请参考工程源码的顶层代码;
在这里插入图片描述
图像缩放模块FIFO的选择可以调用工程对应的vivado工具自带的FIFO IP核,也可以使用纯verilog实现的FIFO,可通过接口参数选择,图像缩放模块顶层接口如下:

module helai_video_scale #(
	//---------------------------Parameters----------------------------------------
	parameter FIFO_TYPE          =	"xilinx",		// "xilinx" for xilinx-fifo ; "verilog" for verilog-fifo
	parameter DATA_WIDTH         =	8       ,		//Width of input/output data
	parameter CHANNELS           =	1       ,		//Number of channels of DATA_WIDTH, for color images
	parameter INPUT_X_RES_WIDTH  =	11      		//Widths of input/output resolution control signals	
)(
	input                            i_reset_n         ,    // 输入--低电平复位信号
	input  [INPUT_X_RES_WIDTH-1:0]   i_src_video_width ,	// 输入视频--即缩放前视频的宽度
	input  [INPUT_X_RES_WIDTH-1:0]   i_src_video_height,	// 输入视频--即缩放前视频的高度
	input  [INPUT_X_RES_WIDTH-1:0]   i_des_video_width ,	// 输出视频--即缩后前视频的宽度
	input  [INPUT_X_RES_WIDTH-1:0]   i_des_video_height,	// 输出视频--即缩后前视频的高度
	input                            i_src_video_pclk  ,	// 输入视频--即缩前视频的像素时钟
	input                            i_src_video_vs    ,	// 输入视频--即缩前视频的场同步信号,必须为高电平有效
	input                            i_src_video_de    ,	// 输入视频--即缩前视频的数据有效信号,必须为高电平有效
	input  [DATA_WIDTH*CHANNELS-1:0] i_src_video_pixel ,	// 输入视频--即缩前视频的像素数据
	input                            i_des_video_pclk  ,	// 输出视频--即缩后视频的像素时钟,一般为写入DDR缓存的时钟
	output                           o_des_video_vs    ,	// 输出视频--即缩后视频的场同步信号,高电平有效
	output                           o_des_video_de    ,	// 输出视频--即缩后视频的数据有效信号,高电平有效
	output [DATA_WIDTH*CHANNELS-1:0] o_des_video_pixel 		// 输出视频--即缩后视频的像素数据
);

FIFO_TYPE选择原则如下:
1:总体原则,选择"xilinx"好处大于选择"verilog";
2:当你的FPGA逻辑资源不足时,请选"xilinx";
3:当你图像缩放的视频分辨率较大时,请选"xilinx";
4:当你的FPGA没有FIFO IP或者FIFO IP快用完了,请选"verilog";
5:当你向自学一下异步FIFO时,,请选"verilog";
6:不同FPGA型号对应的工程FIFO_TYPE参数不一样,但选择原则一样,具体参考代码;

2种插值算法的整合与选择
本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;
具体选择参数如下:

input  wire i_scaler_type //0-->bilinear;1-->neighbor

通过输入i_scaler_type 的值即可选择;

输入0选择双线性插值算法;
输入1选择邻域插值算法;

代码里的配置如下:
在这里插入图片描述

纯Verilog图像缩放模块使用

图像缩放模块使用非常简单,顶层代码里设置了四个参数,举例如下:
在这里插入图片描述
上图视频通过图像缩放模块但不进行缩放操作,旨在掌握图像缩放模块的用法;如果需要将图像放大到1080P,则修改为如下:
在这里插入图片描述
当然,需要修改的不仅仅这一个地方,FDMA的配置也需要相应修改,详情请参考代码,但我想要证明的是,图像缩放模块使用非常简单,你都不需要知道它内部具体怎么实现的,上手就能用;

FDMA多路视频拼接算法

纯verilog多路视频拼接方案如下:以4路视频拼接为例;
在这里插入图片描述
输出屏幕分辨率为1920X1080;
需要拼接的4路视频分辨率为960X540;
4路输入刚好可以占满整个屏幕;
多路视频的拼接显示原理如下:
在这里插入图片描述
以把 2 个摄像头 CAM0 和 CAM1 输出到同一个显示器上为列,为了把 2 个图像显示到 1 个显示器,首先得搞清楚以下关系:
hsize:每 1 行图像实际在内存中占用的有效空间,以 32bit 表示一个像素的时候占用内存大小为 hsize X 4;
hstride:用于设置每行图像第一个像素的地址,以 32bit 表示一个像素的时候 v_cnt X hstride X 4;
vsize:有效的行;
因此很容易得出 cam0 的每行第一个像素的地址也是 v_cnt X hstride X 4;
同理如果我们需要把 cam1 在 hsize 和 vsize 空间的任何位置显示,我们只要关心 cam1 每一行图像第一个像素的地址,可以用以下公式 v_cnt X hstride X 4 + offset;
uifdma_dbuf 支持 stride 参数设置,stride 参数可以设置输入数据 X(hsize)方向每一行数据的第一个像素到下一个起始像素的间隔地址,利用 stride 参数可以非常方便地摆放输入视频到内存中的排列方式。
关于uifdma_dbuf,可以参考我之前写的文章点击查看:FDMA实现视频数据三帧缓存
根据以上铺垫,每路摄像头缓存的基地址如下:
CAM0:ADDR_BASE=0x80000000;
CAM1:ADDR_BASE=0x80000000+(1920-960)X4;
CAM2:ADDR_BASE=0x80000000+(1080-540)X1920X4;
CAM3:ADDR_BASE=0x80000000+(1080-540)X1920X4+(1920-960)X4;
地址设置完毕后基本就完事儿了;

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配置如下:
在这里插入图片描述
以4路视频拼接为例,需要调用4路FDMA,Block Design设计如下:
在这里插入图片描述
视频拼接的关键点在于4路视频在DDR3中缓存地址的不同,还是以4路视频拼接为例,4路FDMA的写地址以此为:
第一路视频缓存写基地址:0x00000000;
第二路视频缓存写基地址:0x00000f00;
第三路视频缓存写基地址:0x003f4800;
第四路视频缓存写基地址:0x003f5700;
视频缓存读基地址:0x00000000;

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缓存一帧视频完毕,就通知用户中断发起逻辑发起一次用户中断操作,中断号几位当前缓存视频帧的帧号;用户中断通过中断模块发送给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,2路SDI视频缩放拼接为例,工程Block Design设计如下:
在这里插入图片描述
以工程源码1,2路SDI视频缩放拼接为例,综合后的工程源码架构如下:
在这里插入图片描述

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,2路3G-SDI缩放拼接转PCIE输出

开发板FPGA型号:Xilinx–Artix7–xc7a100tfgg484-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;
输出:PCIE2.0,分辨率1920x1080下的960x540的2路视频拼接2分屏显示;
SDI视频解码方案:GS2971芯片方案;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到960x540;
图像缓存方案:FDMA图像缓存+DDR3颗粒+图像4帧缓存;
多路视频拼接方案:FDMA方案的2路视频拼接;
PCIE底层方案:Xilinx XDMA;
PCIE详情:PCIE2.0版本,X2,5GT/s单lane线速率;
实现功能:FPGA实现多路GS2971解码SDI视频拼接转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA实现多路GS2971解码SDI视频拼接转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

6、vivado工程源码2详解–>Artix7-100T,4路3G-SDI缩放拼接转PCIE输出

开发板FPGA型号:Xilinx–Artix7–xc7a100tfgg484-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;
输出:PCIE2.0,分辨率1920x1080下的960x540的4路视频拼接4分屏显示;
SDI视频解码方案:GS2971芯片方案;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到960x540;
图像缓存方案:FDMA图像缓存+DDR3颗粒+图像4帧缓存;
多路视频拼接方案:FDMA方案的4路视频拼接;
PCIE底层方案:Xilinx XDMA;
PCIE详情:PCIE2.0版本,X2,5GT/s单lane线速率;
实现功能:FPGA实现多路GS2971解码SDI视频拼接转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA实现多路GS2971解码SDI视频拼接转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

7、vivado工程源码3详解–>Kintex7-35T,2路3G-SDI缩放拼接转PCIE输出

开发板FPGA型号:Xilinx–>Kintex7–35T–xc7k325tffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;
输出:PCIE2.0,分辨率1920x1080下的960x540的2路视频拼接2分屏显示;
SDI视频解码方案:GS2971芯片方案;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到960x540;
图像缓存方案:FDMA图像缓存+DDR3颗粒+图像4帧缓存;
多路视频拼接方案:FDMA方案的2路视频拼接;
PCIE底层方案:Xilinx XDMA;
PCIE详情:PCIE2.0版本,X8,5GT/s单lane线速率;
实现功能:FPGA实现多路GS2971解码SDI视频拼接转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA实现多路GS2971解码SDI视频拼接转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

8、vivado工程源码4详解–>Kintex7-35T,4路3G-SDI缩放拼接转PCIE输出

开发板FPGA型号:Xilinx–>Kintex7–35T–xc7k325tffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;
输出:PCIE2.0,分辨率1920x1080下的960x540的4路视频拼接4分屏显示;
SDI视频解码方案:GS2971芯片方案;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到960x540;
图像缓存方案:FDMA图像缓存+DDR3颗粒+图像4帧缓存;
多路视频拼接方案:FDMA方案的4路视频拼接;
PCIE底层方案:Xilinx XDMA;
PCIE详情:PCIE2.0版本,X8,5GT/s单lane线速率;
实现功能:FPGA实现多路GS2971解码SDI视频拼接转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA实现多路GS2971解码SDI视频拼接转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

9、vivado工程源码5详解–>Zynq7100,2路3G-SDI缩放拼接转PCIE输出

开发板FPGA型号:Xilinx–>Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;
输出:PCIE2.0,分辨率1920x1080下的960x540的2路视频拼接2分屏显示;
SDI视频解码方案:GS2971芯片方案;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到960x540;
图像缓存方案:FDMA图像缓存+DDR3颗粒+图像4帧缓存;
多路视频拼接方案:FDMA方案的2路视频拼接;
PCIE底层方案:Xilinx XDMA;
PCIE详情:PCIE2.0版本,X8,5GT/s单lane线速率;
实现功能:FPGA实现多路GS2971解码SDI视频拼接转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA实现多路GS2971解码SDI视频拼接转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

10、vivado工程源码6详解–>Zynq7100,4路3G-SDI缩放拼接转PCIE输出

开发板FPGA型号:Xilinx–>Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;
输出:PCIE2.0,分辨率1920x1080下的960x540的4路视频拼接4分屏显示;
SDI视频解码方案:GS2971芯片方案;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到960x540;
图像缓存方案:FDMA图像缓存+DDR3颗粒+图像4帧缓存;
多路视频拼接方案:FDMA方案的4路视频拼接;
PCIE底层方案:Xilinx XDMA;
PCIE详情:PCIE2.0版本,X8,5GT/s单lane线速率;
实现功能:FPGA实现多路GS2971解码SDI视频拼接转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA实现多路GS2971解码SDI视频拼接转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

11、vivado工程源码7详解–>KU060,2路3G-SDI缩放拼接转PCIE输出

开发板FPGA型号:Xilinx–Kintex UltraScale–xcku060-ffva1156-2-i;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;
输出:PCIE2.0,分辨率1920x1080下的960x540的2路视频拼接2分屏显示;
SDI视频解码方案:GS2971芯片方案;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到960x540;
图像缓存方案:FDMA图像缓存+DDR4颗粒+图像4帧缓存;
多路视频拼接方案:FDMA方案的2路视频拼接;
PCIE底层方案:Xilinx XDMA;
PCIE详情:PCIE3.0版本,X8,5GT/s单lane线速率;
实现功能:FPGA实现多路GS2971解码SDI视频拼接转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA实现多路GS2971解码SDI视频拼接转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

12、vivado工程源码8详解–>KU060,4路3G-SDI缩放拼接转PCIE输出

开发板FPGA型号:Xilinx–Kintex UltraScale–xcku060-ffva1156-2-i;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:3G-SDI相机或HDMI转SDI盒子,分辨率1920x1080@60Hz;
输出:PCIE2.0,分辨率1920x1080下的960x540的4路视频拼接4分屏显示;
SDI视频解码方案:GS2971芯片方案;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到960x540;
图像缓存方案:FDMA图像缓存+DDR4颗粒+图像4帧缓存;
多路视频拼接方案:FDMA方案的4路视频拼接;
PCIE底层方案:Xilinx XDMA;
PCIE详情:PCIE3.0版本,X8,5GT/s单lane线速率;
实现功能:FPGA实现多路GS2971解码SDI视频拼接转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA实现多路GS2971解码SDI视频拼接转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第4章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

13、工程移植说明

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

14、上板调试验证

准备工作

需要准备的器材如下:
OV5640摄像头或者笔记本电脑,没有则请使用FPGA内部生成的彩条;
FPGA开发板,没有开发板可以找本博提供;
带PCIE卡槽的电脑主机;
我的开发板了连接如下:
在这里插入图片描述

2路SDI视频采集缩放拼接转PCIE输出效果演示

2路SDI视频采集缩放拼接转PCIE输出效果演示如下:

SDI拼接X2-XDMA中断

4路SDI视频采集缩放拼接转PCIE输出效果演示

4路SDI视频采集缩放拼接转PCIE输出效果演示如下:

SDI拼接X4-XDMA中断

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

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述
此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务:
在这里插入图片描述

FPGA(现场可编程门阵列)可以用于实现TCP/IP收发功能。要在FPGA上实现TCP/IP协议栈,可以采用软核或硬核的方式。 使用软核方式,可以选择开源的TCP/IP协议栈,如lwIP(lightweight IP)或uIP(micro IP)。这些协议栈通常是用C语言编写的,可以通过适当的编译和优化,将其部署在FPGA上运行。软核方式的优势是灵活性高,可以根据需求进行修改和定制。 使用硬核方式,可以使用专门设计的硬件模块来实现TCP/IP协议栈。这些硬件模块通常由IP核提供,可以直接集成到FPGA设计中。这种方式的优势是性能高,能够支持更高的数据吞吐量和更低的延迟。 在FPGA上实现TCP/IP收发功能时,需要考虑以下几个关键方面: 1. 硬件资源:TCP/IP协议栈需要消耗一定的逻辑资源和存储资源,需要根据具体的FPGA型号和资源限制进行评估和规划。 2. 接口设计:需要定义FPGA与外部网络接口之间的通信协议和数据格式,以及与应用层之间的接口。 3. 数据处理:FPGA需要能够解析和封装TCP/IP协议头部,处理数据包的分片和重组,实现TCP的连接管理和数据传输等功能。 4. 性能优化:可以通过合理的设计和优化来提高TCP/IP协议栈在FPGA上的性能,如并行处理、流水线设计、硬件加速等。 总之,使用FPGA实现TCP/IP收发功能需要综合考虑硬件资源、接口设计、协议实现和性能优化等方面的问题,以满足具体应用的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

9527华安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值