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

目录


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

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;FPGA首先对摄像头进行i2c初始化配置,然后采集摄像头视频;然后使用纯verilog实现的、支持任意尺寸任意比例缩放的图像缩放模块对输入视频进行缩放操作;然后使用本博主常用的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,本博客提供10套工程源码,具体如下:
在这里插入图片描述
现对上述10套工程源码做如下解释,方便读者理解:
友情提示,由于Artix7-35T型FPGA逻辑资源有限,不适合做视频缩放,所以没有改型号FPGA的工程;

工程源码1

开发板FPGA型号为Xilinx–>Artix7-100T–xc7a100tfgg484-2;输入视频为OV5640摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用纯verilog实现的、支持任意尺寸任意比例缩放的图像缩放模块将输入视频从1280x720缩放至1920x1080,当然你也可以缩放到其他分辨率;然后使用本博主常用的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接口的视频采集卡应用;

工程源码2

开发板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,也可采用其他型号;然后使用纯verilog实现的、支持任意尺寸任意比例缩放的图像缩放模块将输入视频从1920x1080缩放至1280x720,当然你也可以缩放到其他分辨率;然后使用本博主常用的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接口的视频采集卡应用;

工程源码3

开发板FPGA型号为Xilinx–>Kintex7–35T–xc7k325tffg484-2;输入视频为OV7725摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为640x480@60Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用纯verilog实现的、支持任意尺寸任意比例缩放的图像缩放模块将输入视频从640x480缩放至1920x1080,当然你也可以缩放到其他分辨率;然后使用本博主常用的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接口的视频采集卡应用;

工程源码4

开发板FPGA型号为Xilinx–>Kintex7–35T–xc7k325tffg484-2;输入视频为OV5640摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用纯verilog实现的、支持任意尺寸任意比例缩放的图像缩放模块将输入视频从1280x720缩放至1920x1080,当然你也可以缩放到其他分辨率;然后使用本博主常用的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接口的视频采集卡应用;

工程源码5

开发板FPGA型号为Xilinx–>Kintex7–35T–xc7k325tffg484-2;输入视频为板载的HDMI输入接口,使用笔记本电脑模拟HDMI输入设备连接到开发板HDMI输入接口;HDMI解码方式为IT6802芯片方案;FPGA首先使用纯Verilog实现的i2c总线对Silcom9013芯片进行初始化配置,分辨率配置为1920x1080@60Hz;然后使用纯verilog实现的、支持任意尺寸任意比例缩放的图像缩放模块将输入视频从1920x1080缩放至1280x720,当然你也可以缩放到其他分辨率;然后使用本博主常用的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接口的视频采集卡应用;

工程源码6

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入视频为OV5640摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用纯verilog实现的、支持任意尺寸任意比例缩放的图像缩放模块将输入视频从1280x720缩放至1920x1080,当然你也可以缩放到其他分辨率;然后使用本博主常用的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接口的视频采集卡应用;

工程源码7

开发板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,也可采用其他型号;然后使用纯verilog实现的、支持任意尺寸任意比例缩放的图像缩放模块将输入视频从1920x1080缩放至1280x720,当然你也可以缩放到其他分辨率;然后使用本博主常用的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接口的视频采集卡应用;

工程源码8

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入视频为OV7725摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为640x480@60Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用纯verilog实现的、支持任意尺寸任意比例缩放的图像缩放模块将输入视频从640x480缩放至1920x1080,当然你也可以缩放到其他分辨率;然后使用本博主常用的FDMA图像缓存架构将视频写入板载的PL端DDR3中做乒乓缓存;然后将缓存视频读出,送入纯Verilog实现的RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;输出视频分辨率为1920x1080@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接口的视频采集卡应用;

工程源码9

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入视频为OV5640摄像头,FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后使用纯verilog实现的、支持任意尺寸任意比例缩放的图像缩放模块将输入视频从1280x720缩放至1920x1080,当然你也可以缩放到其他分辨率;然后使用本博主常用的FDMA图像缓存架构将视频写入板载的PL端DDR3中做乒乓缓存;然后将缓存视频读出,送入纯Verilog实现的RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;输出视频分辨率为1920x1080@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接口的视频采集卡应用;

工程源码10

开发板FPGA型号为Xilinx–>Zynq7100–xc7z100ffg900-2;输入视频为板载的HDMI输入接口,使用笔记本电脑模拟HDMI输入设备连接到开发板HDMI输入接口;HDMI解码方式为ADV7611芯片方案;FPGA首先使用纯Verilog实现的i2c总线对Silcom9013芯片进行初始化配置,分辨率配置为1920x1080@60Hz;然后使用纯verilog实现的、支持任意尺寸任意比例缩放的图像缩放模块将输入视频从1920x1080缩放至1280x720,当然你也可以缩放到其他分辨率;然后使用本博主常用的FDMA图像缓存架构将视频写入板载的PL端DDR3中做乒乓缓存;然后将缓存视频读出,送入纯Verilog实现的RIFFA模块做视频数据的TLP包封装,并跨时钟域后输出给Xilinx官方的7 Series Integrated Block for PCI Express IP核实现PCIE物理层、链路层和事务层功能,并以差分数据输出;输出视频分辨率为1280x720@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套工程源码和技术支持,以下是博客地址:
点击直接前往

RIFFA架构PCIE的视频传输方案

FPGA基于RIFFA架构实现PCIE视频传输,提供14套工程源码和技术支持,以下是博客地址:
点击直接前往

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

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

纯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图像缓存

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在内的整体代码架构;本博客提供10套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、工程源码01详解–>Artix7-100T,OV5640输入PCIEX1输出版本

开发板FPGA型号:Xilinx–Artix7-100T–xc7a100tfgg484-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:PCIE2.0,分辨率1920x1080@60Hz;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1280x720缩放到1920x1080;
图像缓存方案: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章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、工程源码02详解–>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,分辨率1280x720@60Hz;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到1280x720;
图像缓存方案: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章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

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

开发板FPGA型号:Xilinx–Kintex7–35T–xc7k325tffg484-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:OV7725摄像头,分辨率640x480@60Hz;
输出:PCIE2.0,分辨率1920x1080@60Hz;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:640x480缩放到1920x1080;
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章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

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

开发板FPGA型号:Xilinx–Kintex7–35T–xc7k325tffg484-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:PCIE2.0,分辨率1920x1080@60Hz;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1280x720缩放到1920x1080;
图像缓存方案: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章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

8、工程源码05详解–>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,分辨率1280x720@60Hz;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到1280x720;
图像缓存方案: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、工程源码06详解–>Zynq7100,OV5640输入PCIEX4输出版本

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:PCIE2.0,分辨率1920x1080@60Hz;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1280x720缩放到1920x1080;
图像缓存方案: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、工程源码07详解–>Zynq7100,HDMI输入PCIEX4输出版本

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:HDMI,纯VHDL解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:PCIE2.0,分辨率1280x720@60Hz;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到1280x720;
图像缓存方案: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、工程源码08详解–>Zynq7100,OV7725输入PCIEX8输出版本

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:OV7725摄像头,分辨率640x480@60Hz;
输出:PCIE2.0,分辨率1920x1080@60Hz;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:640x480缩放到1920x1080;
图像缓存方案: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章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

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

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:OV5640摄像头,分辨率1280x720@30Hz;
输出:PCIE2.0,分辨率1920x1080@60Hz;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1280x720缩放到1920x1080;
图像缓存方案: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章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

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

开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
QT开发环境:VS2015 + Qt 5.12.10;
输入:HDMI,ADV7611芯片解码方案,分辨率1920x1080@60Hz,笔记本电脑模拟输入源;
输出:PCIE2.0,分辨率1280x720@60Hz;
图像缩放方案:自研纯Verilog图像缩放;
图像缩放实例:1920x1080缩放到1280x720;
图像缓存方案: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章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

14、工程移植说明

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

15、上板调试验证

准备工作

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

OV7725摄像头视频采集缩放效果演示

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

RIFFA-OV7725-缩放

OV5640摄像头视频采集缩放效果演示

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

RIFFA-OV5640-缩放

HDMI视频采集缩放效果演示

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

RIFFA-HDMI-缩放

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

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

  • 16
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用纯Verilog代码实现FPGA上的图像缩放。下面是一个简单的示例,展示了如何使用双线性插值算法进行图像缩放: ```verilog module image_scale ( input wire clk, input wire rst, input wire [7:0] in_width, input wire [7:0] in_height, input wire [7:0] out_width, input wire [7:0] out_height, input wire [15:0] in_image [0:1023][0:767], output wire [15:0] out_image [0:511][0:383] ); // 计算水平和垂直比例因子 reg [15:0] scale_x; reg [15:0] scale_y; always @(in_width, out_width) begin scale_x = (in_width << 16) / (out_width + 1); end always @(in_height, out_height) begin scale_y = (in_height << 16) / (out_height + 1); end // 缩放图像 always @(posedge clk or posedge rst) begin if (rst) begin // 复位状态 // ... end else begin // 缩放计算 // ... end end endmodule ``` 在上面的示例中,`in_width`和`in_height`表示输入图像的宽度和高度,`out_width`和`out_height`表示期望的输出图像的宽度和高度。`in_image`是一个二维数组,用于存储输入图像的像素值。`out_image`也是一个二维数组,用于存储输出图像的像素值。 你需要在`always @(posedge clk or posedge rst)`块中实现图像缩放的逻辑。你可以使用双线性插值算法来计算输出图像的每个像素值。具体的实现方法超出了本文的范围,但你可以参考相关资料来了解如何在Verilog实现双线性插值算法。 请注意,上述代码仅提供了一个基本的框架,你需要根据实际需求进行适当的修改和完善。同时,你还需要根据你使用的开发板和FPGA器件进行相应的时钟和复位处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

9527华安

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

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

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

打赏作者

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

抵扣说明:

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

余额充值