FPGA基于RIFFA架构实现PCIE视频传输,提供14套工程源码和技术支持

目录


FPGA基于RIFFA架构实现PCIE视频传输,提供14套工程源码和技术支持

1、前言

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

工程概述

本设计基于RIFFA架构架构实现PCIE视频传输实验;
视频输入源有多种,一种是板载的HDMI输入接口,另一种是传统摄像头,包括OV7725、OV5640和AR0135;FPGA首先对摄像头进行i2c初始化配置,然后采集摄像头视频;然后使用本博主常用的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+RIFFA+PCIE+QT的高端架构;针对市面上主流的FPGA,本博客提供14套工程源码,具体如下:
在这里插入图片描述
现对上述14套工程源码做如下解释,方便读者理解:

工程源码1

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

工程源码2

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

工程源码3

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

工程源码4

开发板FPGA型号为Xilinx–>Artix7-100T–xc7a100tfgg484-2;输入视频为板载的HDMI输入接口,使用笔记本电脑模拟HDMI输入设备连接到开发板HDMI输入接口;HDMI解码方式为纯VHDL代码方案;首先FPGA纯verilog实现的i2c配置模块完成HDMI RX的DDC接口配置,EDID配置为1920x1080@60Hz,使用纯VDHL代码实现的HDMI转RGB模块实现输入HDMI视频解码操作,并输出Native的RGB888视频流;为了支持1920x1080@60Hz,在硬件设计上需要加上驱动芯片,本设计采用TMDS141RHAR,也可采用其他型号;然后采集输入视频后使用本博主常用的FDMA图像缓存架构将视频写入板载DDR3中做乒乓缓存;然后将缓存视频读出,送入纯Verilog实现的RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;输出视频分辨率为1920x1080@60Hz;板载PCIE为1 Lane的PCIE2.0;单Lane线速率配置为5GT/s;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码5

开发板FPGA型号为Xilinx–>Kintex7–35T–xc7k325tffg484-2;输入视频为OV7725摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为640x480@60Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构将视频写入板载DDR3中做乒乓缓存;然后将缓存视频读出,送入纯Verilog实现的RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;输出视频分辨率为640x480@60Hz;板载PCIE为4 Lane的PCIE2.0;单Lane线速率配置为5GT/s;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码6

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

工程源码7

开发板FPGA型号为Xilinx–>Kintex7–35T–xc7k325tffg484-2;输入视频为AR0135工业相机,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@60Hz;然后采集输入视频,输出灰度像素;然后使用本博主常用的FDMA图像缓存架构将视频写入板载DDR3中做乒乓缓存;然后将缓存视频读出,送入纯Verilog实现的RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;输出视频分辨率为1280x720@60Hz;板载PCIE为4 Lane的PCIE2.0;单Lane线速率配置为5GT/s;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码8

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

工程源码9

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

工程源码10

开发板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,也可采用其他型号;然后采集输入视频后使用本博主常用的FDMA图像缓存架构将视频写入板载的PL端DDR3中做乒乓缓存;然后将缓存视频读出,送入纯Verilog实现的RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;输出视频分辨率为1920x1080@60Hz;板载PCIE为4 Lane的PCIE2.0;单Lane线速率配置为5GT/s;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码11

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入视频为OV7725摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为640x480@60Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构将视频写入板载的PL端DDR3中做乒乓缓存;然后将缓存视频读出,送入纯Verilog实现的RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;输出视频分辨率为640x480@60Hz;板载PCIE为8 Lane的PCIE2.0;单Lane线速率配置为2.5GT/s;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码12

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入视频为OV5640摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用本博主常用的FDMA图像缓存架构将视频写入板载的PL端DDR3中做乒乓缓存;然后将缓存视频读出,送入纯Verilog实现的RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;输出视频分辨率为1280x720@60Hz;板载PCIE为8 Lane的PCIE2.0;单Lane线速率配置为2.5GT/s;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码13

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入视频为AR0135工业相机,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@60Hz;然后采集输入视频,输出灰度像素;然后使用本博主常用的FDMA图像缓存架构将视频写入板载的PL端DDR3中做乒乓缓存;然后将缓存视频读出,送入纯Verilog实现的RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;输出视频分辨率为1280x720@60Hz;板载PCIE为8 Lane的PCIE2.0;单Lane线速率配置为2.5GT/s;PCIE视频数据通过PCIE金手指从FPGA板卡发送到PC主机;PC端主机在RIFFA-PCIE驱动的加持下有效识别并读取PCIE数据;PC端调用QT上位机调用RIFFA-PCIE驱动的API实现视频数据显示;由此形成Sensor+RIFFA+PCIE+QT的高端架构;该工程适用于PCIE接口的视频采集卡应用;

工程源码14

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

免责声明

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

2、相关方案推荐

我已有的PCIE方案

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

RIFFA架构PCIE的测速方案

FPGA基于RIFFA架构实现PCIE通信,测速实验,提供5套工程源码和技术支持,以下是博客地址:
点击直接前往

3、详细设计方案

设计框图

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

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

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

module helai_ov7725_rx #(
	parameter DEVID             = 8'h78,	// OV7725器件地址 
	parameter OV7725_IMAGE_TYPE = "RGB"	// RGB or YUV422 or RAW
)(
	input           clk_24m         ,
	input           rst_n           ,	
	output			cmos_sclk       ,		//cmos i2c clock
	inout			cmos_sdat       ,		//cmos i2c data
	input			cmos_pclk       ,		//cmos pxiel clock
	output			cmos_xclk       ,		//cmos externl clock
	input			cmos_vsync      ,		//cmos vsync
	input			cmos_href       ,		//cmos hsync refrence
	input	[7:0]	cmos_data       ,		//cmos data
	output			cmos_pwdn       ,		//cmos fsin
	output			cmos_fsin       ,		//cmos pwdn
	output          i2c_config_ok   ,   
	output          vout_ov7725_hs  ,
	output          vout_ov7725_vs  ,
	output          vout_ov7725_de  ,
	output [23:0]   vout_ov7725_data		
);

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
);

AR0135工业相机i2c配置和数据采集

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

module AR0135_CFG_RX #(
	parameter I2C_ID_ADDR   = 8'h20     ,
	parameter SYS_CLK_FREQ  = 100_000000,
	parameter I2C_CLK_FREQ  = 10_000    ,
	parameter OUT_PCLK_FREQ = 74_250000 
)(
	input        sys_clk       ,
	input        resetn        ,
	input        i_ar0135_dclk ,	// 27M
	input        i_ar0135_pclk ,	
	output       o_ar0135_xclk ,		
	input        i_ar0135_vs   ,
	input        i_ar0135_de   ,	
	input  [7:0] i_ar0135_data ,	
	output       o_ar0135_vs   ,
	output       o_ar0135_de   ,	
	output [7:0] o_ar0135_data ,	
	output       i2c_ar0135_sck,
	inout        i2c_ar0135_sda
);

Silcom9011的i2c配置

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

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
);

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在内的整体代码架构;本博客提供14套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详解–>Artix7-35T,OV5640输入PCIEX2输出版本

开发板FPGA型号:Xilinx–Artix7–xc7a35tfgg484-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:PCIE2.0,分辨率1280x720@60Hz;
图像缓存方案:FDMA图像缓存+DDR3颗粒;图像2帧乒乓缓存;
PCIE详情:PCIE2.0版本,X2,5GT/s单lane线速率;
PCIE底层方案:Xilinx 7 Series Integrated Block for PCI Express;
PCIE上层方案:RIFFA;
实现功能:FPGA基于RIFFA架构实现PCIE视频传输实验;在Artix7-35T低端的、逻辑资源有限的FPGA上实现PCIE视频传输,难度不小,此工程应该是全网首创,价值极高;
工程作用:此工程目的是让读者掌握FPGA基于RIFFA架构实现PCIE视频传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、工程源码2详解–>Artix7-35T,HDMI输入PCIEX2输出版本

开发板FPGA型号:Xilinx–Artix7-35T–xc7a35tfgg484-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:HDMI,Silcom9013芯片解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:PCIE2.0,分辨率1920x1080@60Hz;
图像缓存方案:FDMA图像缓存+DDR3颗粒;图像2帧乒乓缓存;
PCIE详情:PCIE2.0版本,X2,5GT/s单lane线速率;
PCIE底层方案:Xilinx 7 Series Integrated Block for PCI Express;
PCIE上层方案:RIFFA;
实现功能:FPGA基于RIFFA架构实现PCIE视频传输实验;在Artix7-35T低端的、逻辑资源有限的FPGA上实现PCIE视频传输,难度不小,此工程应该是全网首创,价值极高;
工程作用:此工程目的是让读者掌握FPGA基于RIFFA架构实现PCIE视频传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

6、工程源码3详解–>Artix7-100T,OV5640输入PCIEX1输出版本

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

7、工程源码4详解–>Artix7-100T,HDMI输入PCIEX1输出版本

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

8、工程源码5详解–>Kintex7-325T,OV7725输入PCIEX4输出版本

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

9、工程源码6详解–>Kintex7-325T,OV5640输入PCIEX4输出版本

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

10、工程源码7详解–>Kintex7-325T,AR0135输入PCIEX4输出版本

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

11、工程源码8详解–>Kintex7-325T,HDMI输入PCIEX4输出版本

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

12、工程源码9详解–>Zynq7100,OV5640输入PCIEX4输出版本

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

13、工程源码10详解–>Zynq7100,HDMI输入PCIEX4输出版本

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

14、工程源码11详解–>Zynq7100,OV7725输入PCIEX8输出版本

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

15、工程源码12详解–>Zynq7100,OV5640输入PCIEX8输出版本

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

16、工程源码13详解–>Zynq7100,AR0135输入PCIEX8输出版本

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

17、工程源码14详解–>Zynq7100,HDMI输入PCIEX8输出版本

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

18、工程移植说明

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

19、上板调试验证

准备工作

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

OV7725摄像头采集效果演示

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

RIFFA-OV7725

OV5640摄像头采集效果演示

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

RIFFA-OV5640-新版

AR0135工业相机采集效果演示

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

RIFFA-AR0135

HDMI视频采集效果演示

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

RIFFA-HDMI

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

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

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

9527华安

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

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

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

打赏作者

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

抵扣说明:

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

余额充值