FPGA实现SFP光口视频转PCIE传输,基于GTX 8b/10b编解码+RIFFA架构,提供6套工程源码和技术支持


FPGA实现SFP光口视频转PCIE传输,基于GTX 8b/10b编解码+RIFFA架构,提供6套工程源码和技术支持

1、前言

FPGA实现SFP光口视频编解码现状;
目前基于Xilinx系列FPGA的SFP光口视频编解码主要有以下2种,Artix7系列的GTP、Kintex7系列的GTX、更高端FPGA器件的GTH、GTY、GTV、GTM等,线速率越来越高,应用场景也越来越高端;编码方式也是多种多样,有8b/10b编解码、64b/66b编解码、HDMI编解码、SDI编解码等等;本设计采用7系列的GTX作为高速接口、8b/10b编解码的方式实现SFP光口视频编解码;

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功能;本架构既有简单的测速实验,也有视频采集应用;

工程概述

本设计基于GTX+RIFFA架构架构实现SFP光口视频转PCIE传输;
视频输入源有多种,一种是板载的HDMI输入接口,另一种是传统的OV5640摄像头;FPGA首先对摄像头进行i2c初始化配置,然后采集摄像头视频;然后采集视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTX IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTX IP核实现视频8b/10b解码和数据解串,将高速串行数据解为并行;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用本博主常用的FDMA图像缓存架构对采集视频做图像缓存,缓存介质为板载DDR3;然后将采集视频从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实现视频数据显示;由此形成Sensor+GTX+RIFFA+PCIE+QT的高端架构;针对市面上主流的FPGA,本博客提供6套工程源码,具体如下:
在这里插入图片描述
现对上述6套工程源码做如下解释,方便读者理解:

工程源码1

开发板FPGA型号为Xilinx–>Kintex7–35T–xc7k325tffg676-2;输入视频为OV5640摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTX IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTX IP核实现视频8b/10b解码和数据解串,将高速串行数据解为并行;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用本博主常用的FDMA图像缓存架构对SDI视频做2帧乒乓缓存,缓存介质为板载DDR3;然后将采集视频从DDR3中读出,送入RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机,输出分辨率为1280x720@60Hz;板载PCIE为4 Lane的PCIE2.0;单Lane线速率配置为5GT/s;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+GTX+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码2

开发板FPGA型号为Xilinx–>Kintex7–35T–xc7k325tffg676-2;输入视频为板载的HDMI输入接口,使用笔记本电脑模拟HDMI输入设备连接到开发板HDMI输入接口;HDMI解码方式为IT6802芯片方案;FPGA首先使用纯Verilog实现的i2c总线对IT6802芯片进行初始化配置,分辨率配置为1920x1080@60Hz;然后采集视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTX IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTX IP核实现视频8b/10b解码和数据解串,将高速串行数据解为并行;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用本博主常用的FDMA图像缓存架构对SDI视频做2帧乒乓缓存,缓存介质为板载DDR3;然后将采集视频从DDR3中读出,送入RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机,输出分辨率为1920x1080@60Hz;板载PCIE为4 Lane的PCIE2.0;单Lane线速率配置为5GT/s;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+GTX+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码3

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入视频为OV5640摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTX IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTX IP核实现视频8b/10b解码和数据解串,将高速串行数据解为并行;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用本博主常用的FDMA图像缓存架构对SDI视频做2帧乒乓缓存,缓存介质为Zynq PL端DDR3,不建议使用PS端DDR3做缓存,因为Zynq的HP接口数据位宽仅有64bit,可能影响视频传输效率;然后将采集视频从DDR3中读出,送入RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机,输出分辨率为1280x720@60Hz;板载PCIE为4 Lane的PCIE2.0;单Lane线速率配置为5GT/s;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+GTX+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码4

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入视频为板载的HDMI输入接口,使用笔记本电脑模拟HDMI输入设备连接到开发板HDMI输入接口;HDMI解码方式为纯VHDL代码方案;首先FPGA纯verilog实现的i2c配置模块完成HDMI RX的DDC接口配置,EDID配置为1920x1080@60Hz,使用纯VDHL代码实现的HDMI转RGB模块实现输入HDMI视频解码操作,并输出Native的RGB888视频流;为了支持1920x1080@60Hz,在硬件设计上需要加上驱动芯片,本设计采用TMDS141RHAR,也可采用其他型号;然后采集视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTX IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTX IP核实现视频8b/10b解码和数据解串,将高速串行数据解为并行;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用本博主常用的FDMA图像缓存架构对SDI视频做2帧乒乓缓存,缓存介质为Zynq PL端DDR3,不建议使用PS端DDR3做缓存,因为Zynq的HP接口数据位宽仅有64bit,可能影响视频传输效率;然后将采集视频从DDR3中读出,送入RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机,输出分辨率为1280x720@60Hz;板载PCIE为4 Lane的PCIE2.0;单Lane线速率配置为5GT/s;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+GTX+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码5

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入视频为OV5640摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTX IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTX IP核实现视频8b/10b解码和数据解串,将高速串行数据解为并行;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用本博主常用的FDMA图像缓存架构对SDI视频做2帧乒乓缓存,缓存介质为Zynq PL端DDR3,不建议使用PS端DDR3做缓存,因为Zynq的HP接口数据位宽仅有64bit,可能影响视频传输效率;然后将采集视频从DDR3中读出,送入RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机,输出分辨率为1280x720@60Hz;板载PCIE为8 Lane的PCIE2.0;单Lane线速率配置为2.5GT/s;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+GTX+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码6

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入视频为板载的HDMI输入接口,使用笔记本电脑模拟HDMI输入设备连接到开发板HDMI输入接口;HDMI解码方式为ADV7611芯片方案;FPGA首先使用纯Verilog实现的i2c总线对ADV7611芯片进行初始化配置,分辨率配置为1920x1080@60Hz;然后采集视频送入视频组包模块,将视频的每一行打上包头包尾标记以包的形式输出,以便接收方进行有效识别;让后调用Xilinx官方的GTX IP核实现视频8b/10b编码和数据串化,将并行数据串化为高速串行,线速率设置为5Gbps,编码后的视频通过板载的SFP光口的光纤输出;然后用板载的SFP光口的光纤接收视频,然后送入Xilinx官方的GTX IP核实现视频8b/10b解码和数据解串,将高速串行数据解为并行;然后数据送入数据对齐模块,实现错位数据对齐;然后数据送入视频解包模块,实现每一行的视频包头包尾拆解,并生成对应的场同步信号和数据有效信号输出;然后使用本博主常用的FDMA图像缓存架构对SDI视频做2帧乒乓缓存,缓存介质为Zynq PL端DDR3,不建议使用PS端DDR3做缓存,因为Zynq的HP接口数据位宽仅有64bit,可能影响视频传输效率;然后将采集视频从DDR3中读出,送入RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机,输出分辨率为1280x720@60Hz;板载PCIE为8 Lane的PCIE2.0;单Lane线速率配置为2.5GT/s;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+GTX+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

免责声明

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

2、相关方案推荐

我已有的PCIE方案

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

我已有的 GT 高速接口解决方案

我的主页有FPGA GT 高速接口专栏,该专栏有 GTP 、 GTX 、 GTH 、 GTY 等GT 资源的视频传输例程和PCIE传输例程,其中 GTP基于A7系列FPGA开发板搭建,GTX基于K7或者ZYNQ系列FPGA开发板搭建,GTH基于KU或者V7系列FPGA开发板搭建,GTY基于KU+系列FPGA开发板搭建;以下是专栏地址:
点击直接前往

3、详细设计方案

设计框图

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

OV5640摄像头i2c配置和数据采集

不同的工程对应不同的视频输入类型,但输入视频的摄像头或者解码芯片都需要i2c配置何和数据采集,本设计OV5640配置为分辨率1280x720@30Hz;下面介绍OV5640摄像头的i2c配置和数据采集,ov5640i的2c配置及采集代码如下:
在这里插入图片描述
OV5640摄像头i2c配置和数据采集模块顶层接口如下:

module helai_ov5640_rx #(
	parameter DELAY        = 1    ,	// 有的摄像头使用转接板与FPGA开发板连接,可能需要考虑上电延时
	parameter DEVID        = 8'h78,//8'h78 
	parameter IMAGE_WIDTH  = 1280 ,
	parameter IMAGE_HEIGHT = 720  ,
	parameter RGB_TYPE     = 1	   //0-->RGB565  1-->RGB888	
)(
	input         clk_25m     ,
	input         rst_n       ,
	output        cmos_scl    ,
	inout         cmos_sda    ,
	input         cmos_pclk_i ,	//input pixel clock.
	input         cmos_href_i ,	//input pixel hs signal.
	input         cmos_vsync_i,	//input pixel vs signal.
	input  [7:0]  cmos_data_i ,	//data.
	output        cmos_xclk_o ,	//output clock to cmos sensor.如果你的摄像头自带晶振,则此信号不需要
    output [23:0] ov5640_rgb  ,
    output        ov5640_de   ,
    output        ov5640_vs   ,
    output        ov5640_hs   ,
    output        clk_ce      ,
	output        cfg_done
);

IT6802的i2c配置

不同的工程对应不同的视频输入类型,但输入视频的摄像头或者解码芯片都需要i2c配置何和数据采集,下面介绍输入HDMI解码芯片IT6802摄像头的i2c配置,经过解码后的HDMI不需要数据采集,直接输出RGB888视频,本设计IT6802配置为分辨率1920x1080@60Hz;IT6802的i2c配置代码如下:
在这里插入图片描述
IT6802的i2c配置和数据采集模块顶层接口如下:

module it6802_rx_cap #(
	parameter   CLK_FREQ   = 50_000_000, //模块输入的时钟频率
	parameter   I2C_FREQ   = 250000     //IIC_SCL的时钟频率
)(
	input         clk          ,
	input         rst_n        ,
	input         i_it6802_clk ,
	input         i_it6802_hs  ,
	input         i_it6802_vs  ,
	input         i_it6802_de  ,
	input  [23:0] i_it6802_rgb , 
	output        o_it6802_sck ,
	inout         o_it6802_sda ,
	output        o_it6802_rstn,
    output        o_vout_pclk  ,
    output        o_vout_hs    ,
    output        o_vout_vs    ,
    output        o_vout_de    ,
	output [23:0] o_vout_rgb   
);

ADV7611解码芯片配置及采集

不同的工程对应不同的视频输入类型,但输入视频的摄像头或者解码芯片都需要i2c配置何和数据采集,下面介绍输入HDMI解码芯片ADV7611摄像头的i2c配置,经过解码后的HDMI不需要数据采集,直接输出RGB888视频,本设计ADV7611配置为分辨率1920x1080@60Hz;ADV7611的i2c配置代码如下:
在这里插入图片描述
ADV7611解码芯片配置及采集模块顶层接口如下:

module adv7611_cap (
	input              clk_50m        , 
	input              i_adv7611_clk  ,
	input              i_adv7611_hs   ,
	input              i_adv7611_vs   ,
	input              i_adv7611_de   ,	
	input  [23:0]      i_adv7611_rgb  ,
	output             o_adv7611_rstn ,
	output             iic_adv7611_sck,
	inout              iic_adv7611_sda,
	output             o_adv7611_clk  ,
	output reg         o_adv7611_hs   ,
	output reg         o_adv7611_vs   ,
	output reg         o_adv7611_de   ,	
	output reg  [23:0] o_adv7611_rgb  ,
	output             init_done      
);

纯VHDL实现的HDMI解码模块

输入Sensor是本工程的输入设备,其二为板载的HDMI输入接口,使用笔记本电脑接入HDMI输入接口,以模拟输入Sensor;为了支持1080P@60Hz的输入视频,在硬件设计上需要加上驱动芯片,本设计采用TMDS141RHAR,也可采用其他型号,参考原理图如下:
在这里插入图片描述
HDMI输入接口逻辑设计,必须要考虑DDC通信,即通过i2c总线与输入设备协商分辨率,即EDID配置;本设计提供纯verilog代码实现的i2c模块实现EDID配置;此外,TMDS差分视频进入FPGA IO后,需要将其解码为RGB视频,使用纯VDHL代码实现的HDMI转RGB模块实现输入HDMI视频解码操作,并输出Native的RGB888视频流,本博主已将该代码封装为了自定义IP,可在vivado中直接调用,如下:
在这里插入图片描述
HDMI转RGB模块代码架构如下:
在这里插入图片描述
纯VHDL实现的HDMI解码模块例化用法如下:

wire RX_DDC_OUT_scl_i;
wire RX_DDC_OUT_scl_o;
wire RX_DDC_OUT_scl_t;
wire RX_DDC_OUT_sda_i;
wire RX_DDC_OUT_sda_o;
wire RX_DDC_OUT_sda_t;	

dvi2rgb_0 hdmi_rx_vhdl (
	.TMDS_Clk_p   (i_hdmi_rx_clk_p ),        // input wire TMDS_Clk_p
	.TMDS_Clk_n   (i_hdmi_rx_clk_n ),        // input wire TMDS_Clk_n
	.TMDS_Data_p  (i_hdmi_rx_data_p),      // input wire [2 : 0] TMDS_Data_p
	.TMDS_Data_n  (i_hdmi_rx_data_n),      // input wire [2 : 0] TMDS_Data_n
	.RefClk       (clk_200m        ),                // input wire RefClk
	.aRst_n       (rst_n           ),                    // input wire aRst
	.vid_pData    (sensor_rgb      ),          // output wire [23 : 0] vid_pData
	.vid_pVDE     (sensor_de       ),            // output wire vid_pVDE
	.vid_pHSync   (sensor_hs       ),        // output wire vid_pHSync
	.vid_pVSync   (sensor_vs       ),        // output wire vid_pVSync
	.PixelClk     (sensor_clk      ),            // output wire PixelClk
	.aPixelClkLckd(                ),  // output wire aPixelClkLckd
	.pLocked      (                ),              // output wire pLocked
	.SDA_I        (RX_DDC_OUT_sda_i),                  // input wire SDA_I
	.SDA_O        (RX_DDC_OUT_sda_o),                  // output wire SDA_O
	.SDA_T        (RX_DDC_OUT_sda_t),                  // output wire SDA_T
	.SCL_I        (RX_DDC_OUT_scl_i),                  // input wire SCL_I
	.SCL_O        (RX_DDC_OUT_scl_o),                  // output wire SCL_O
	.SCL_T        (RX_DDC_OUT_scl_t),                  // output wire SCL_T
	.pRst_n       (rst_n           )                    // input wire pRst
);

视频数据组包

由于视频需要在GTX中通过aurora 8b/10b协议收发,所以数据必须进行组包,以适应aurora 8b/10b协议标准;视频数据组包模块代码位置如下:
在这里插入图片描述
首先,我们将16bit的视频存入FIFO中,存满一行时就从FIFO读出送入GTX发送;在此之前,需要对一帧视频进行编号,也叫作指令,GTX组包时根据固定的指令进行数据发送,GTX解包时根据固定的指令恢复视频的场同步信号和视频有效信号;当一帧视频的场同步信号上升沿到来时,发送一帧视频开始指令 0,当一帧视频的场同步信号下降沿到来时,发送一帧视频开始指令 1,视频消隐期间发送无效数据 0 和无效数据 1,当视频有效信号到来时将每一行视频进行编号,先发送一行视频开始指令,在发送当前的视频行号,当一行视频发送完成后再发送一行视频结束指令,一帧视频发送完成后,先发送一帧视频结束指令 0,再发送一帧视频结束指令 1;至此,一帧视频则发送完成,这个模块不太好理解,所以我在代码里进行了详细的中文注释,需要注意的是,为了防止中文注释的乱序显示,请用notepad++编辑器打开代码;指令定义如下:
在这里插入图片描述
注意!!!指令可以任意更改,但最低字节必须为bc;

GTX aurora 8b/10b 详解

这个就是调用GTX做aurora 8b/10b协议的数据编解码,代码位置如下:
在这里插入图片描述

GTX IP 简介

关于GTX介绍最详细的肯定是Xilinx官方的《ug476_7Series_Transceivers》,我们以此来解读:《ug476_7Series_Transceivers》的PDF文档我已放在了资料包里,文章末尾有获取方式;我用到的开发板FPGA型号为Xilinx Zynq7100;带有8路GTX资源,其中2路连接到了2个SFP光口,每通道的收发速度为 500 Mb/s 到 10.3125 Gb/s 之间。GTX收发器支持不同的串行传输接口或协议,比如 PCIE 1.1/2.0 接口、万兆网 XUAI 接口、OC-48、串行 RapidIO 接口、 SATA(Serial ATA) 接口、数字分量串行接口(SDI)等等;

GTX 基本结构

Xilinx 以 Quad 来对串行高速收发器进行分组,四个串行高速收发器和一个 COMMOM(QPLL)组成一个 Quad,每一个串行高速收发器称为一个 Channel(通道),下图为四路 GTX 收发器在Kintex7 FPGA 芯片中的示意图:《ug476_7Series_Transceivers》第24页;
在这里插入图片描述
GTX 的具体内部逻辑框图如下所示,它由四个收发器通道 GTXE2_CHANNEL原语 和一个GTXE2_COMMON 原语组成。每路GTXE2_CHANNEL包含发送电路 TX 和接收电路 RX,GTXE2_CHANNEL的时钟可以来自于CPLL或者QPLL,可在IP配置界面里配置;《ug476_7Series_Transceivers》第25页;
在这里插入图片描述
每个 GTXE2_CHANNEL 的逻辑电路如下图所示:《ug476_7Series_Transceivers》第26页;
在这里插入图片描述
GTXE2_CHANNEL 的发送端和接收端功能是独立的,均由 PMA(Physical Media Attachment,物理媒介适配层)和 PCS(Physical Coding Sublayer,物理编码子层)两个子层组成。其中 PMA 子层包含高速串并转换(Serdes)、预/后加重、接收均衡、时钟发生器及时钟恢复等电路。PCS 子层包含8B/10B 编解码、缓冲区、通道绑定和时钟修正等电路。
这里说多了意义不大,因为没有做过几个大的项目是不会理解这里面的东西的,对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用,后面我也会重点将到IP核的调用和使用;

GTX 发送和接收处理流程

首先用户逻辑数据经过 8B/10B 编码后,进入一个发送缓存区(Phase Adjust FIFO),该缓冲区主要是 PMA 子层和 PCS 子层两个时钟域的时钟隔离,解决两者时钟速率匹配和相位差异的问题,最后经过高速 Serdes 进行并串转换(PISO),有必要的话,可以进行预加重(TX Pre-emphasis)、后加重。值得一提的是,如果在 PCB 设计时不慎将 TXP 和 TXN 差分引脚交叉连接,则可以通过极性控制(Polarity)来弥补这个设计错误。接收端和发送端过程相反,相似点较多,这里就不赘述了,需要注意的是 RX 接收端的弹性缓冲区,其具有时钟纠正和通道绑定功能。这里的每一个功能点都可以写一篇论文甚至是一本书,所以这里只需要知道个概念即可,在具体的项目中回具体用到,还是那句话:对于初次使用或者想快速使用者而言,更多的精力应该关注IP核的调用和使用。

GTX 的参考时钟

GTX 模块有两个差分参考时钟输入管脚(MGTREFCLK0P/N 和 MGTREFCLK1P/N),作为 GTX 模块的参考时钟源,用户可以自行选择。一般的A7系列开发板上,都有一路 148.5Mhz 的 GTX 参考时钟连接到 MGTREFCLK0上,作为 GTX 的参考时钟。差分参考时钟通过IBUFDS 模块转换成单端时钟信号进入到 GTXE2_COMMOM 的QPLL或CPLL中,产生 TX 和 RX 电路中所需的时钟频率。TX 和 RX 收发器速度相同的话,TX 电路和 RX 电路可以使用同一个 PLL 产生的时钟,如果 TX 和 RX收发器速度不相同的话,需要使用不同的 PLL 时钟产生的时钟。参考时钟这里Xilinx给出的GT参考例程已经做得很好了,我们调用时其实不用修改;GTX 的参考时钟结构图如下:《ug476_7Series_Transceivers》第31页;
在这里插入图片描述

GTX 发送接口

《ug476_7Series_Transceivers》的第107到165页详细介绍了发送处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲GTX例化时留给用户的发送部分需要用到的接口;
在这里插入图片描述
用户只需要关心发送接口的时钟和数据即可,GTX例化模块的这部分接口如下:
在这里插入图片描述
在这里插入图片描述
在代码中我已为你们重新绑定并做到了模块的顶层,代码部分如下:
在这里插入图片描述

GTX 接收接口

《ug476_7Series_Transceivers》的第167到295页详细介绍了接收处理流程,其中大部分内容对于用户而言可以不去深究,因为手册讲的基本都是他自己的设计思想,留给用户可操作的接口并不多,基于此思路,我们重点讲讲GTX例化时留给用户的发送部分需要用到的接口;
在这里插入图片描述
用户只需要关心接收接口的时钟和数据即可,GTX例化模块的这部分接口如下:
在这里插入图片描述
在这里插入图片描述
在代码中我已为你们重新绑定并做到了模块的顶层,代码部分如下:
在这里插入图片描述

GTX IP核调用和使用

GTX IP核调用和使用很简单,通过vivado的UI界面即可完成,如下:
在这里插入图片描述
有别于网上其他博主的教程,我个人喜欢用如下图的共享逻辑:
在这里插入图片描述
这样选择的好处有两个,一是方便DRP变速,二是便于IP核的修改,修改完IP核后直接编译即可,不再需要打开example工程,再复制下面的一堆文件放到自己的工程什么的,玩儿个GTX需要那么复杂么?
在这里插入图片描述
这里对上图的标号做解释:
1:线速率,根据自己的项目需求来,GTX 的范围是0.5到10.3125G,由于我的项目是视频传输,所以在GTX 的速率范围内均可,本例程选择了5G;
2:参考时钟,这个得根据你的原理图来,可以是80M、125M、148.5M、156.25M等等,我的开发板是125M;
4:GTX 组的绑定,这个很重要,他的绑定参考依据有两个,已是你的开发板原理图,而是官方的参考资料《ug476_7Series_Transceivers》,官方根据BANK不同将GTX资源分成了多组,由于GT资源是Xilinx系列FPGA的专用资源,占用专用的Bnak,所以引脚也是专用的,那么这些GTX组和引脚是怎么对应的呢?《ug476_7Series_Transceivers》有说明;
我的板子原理图如下:
在这里插入图片描述
在这里插入图片描述
选择外部数据位宽32bit的8b/10b编解码,如下:
在这里插入图片描述
下面这里讲的是K码检测:
在这里插入图片描述
这里选择K28.5,也就是所谓的COM码,十六进制为bc,他的作用很多,可以表示空闲乱序符号,也可以表示数据错位标志,这里用来标志数据错位,8b/10b协议对K码的定义如下:
在这里插入图片描述
下面讲的是时钟矫正,也就是对应GTX内部接收部分的弹性buffer;
在这里插入图片描述
这里有一个时钟频偏的概念,特别是收发双方时钟不同源时,这里设置的频偏为100ppm,规定每隔5000个数据包发送方发送一个4字节的序列,接收方的弹性buffer会根据这4字节的序列,以及数据在buffer中的位置来决定删除或者插入一个4字节的序列中的一个字节,目的是确保数据从发送端到接收端的稳定性,消除时钟频偏的影响;

数据对齐

由于GT资源的aurora 8b/10b数据收发天然有着数据错位的情况,所以需要对接受到的解码数据进行数据对齐处理,数据对齐模块代码位置如下:
在这里插入图片描述
我定义的 K 码控制字符格式为:XX_XX_XX_BC,所以用一个rx_ctrl 指示数据是否为 K 码 的 COM 符号;
rx_ctrl = 4’b0000 表示 4 字节的数据没有 COM 码;
rx_ctrl = 4’b0001 表示 4 字节的数据中[ 7: 0] 为 COM 码;
rx_ctrl = 4’b0010 表示 4 字节的数据中[15: 8] 为 COM 码;
rx_ctrl = 4’b0100 表示 4 字节的数据中[23:16] 为 COM 码;
rx_ctrl = 4’b1000 表示 4 字节的数据中[31:24] 为 COM 码;
基于此,当接收到有K码时就对数据进行对齐处理,也就是将数据打一拍,和新进来的数据进行错位组合,这是FPGA的基础操作,这里不再赘述;

视频数据解包

数据解包是数据组包的逆过程,代码位置如下:
在这里插入图片描述
GTX解包时根据固定的指令恢复视频的场同步信号和视频有效信号;这些信号是作为后面图像缓存的重要信号;
至此,数据进出GTX部分就已经讲完了,整个过程的框图我在代码中描述了,如下:
在这里插入图片描述

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 开发板的读请求,然后电脑端将数据分包接收;上位机运行样式如下:
在这里插入图片描述

工程源码架构

工程源码由Bolck Design设计和模块例化组成,Bolck Design主要为基于FDMA架构的图像缓存;模块例化则为包括Bolck Design在内的整体代码架构;本博客提供6套Vivado工程源码,以工程源码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,OV5640输入SFP光口回环转PCIEX4输出版本

开发板FPGA型号:Xilinx-Kintex7–35T–xc7k325tffg484-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:PCIE2.0,分辨率1280x720@60Hz;
高速接口类型:GTX,线速率5Gbps;
GTX编解码类型:8b/10b编解码;
回环光口类型:SFP光口;
图像缓存方案:FDMA图像缓存+DDR3颗粒;图像2帧乒乓缓存;
PCIE详情:PCIE2.0版本,X4,5GT/s单lane线速率;
PCIE底层方案:Xilinx 7 Series Integrated Block for PCI Express;
PCIE上层方案:RIFFA;
实现功能:FPGA基于GTX+RIFFA架构实现SFP光口视频转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA基于GTX+RIFFA架构实现SFP光口视频转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、工程源码2详解–>Kintex7–35T,HDMI输入SFP光口回环转PCIEX4输出版本

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

6、工程源码3详解–>Zynq7100,OV5640输入SFP光口回环转PCIEX4输出版本

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:PCIE2.0,分辨率1280x720@60Hz;
高速接口类型:GTX,线速率5Gbps;
GTX编解码类型:8b/10b编解码;
回环光口类型:SFP光口;
图像缓存方案: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架构实现SFP光口视频转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA基于GTX+RIFFA架构实现SFP光口视频转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

7、工程源码4详解–>Zynq7100,HDMI输入SFP光口回环转PCIEX4输出版本

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:HDMI,纯VHDL解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:PCIE2.0,分辨率1920x1080@60Hz;
高速接口类型:GTX,线速率5Gbps;
GTX编解码类型:8b/10b编解码;
回环光口类型:SFP光口;
图像缓存方案: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架构实现SFP光口视频转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA基于GTX+RIFFA架构实现SFP光口视频转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

8、工程源码5详解–>Zynq7100,OV5640输入SFP光口回环转PCIEX8输出版本

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:PCIE2.0,分辨率1280x720@60Hz;
高速接口类型:GTX,线速率5Gbps;
GTX编解码类型:8b/10b编解码;
回环光口类型:SFP光口;
图像缓存方案:FDMA图像缓存+PL端DDR3颗粒;图像2帧乒乓缓存;
PCIE详情:PCIE2.0版本,X8,2.5GT/s单lane线速率;
PCIE底层方案:Xilinx 7 Series Integrated Block for PCI Express;
PCIE上层方案:RIFFA;
实现功能:FPGA基于GTX+RIFFA架构实现SFP光口视频转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA基于GTX+RIFFA架构实现SFP光口视频转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

9、工程源码6详解–>Zynq7100,HDMI输入SFP光口回环转PCIEX8输出版本

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:HDMI,ADV7611芯片解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:PCIE2.0,分辨率1920x1080@60Hz;
高速接口类型:GTX,线速率5Gbps;
GTX编解码类型:8b/10b编解码;
回环光口类型:SFP光口;
图像缓存方案:FDMA图像缓存+PL端DDR3颗粒;图像2帧乒乓缓存;
PCIE详情:PCIE2.0版本,X8,2.5GT/s单lane线速率;
PCIE底层方案:Xilinx 7 Series Integrated Block for PCI Express;
PCIE上层方案:RIFFA;
实现功能:FPGA基于GTX+RIFFA架构实现SFP光口视频转PCIE传输;
工程作用:此工程目的是让读者掌握FPGA基于GTX+RIFFA架构实现SFP光口视频转PCIE传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

10、工程移植说明

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

11、上板调试验证

准备工作

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

OV5640摄像头采集效果演示

OV5640摄像头采集视频演示效果如下:

RIFFA-OV5640-新版

HDMI视频采集效果演示

HDMI视频采集演示效果如下:

RIFFA-HDMI

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

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

### 回答1: 为了更好的理解PCIEDMA测试分析,需要先了解Riffa架构Riffa是一种基于FPGA的PCI Express总线实现框架,可用于支持高带宽、低延迟的数据传输和重新配置。 使用基于RiffaPCIEDMA测试分析,可以对PCIE总线进行全面的测试分析,以确保工作正常且数据传输无误。具体来说,可以通过以下步骤来执行测试: 首先,需要使用FPGA平台开发一个实际的数据传输应用程序。该应用程序可能包括PCIE DMA传输和其他FPGA实现的功能,如数字信号处理等。 之后,需要将该应用程序集成到Riffa框架中,并通过PCIe总线与主机进行连接。在运行应用程序之前,可以使用Riffa提供的一些工具来进行端口扫描、爬行和脉冲示波器捕获等测试和分析。 接下来,可以通过观察Riffa提供的吞吐量和时延数据等指标,来对应用程序的性能进行评估。同时,还可以使用一些诊断工具来检查是否存在数据包丢失或重复等问题。 最后,需要对测试结果进行分析和总结,并根据需要进行优化和修改,以确保应用程序能够高效、稳定地工作。 综上所述,通过使用基于Riffa架构PCIEDMA测试分析,可以帮助用户对PCIE总线进行全面的测试和分析,从而确保数据传输的稳定性和可靠性。 ### 回答2: Riffa是一种基于FPGA的PCI Express(PCIe)通信架构,用于高速数据传输PCIEDMA测试分析是对基于Riffa架构PCIe DMA传输的测试和分析。 在PCIEDMA测试分析中,需要考虑传输性能、延迟、容错性等因素。首先,需要对DMA传输的带宽进行测试,以确保数据传输速度达到预期。其次,需要测试延迟情况,以确保DMA传输的实时性。同时,需要进行容错性测试,以确保数据传输的稳定性和可靠性。 PCIEDMA测试分析可以用于验证基于Riffa架构PCIe DMA传输的性能和稳定性,同时也可以为使用该架构的应用提供参考。在实际应用中,可以根据测试分析结果对传输参数进行优化,以提高数据传输效率和可靠性。 综上,PCIEDMA测试分析是对基于Riffa架构PCIe DMA传输进行测试和分析的过程,可以为数据传输的性能和稳定性提供参考和优化方案。 ### 回答3: 基于riffa架构PCIEDMA测试分析是一项非常重要的技术领域,它可以帮助人们更好地了解数据传输的性能和效率,同时也可以为高速数据传输应用提供强有力的技术支持PCIEDMA是一种利用PCIe总线实现高速数据传输的技术,该技术可使计算机的DMA控制器直接传输数据而不需要CPU的干预,从而提高数据传输速度和效率。rifta架构是一种基于FPGA的高性能计算架构,可以通过提供丰富的硬件资源和可编程性来支持PCIE DMA的实现。 在进行基于riffa架构PCIEDMA测试分析时,可以通过对传输数据的大小、传输速度、错误率以及吞吐量等进行评估和分析,来确定系统的性能和可靠性。通过对这些指标的测量和分析,可以全面了解系统的实际传输性能,并针对不同的应用场景进行优化和改进。 因此,基于riffa架构PCIEDMA测试分析具有重要的意义,在高速数据传输领域具有广泛的应用前景和重要的研究价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

9527华安

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

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

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

打赏作者

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

抵扣说明:

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

余额充值