目录
- 1、前言
- 2、相关方案推荐
-
- 我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目
- [我这里已有的 GT 高速接口解决方案](#我这里已有的 GT 高速接口解决方案)
- 本方案在FPGA与DSP交互架构中的应用
- 本方案的简单SRIO数据回环测试方案
- [本方案的SRIO AD数据回环测试方案](#本方案的SRIO AD数据回环测试方案)
- 3、工程详细设计方案
-
- 工程设计原理框图
- 输入Sensor之-->OV5640摄像头
- 图像组包发送模块
- SRIO数据回环传输架构
-
- [Serial Rapidlo Gen2 IP核简介](#Serial Rapidlo Gen2 IP核简介)
- [Serial Rapidlo Gen2 基本结构](#Serial Rapidlo Gen2 基本结构)
- [Serial Rapidlo Gen2 收发流程](#Serial Rapidlo Gen2 收发流程)
- [Serial Rapidlo Gen2 接收流程](#Serial Rapidlo Gen2 接收流程)
- [Serial Rapidlo Gen2 时钟架构](#Serial Rapidlo Gen2 时钟架构)
- [Serial Rapidlo Gen2 IP核调用和使用](#Serial Rapidlo Gen2 IP核调用和使用)
- 图像数据接收模块
- 图像缓存架构
- HDMI视频输出架构
- 工程源码架构
- 4、vivado工程源码1详解-->Artix7-35T,OV5640转SRIO版本
- 5、vivado工程源码2详解-->Artix7-100T,OV5640转SRIO版本
- 6、vivado工程源码3详解-->Kintex7-325T,OV5640转SRIO版本
- 7、vivado工程源码4详解-->Zynq7100,OV5640转SRIO版本
- 8、vivado工程源码5详解-->KU060,OV5640转SRIO版本
- 9、vivado工程源码6详解-->KU5P,OV5640转SRIO版本
- 10、工程移植说明
- 11、上板调试验证
- 12、工程代码的获取
FPGA实现SRIO图像视频传输,基于Serial Rapidlo Gen2,提供6套工程源码和技术支持
FPGA实现SRIO图像视频传输
1、前言
SRIO是啥?
SRIO(Serial RapidIO)是一种高性能、低引脚数、基于数据包交换的互连技术,专为满足嵌入式系统对高可靠性和高实时性的需求而设计。它由逻辑层、传输层和物理层三层协议构成,旨在为嵌入式系统提供可靠的、高性能的互连解决方案。总而言之,SRIO是一种为高性能嵌入式系统设计的高速串行互连技术。利用FPGA实现SRIO,能够充分发挥FPGA的灵活性、并行处理能力和高度集成性的优势,为通信、高性能计算、军工航天、工业自动化等领域提供高性能、高可靠性的数据传输解决方案。
下面是一个简要的SRIO协议核心特性概览:
FPGA实现SRIO的优势
FPGA以其高度灵活性和强大的并行处理能力,成为实现SRIO接口的理想选择之一,优势如下:
1、灵活性与可重构性:
FPGA允许工程师通过编程灵活配置SRIO接口的参数,如传输速率、端口数量、地址映射等,并能方便地更新协议功能,从而快速适应不同的应用需求和标准变更。
2、高性能并行处理:
FPGA的并行架构使其能够同时处理多个数据流和事务,非常适合于SRIO这种需要高速数据交换的场景,有助于满足系统对高带宽和低延迟的苛刻要求。
3、高度集成与成本优化:
利用FPGA实现SRIO功能,可以将SRIO接口与其他逻辑功能(如信号处理、数据打包/解包、错误管理等)集成在单一芯片上。这减少了对外部分立元器件的需求,降低了系统复杂性和总体成本。
4、加速开发和迭代:
Xilinx等FPGA供应商提供了成熟的SRIO IP核(知识产权核)和例程。这些IP核通常经过验证,包含配置、初始化、数据传输等示例代码,能显著缩短开发周期,让开发者更专注于上层应用。
基于FPGA-SRIO的应用领域
FPGA与SRIO的结合,在众多对数据传输速度和可靠性有严苛要求的领域发挥着重要作用,如下:
1、通信基础设施:
在无线基站、路由器和网络交换设备中,FPGA实现的SRIO接口可用于基带处理单元之间、以及它们与交换芯片之间的高速互联,确保数据的高速可靠传输。
2、高性能计算(HPC)与数据中心:
在高性能计算集群或数据中心内,FPGA-SRIO方案可用于连接多个计算节点、加速卡或存储单元,提供低延迟、高带宽的通信支持,适用于大规模并行计算和实时数据处理。
3、军事与航空航天:
这些领域对系统的可靠性和抗干扰能力要求极高。FPGA-SRIO可用于雷达信号处理、声纳系统、航空电子中的导航设备以及卫星通信等,确保在恶劣环境下数据的完整性和实时性。
4、工业自动化:
在工业控制系统中,FPGA-SRIO可用于连接高速传感器、控制器和执行器,实现实时数据采集和精准控制,提升生产效率和设备可靠性。
5、汽车电子:
随着高级驾驶辅助系统(ADAS)和自动驾驶技术的发展,车载网络需要处理大量传感器数据。FPGA-SRIO有望为车载网络中的高速数据交换提供解决方案,连接各种电子控制单元(ECU)。
6、医疗影像:
虽然搜索结果未直接提及,但医疗设备如高性能MRI、CT扫描仪等需要实时处理大量图像数据,FPGA-SRIO的高带宽和低延迟特性也适用于此类场景。
基于FPGA-SRIO的未来前景
尽管SRIO面临PCIe、以太网等技术的竞争,但FPGA-SRIO方案在特定领域仍有其发展空间和趋势,如下:
1、持续追求更高性能:
SRIO协议本身在不断发展,速率在不断提升(例如SRIO 3.0支持10.312 Gbps,未来目标指向25-400 Gbps)。FPGA工艺的进步(如采用更先进的制程)和SerDes技术的增强将支持这些更高的速率,满足未来系统对带宽的贪婪需求。
2、与新兴技术和应用融合:
人工智能与机器学习:AI推理和训练需要巨大的计算量和数据吞吐。FPGA-SRIO可用于连接AI加速器、高性能存储和计算单元,构建高效的计算平台。
3、数据中心加速:
在数据中心,FPGA常作为加速卡用于特定工作负载(如加解密、视频转码)。SRIO可作为FPGA加速卡与主机或其他加速卡之间的高效互联方式。
4、技术演进与创新:
为了进一步提升速率,PAM4(4阶脉冲幅度调制)等更高效的编码技术已在其他高速串行接口中应用。未来若SRIO采纳类似技术,FPGA的灵活性将有利于其快速实现。此外,光电共封装(CPO)甚至未来芯片级的光互联技术,虽然目前更多处于研究阶段,但长远看可能影响包括SRIO在内的高速互连技术实现方式。
5、在特定领域保持生命力:
在对确定性延迟、可靠性和抗干扰性要求极高的领域(如军工、航空航天、部分工业应用),SRIO的特性使其难以被完全替代。FPGA-SRIO方案预计将在这些利基市场持续发挥价值。
官方有Example,为何要用你这个?
Xilinx官方的确有SRIO IP核的Example例程;
然后呢?你看得懂吗?你会照着模仿做自己的项目吗?
如果你会,那么请划走;
如果你不会,不妨看看下面的聊天记录
这位朋友用了我的SRIO数据回环传输工程,感觉少走了一年的弯路。。。
工程概述
本设计使用Xilinx 系列FPGA为平台,基于GT高速收发器实现SRIO图像视频回环传输,旨在为读者提供一套精简版的、基于SRIO协议的的数据收发架构;
输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入纯Verilog实现的图像组包发送模块实现视频打包,以符合SRIO接口协议,并以 AXI4-Stream流输出;然后AXIS视频流送入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据编码,该SRIO为主机,然后数据以高速差分信号输出,经板载的SFP或QSFP光口进行回环传输;经SFP/QSFP-RX接口输入高速差分信号再进入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据解码,该SRIO从机,然后输出AXI4-Stream数据流;接收AXI4-Stream流然后进入纯verilog代码实现的图像数据接收模块实现视频恢复;恢复视频流然后送入纯verilog代码实现的图像缓存模块实现图像乒乓缓存,缓存介质为DDR3或DDR4;然后再Native视频时序控制下将视频从DDR3中读出,送入纯verilog代码实现的RGB转HDMI模块实现HDMI接口转换输出,最后用显示器显示视频即可;针对市场主流需求,本博客设计并提供6套工程源码,具体如下:
现对上述6套工程源码做如下解释,方便读者理解:
工程源码1
开发板FPGA型号为Xilinx--Artix7-35T--xc7a35tfgg484-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入纯Verilog实现的图像组包发送模块实现视频打包,以符合SRIO接口协议,并以 AXI4-Stream流输出;然后AXIS视频流送入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据编码,该SRIO为主机,然后数据以高速差分信号输出,经板载的SFP或QSFP光口进行回环传输;经SFP/QSFP-RX接口输入高速差分信号再进入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据解码,该SRIO从机,然后输出AXI4-Stream数据流;接收AXI4-Stream流然后进入纯verilog代码实现的图像数据接收模块实现视频恢复;恢复视频流然后送入纯verilog代码实现的图像缓存模块实现图像乒乓缓存,缓存介质为DDR3;然后再Native视频时序控制下将视频从DDR3中读出,送入纯verilog代码实现的RGB转HDMI模块实现HDMI接口转换输出,输出分辨率为1280x720@60Hz,最后用显示器显示视频即可;整个工程实用性拉满,对于有SRIO开发需求的用户可谓精准适配;本设计需要使用2路Serial Rapidlo Gen2 IP形成主从搭配,同时需要使用2路SFP光口做数据回环,2路Serial Rapidlo Gen2 IP使用Xilinx 7系列FPGA的GTP高速收发器资源,共享同一路GTP高速BANM参考时钟,SRIO线速率为5Gbps,数据位宽64bit,该工程适用于Xilinx 7系列FPG做工程移植部署;
工程源码2
开发板FPGA型号为Xilinx--Artix7-100T--xc7a100tfgg484-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入纯Verilog实现的图像组包发送模块实现视频打包,以符合SRIO接口协议,并以 AXI4-Stream流输出;然后AXIS视频流送入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据编码,该SRIO为主机,然后数据以高速差分信号输出,经板载的SFP或QSFP光口进行回环传输;经SFP/QSFP-RX接口输入高速差分信号再进入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据解码,该SRIO从机,然后输出AXI4-Stream数据流;接收AXI4-Stream流然后进入纯verilog代码实现的图像数据接收模块实现视频恢复;恢复视频流然后送入纯verilog代码实现的图像缓存模块实现图像乒乓缓存,缓存介质为DDR3;然后再Native视频时序控制下将视频从DDR3中读出,送入纯verilog代码实现的RGB转HDMI模块实现HDMI接口转换输出,输出分辨率为1280x720@60Hz,最后用显示器显示视频即可;整个工程实用性拉满,对于有SRIO开发需求的用户可谓精准适配;本设计需要使用2路Serial Rapidlo Gen2 IP形成主从搭配,同时需要使用2路SFP光口做数据回环,2路Serial Rapidlo Gen2 IP使用Xilinx 7系列FPGA的GTP高速收发器资源,共享同一路GTP高速BANM参考时钟,SRIO线速率为5Gbps,数据位宽64bit,该工程适用于Xilinx 7系列FPG做工程移植部署;
工程源码3
开发板FPGA型号为Xilinx--Kintex7-325T--xc7k325tffg676-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入纯Verilog实现的图像组包发送模块实现视频打包,以符合SRIO接口协议,并以 AXI4-Stream流输出;然后AXIS视频流送入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据编码,该SRIO为主机,然后数据以高速差分信号输出,经板载的SFP或QSFP光口进行回环传输;经SFP/QSFP-RX接口输入高速差分信号再进入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据解码,该SRIO从机,然后输出AXI4-Stream数据流;接收AXI4-Stream流然后进入纯verilog代码实现的图像数据接收模块实现视频恢复;恢复视频流然后送入纯verilog代码实现的图像缓存模块实现图像乒乓缓存,缓存介质为DDR3;然后再Native视频时序控制下将视频从DDR3中读出,送入纯verilog代码实现的RGB转HDMI模块实现HDMI接口转换输出,输出分辨率为1280x720@60Hz,最后用显示器显示视频即可;整个工程实用性拉满,对于有SRIO开发需求的用户可谓精准适配;本设计需要使用2路Serial Rapidlo Gen2 IP形成主从搭配,同时需要使用2路SFP光口做数据回环,2路Serial Rapidlo Gen2 IP使用Xilinx 7系列FPGA的GTX高速收发器资源,共享同一路GTX高速BANM参考时钟,SRIO线速率为5Gbps,数据位宽64bit,该工程适用于Xilinx 7系列FPG做工程移植部署;
工程源码4
开发板FPGA型号为Xilinx--Zynq7100--xc7z100ffg900-2;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入纯Verilog实现的图像组包发送模块实现视频打包,以符合SRIO接口协议,并以 AXI4-Stream流输出;然后AXIS视频流送入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据编码,该SRIO为主机,然后数据以高速差分信号输出,经板载的SFP或QSFP光口进行回环传输;经SFP/QSFP-RX接口输入高速差分信号再进入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据解码,该SRIO从机,然后输出AXI4-Stream数据流;接收AXI4-Stream流然后进入纯verilog代码实现的图像数据接收模块实现视频恢复;恢复视频流然后送入纯verilog代码实现的图像缓存模块实现图像乒乓缓存,缓存介质为DDR3;然后再Native视频时序控制下将视频从DDR3中读出,送入纯verilog代码实现的RGB转HDMI模块实现HDMI接口转换输出,输出分辨率为1280x720@60Hz,最后用显示器显示视频即可;整个工程实用性拉满,对于有SRIO开发需求的用户可谓精准适配;本设计需要使用2路Serial Rapidlo Gen2 IP形成主从搭配,同时需要使用2路SFP光口做数据回环,2路Serial Rapidlo Gen2 IP使用Xilinx 7系列FPGA的GTX高速收发器资源,共享同一路GTX高速BANM参考时钟,SRIO线速率为5Gbps,数据位宽64bit,该工程适用于Xilinx Zynq7000系列FPG做工程移植部署;
工程源码5
开发板FPGA型号为Xilinx--Kintex7--UltraScale--xcku060-ffva1156-2-i;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入纯Verilog实现的图像组包发送模块实现视频打包,以符合SRIO接口协议,并以 AXI4-Stream流输出;然后AXIS视频流送入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据编码,该SRIO为主机,然后数据以高速差分信号输出,经板载的SFP或QSFP光口进行回环传输;经SFP/QSFP-RX接口输入高速差分信号再进入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据解码,该SRIO从机,然后输出AXI4-Stream数据流;接收AXI4-Stream流然后进入纯verilog代码实现的图像数据接收模块实现视频恢复;恢复视频流然后送入纯verilog代码实现的图像缓存模块实现图像乒乓缓存,缓存介质为DDR4;然后再Native视频时序控制下将视频从DDR3中读出,送入纯verilog代码实现的RGB转HDMI模块实现HDMI接口转换输出,输出分辨率为1280x720@60Hz,最后用显示器显示视频即可;整个工程实用性拉满,对于有SRIO开发需求的用户可谓精准适配;本设计需要使用2路Serial Rapidlo Gen2 IP形成主从搭配,同时需要使用2路SFP光口做数据回环,2路Serial Rapidlo Gen2 IP使用Xilinx UltraScale系列FPGA的GTH高速收发器资源,共享同一路GTH高速BANM参考时钟,SRIO线速率为5Gbps,数据位宽64bit,该工程适用于Xilinx UltraScale系列FPG做工程移植部署;
工程源码6
开发板FPGA型号为Xilinx--Virtex UltraScale±-xcvu37p-fsvh2892-2-e;输入视频为OV5640摄像头或者动态彩条,默认使用OV5640;FPGA首先使用纯Verilog实现的i2c总线对摄像头进行初始化配置,分辨率配置为1280x720@30Hz;然后采集输入视频,将输入的两个时钟传输一个RGB565像素的视频采集为一个时钟传输一个RGB888像素的视频;然后采集视频送入纯Verilog实现的图像组包发送模块实现视频打包,以符合SRIO接口协议,并以 AXI4-Stream流输出;然后AXIS视频流送入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据编码,该SRIO为主机,然后数据以高速差分信号输出,经板载的SFP或QSFP光口进行回环传输;经SFP/QSFP-RX接口输入高速差分信号再进入Xilinx官方的Serial Rapidlo Gen2 IP核实现SRIO协议层数据解码,该SRIO从机,然后输出AXI4-Stream数据流;接收AXI4-Stream流然后进入纯verilog代码实现的图像数据接收模块实现视频恢复;恢复视频流然后送入纯verilog代码实现的图像缓存模块实现图像乒乓缓存,缓存介质为DDR4;然后再Native视频时序控制下将视频从DDR3中读出,送入纯verilog代码实现的RGB转HDMI模块实现HDMI接口转换输出,输出分辨率为1280x720@60Hz,最后用显示器显示视频即可;整个工程实用性拉满,对于有SRIO开发需求的用户可谓精准适配;本设计需要使用2路Serial Rapidlo Gen2 IP形成主从搭配,同时需要使用2路QSFP光口做数据回环,2路Serial Rapidlo Gen2 IP使用Xilinx UltraScale+系列FPGA的GTY高速收发器资源,共享同一路GTY高速BANM参考时钟,SRIO线速率为5Gbps,数据位宽64bit,该工程适用于Xilinx UltraScale+系列FPG做工程移植部署;
本博客详细描述了FPGA实现SRIO数据回环传输的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
免责声明
本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。
2、相关方案推荐
我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目
其实一直有朋友反馈,说我的博客文章太多了,乱花渐欲迷人,自己看得一头雾水,不方便快速定位找到自己想要的项目,所以本博文置顶,列出我目前已有的所有项目,并给出总目录,每个项目的文章链接,当然,本博文实时更新。。。以下是博客地址:
点击直接前往
我这里已有的 GT 高速接口解决方案
我的主页有FPGA GT 高速接口专栏,该专栏有 GTP 、 GTX 、 GTH 、 GTY 等GT 资源的视频传输例程和PCIE传输例程,其中 GTP基于A7系列FPGA开发板搭建,GTX基于K7或者ZYNQ系列FPGA开发板搭建,GTH基于KU或者V7系列FPGA开发板搭建,GTY基于KU+系列FPGA开发板搭建;以下是专栏地址:
点击直接前往
本方案在FPGA与DSP交互架构中的应用
SRIO通常搭配DSP使用,轻松实现异构方案的高速数据交互,对FPGA与DSP通过SRIO交互方案感兴趣的朋友,可以参考我之前发布的博客,链接如下:
基于FPGA与DSP通过SRIO简单测试:
点击直接前往
基于FPGA与DSP通过SRIO传输ADC数据:
点击直接前往
基于FPGA与DSP通过SRIO传输图像视频数据:
点击直接前往
本方案的简单SRIO数据回环测试方案
如果你不想做复杂的应用,只想测试一下SRIO数据回环通路,可以参考我之前发布的博客,链接如下:
点击直接前往
本方案的SRIO AD数据回环测试方案
如果你的项目不使用SRIO传输图像视频,而是用SRIO传输采集的ADC数据,可以参考我之前发布的博客,链接如下:
点击直接前往
3、工程详细设计方案
工程设计原理框图
工程设计原理框图如下:
输入Sensor之-->OV5640摄像头
输入Sensor是本工程的输入设备,其一为OV5640摄像头,此外本博主在工程中还设计了动态彩条模块,彩条由FPGA内部逻辑产生,且是动态移动的,完全可模拟Sensor,输入源选择Sensor还是彩条,通过Sensor模块的顶层参数配置,默认选择Sensor输入;Sensor模块如下:
SENSOR_TYPE=0;则输出OV5640摄像头采集的视频;
SENSOR_TYPE=1;则输出动态彩条的视频;
OV5640摄像头需要i2c初始化配置,本设计配置为1280x720@30Hz分辨率,本设计提供纯verilog代码实现的i2c模块实现配置功能;此外,OV5640摄像头还需要图像采集模块实现两个时钟输出一个RGB565的视频转换为一个时钟输出一个RGB888视频,本设计提供纯verilog代码实现的图像采集模块实现配置功能;动态彩条则由FPGA内部逻辑实现,由纯verilog代码编写;将OV5640摄像头配置采集和动态彩条进行代码封装,形成helai_OVsensor.v的顶层模块,整个模块代码架构如下:
图像组包发送模块
图像组包发送模块由纯Verilog代码实现,将输入采集的视频转换为AXI4-Stream流的、符合SRIO发送接口协议的数据;需要用到FIFO做跨时钟域和数据位宽转换;图像组包发送模块代码架构下:
这里重点讲解图像组包发送模块中的FIFO,由于输入视频像素时钟与SRIO用户时钟不同,所以FIFO起到跨时钟域作用,其次,输入视频像素位宽为16bit,而SRIO用户数据位宽要求为64bit,所以FIFO起到数据位宽转换作用,最后,输入视频接口为Native时序,而SRIO用户数据接口为AXI4-Stream,所以模块还具有图像接口转换作用,图像组包发送模块顶层接口如下:
发送图像数据帧格式如下:
发送端首先发送一个数据包包头,以标志数据包为NWRITE包;
发送端然后连续发送从n个图像数据;
用户数据发送模块与SRIO的s_axis_ireq接口对接;
SRIO数据回环传输架构
本设计基于Xilinx GT高速收发器实现SRIO数据回环传输,总体代码架构如下:
SRIO数据回环传输架构的核心是Serial Rapidlo Gen2 IP核的例化和使用,所以本章节我们重点讲解这个IP;
Serial Rapidlo Gen2 IP核简介
关于Serial Rapidlo Gen2 IP核介绍最详细的肯定是Xilinx官方的《pg007_Serial RapidIO Gen2
LogiCORE IP Product Guide》,我们以此来解读,《pg007》PDF文档我已放在了资料包里;Serial Rapidlo Gen2 IP核支持 1x、2x 和 4x 的通道宽度(Lane Widths),每个通道支持 1.25, 2.5, 3.125, 5.0 和 6.25 Gbaud 的传输速率。它兼容 Serial RapidIO 2.1 标准,并包含 逻辑层(Logical Layer)、传输层(Transport Layer)和物理层(Physical Layer) 的实现。
Serial Rapidlo Gen2 基本结构
根据《pg007》,Serial Rapidlo Gen2 基本结构如下:
由上图可知,SRIO Gen2 IP 核遵循 逻辑(LOG)、传输(Transport)和物理(PHY) 三层体系结构。这种划分提供了向逻辑规范添加新事务类型的灵活性,而无需修改传输或物理层规范。
SRIO Gen2 端点由以下部分组成:
Serial RapidIO Gen2 顶层包装器 (srio_gen2_<core_version>_unifiedtop):包含物理层(PHY)、逻辑层(LOG)和传输层、缓冲区设计(BUF)。
<component_name>_block:集成了上述统一顶层包装器、SRIO GT 包装器 (srio_gt_wrapper) 和配置结构参考设计。
<component_name>_support:包含时钟和复位模块。
<component_name>:顶层包装器,用于将整个 SRIO Gen2 端点集成到你的设计中。
本博主将官方给的框图做了简化,概括了 IP 核的系统架构和数据流,如下:
逻辑层(LOG)用户接口
逻辑层定义整体协议和数据包格式,是端点发起和完成事务所需的信息。其用户接口主要包括:
1、I/O端口 (I/O Port):
可以配置为 Condensed I/O 或 Initiator/Target 样式。它使用 AXI4-Stream 协议进行数据传输,支持 HELLO 和 SRIO Stream 两种数据包格式。
Condensed I/O 样式减少了通道数,使用一个AXI4-Stream通道传输所有I/O端口发送数据包(s_axis_iotx*),一个通道接收所有I/O端口数据包(m_axis_iorx*)。
Initiator/Target 样式将事务分离,是文档中较多分析的模式。它包含四个通道:
Initiator Request (ireq):本地生成的请求,放置在 s_axis_ireq* 通道上发送。
Initiator Response (iresp):从远程设备接收的响应,在 m_axis_iresp* 通道上呈现。
Target Request (treq):从远程设备接收的请求,在 m_axis_treq* 通道上呈现。
Target Response (tresp):对接收到的请求生成的响应,放置在 s_axis_tresp* 通道上发回。
2、消息端口 (Messaging Port):一个可选接口,遵循 Initiator/Target 样式,用于消息事务。
3、维护端口 (Maintenance Port):如果启用,则使用 AXI4-Lite 接口,允许用户应用程序访问本地或远程配置空间。
4、用户定义端口 (User-Defined Port):一个可选端口,仅使用 SRIO Stream 格式。
缓冲区设计(BUF)与物理层(PHY)
1、缓冲区设计 (BUF):
负责数据包的缓冲和流量控制。发送缓冲区(TX Buffer)对传出事务排队,接收缓冲区(RX Buffer)充当FIFO存储和转发数据到LOG接收路径。缓冲区大小可配置(8, 16 或 32 个数据包深度),并在必要时处理时钟域交叉。
2、物理层 (PHY):
处理链路训练、初始化、协议(如插入CRC和确认标识符),并连接到串行收发器(GT)。收发器通常由用户在IP核外部实例化。
Serial Rapidlo Gen2 收发流程
用户发送数据通过s_axis_ireq接口发送;用户接口端口由 AXI4-Stream 接口构建,使用就绪/有效握手传输信息。为了简化数据包构造,常使用 HELLO 数据包格式。HELLO包最大净荷量为256字节,其第一拍数据包含了包头信息,后续为正常数据;具体发送流程如下:
1、用户逻辑构造请求:
用户逻辑根据HELLO格式或SRIO Stream格式,在 s_axis_ireq_tdata 上准备数据,并断言 s_axis_ireq_tvalid。
2、IP核握手并处理:
当IP核准备好接收时,会断言 s_axis_ireq_tready,完成握手。LOG层接收请求,进行处理。
3、经BUF到PHY:
处理后的数据包经过BUF层(进行缓冲和流量控制),到达PHY层。
4、PHY封装并发送:
PHY层为数据包插入CRC、确认标识符(ackID) 等,然后通过GT收发器将并行数据转换为串行差分信号发送到链路上。
Serial Rapidlo Gen2 接收流程
用户接收数据通过m_axis_treq接口发送;用户接口端口由 AXI4-Stream 接口构建,数据接收流程是发送的逆过程;具体发送流程如下:
1、PHY接收并解包:
PHY层从GT收发器接收串行数据,将其转换为并行数据,检查CRC、确认ackID(若ackID不符合预期,会回复PNA而非PA,并可能触发重传机制),并剥离物理层信息。
2、经BUF到LOG:
数据包通过BUF层(进行缓冲),到达LOG层。
3、LOG解析并分发:
LOG层解析数据包,并根据其类型(请求或响应)分发到相应的目标接口。
若是请求包(如NREAD、NWRITE_R),会呈现在 m_axis_treq* 接口上,用户逻辑需在此接口接收并处理。
若是响应包(如对NREAD的响应),会呈现在 m_axis_iresp* 接口上,用户逻辑在此接口接收响应。
4、用户逻辑生成响应(针对请求包):
对于需要响应的请求(如NREAD),用户逻辑处理完后,需在 s_axis_tresp* 接口上构造并发送响应包。
物理层握手机制
SRIO物理层有重要的握手机制确保可靠传输:
每个SRIO包都有一个 ackID。
接收端检查收到的 ackID:
若符合预期,回复 PA (Packet Accepted)。
若不符合预期,回复 PNA (Packet Not Accepted)。
发送端收到PNA后,会自动发起重传(Link Request)。
此机制在物理层自动完成,一般无需用户干预,但在调试链路错误时(如信号质量差导致重传)需关注。
Serial Rapidlo Gen2 时钟架构
SRIO IP核涉及多个时钟域,理解时钟关系对稳定运行至关重要。IP核内部主要涉及以下时钟:
这些时钟域之间通常需要时钟域交叉(CDC),BUF层中的设计就包含了处理CDC的逻辑;
Serial Rapidlo Gen2 IP核调用和使用
Serial Rapidlo Gen2 IP核调用和使用很简单,通过vivado的UI界面即可完成,如下:
然后配置如下:
具体配置要根据自己的项目需求而定,上图只是博主的配置,仅供参考;
图像数据接收模块
图像数据接收模块在工程中位置如下:
图像数据接收模块接收AXI4-Stream流,并将其转换为Native视频接口,以便后级的图像缓存模块使用,注意,图像数据接收模块只接收SRIO接收AXIS流的有效数据段,不接收帧头;图像数据接收模块顶层接口如下:
接收数据帧格式如下:
图像缓存架构
图像缓存架构实现将输入视频缓存到板载DDR3中再读出送后续模块,目的是实现视频同步输出,实现输入视频到输出视频的跨时钟域问题,更好的呈现显示效果;由于调用了Xilinx官方的MIG作为DDR控制器,所以图像缓存架构就是实现用户数据到MIG的桥接作用;架构如下:
AXI4-Full Master总线作为主设备与MIG对接,MIG配置为AXI4-FULL接口;读写控制器实际上就是一个视频读写逻辑,以写视频为例,假设一帧图像的大小为M×N,其中M代表图像宽度,N代表图像高度;读写控制器每次写入一行视频数据,即每次向DDR中写入M个像素,写N次即可完成1帧图像的缓存,读视频与之一样;同时调用两个FIFO实现输入输出视频的跨时钟域处理,使得用户可以AXI4内部代码,以简单地像使用FIFO那样操作AXI总线,从而达到读写DDR的目的,进而实现视频缓存;本设计图像缓存方式为乒乓缓存;图像缓存模块代码架构如下:
图像缓存架构在Block Design设计中如下:
HDMI视频输出架构
缓存图像从DDR3读出后经过Native时序生成模块输出标准的VGA时序视频,然后经过纯verilog显示的RGB转HDMI模块输出HDMI差分视频;最后送显示器显示即可;代码例化如下:
工程源码架构
提供6套工程源码,以工程源码1为例,工程Block Design设计如下:
提供6套工程源码,以工程源码1为例,综合后的工程源码架构如下:
4、vivado工程源码1详解-->Artix7-35T,OV5640转SRIO版本
开发板FPGA型号:Xilinx--Artix7-35T--xc7a35tfgg484-2;
FPGA开发环境:Vivado2019.1;
视频输入:OV5640摄像头,分辨率为1280x720@30Hz;
视频输出:HDMI,RTL逻辑编码方案,分辨率1280x720@60Hz;
图像缓存方案:纯verilog实现2帧缓存,DDR3为介质;
SRIO方案:Xilinx Serial Rapidlo Gen2 IP核;
回环光口类型:2路SFP光口;
使用高速收发器类型:GTP,线速率5Gbps;
SRIO用户数据位宽:64 bit;
工程作用:让读者掌握FPGA实现SRIO图像视频传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
5、vivado工程源码2详解-->Artix7-100T,OV5640转SRIO版本
开发板FPGA型号:Xilinx--Artix7-100T--xc7a100fgg484-2;
FPGA开发环境:Vivado2019.1;
视频输入:OV5640摄像头,分辨率为1280x720@30Hz;
视频输出:HDMI,RTL逻辑编码方案,分辨率1280x720@60Hz;
图像缓存方案:纯verilog实现2帧缓存,DDR3为介质;
SRIO方案:Xilinx Serial Rapidlo Gen2 IP核;
回环光口类型:2路SFP光口;
使用高速收发器类型:GTP,线速率5Gbps;
SRIO用户数据位宽:64 bit;
工程作用:让读者掌握FPGA实现SRIO图像视频传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
6、vivado工程源码3详解-->Kintex7-325T,OV5640转SRIO版本
开发板FPGA型号:Xilinx--Kintex7-325T--xc7k325tffg676-2;
FPGA开发环境:Vivado2019.1;
视频输入:OV5640摄像头,分辨率为1280x720@30Hz;
视频输出:HDMI,RTL逻辑编码方案,分辨率1280x720@60Hz;
图像缓存方案:纯verilog实现2帧缓存,DDR3为介质;
SRIO方案:Xilinx Serial Rapidlo Gen2 IP核;
回环光口类型:2路SFP光口;
使用高速收发器类型:GTX,线速率6.25Gbps;
SRIO用户数据位宽:64 bit;
工程作用:让读者掌握FPGA实现SRIO图像视频传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
7、vivado工程源码4详解-->Zynq7100,OV5640转SRIO版本
开发板FPGA型号:Xilinx--Zynq7100--xc7z100ffg900-2;
FPGA开发环境:Vivado2019.1;
视频输入:OV5640摄像头,分辨率为1280x720@30Hz;
视频输出:HDMI,RTL逻辑编码方案,分辨率1280x720@60Hz;
图像缓存方案:纯verilog实现2帧缓存,PS端DDR3为介质;
SRIO方案:Xilinx Serial Rapidlo Gen2 IP核;
回环光口类型:2路SFP光口;
使用高速收发器类型:GTX,线速率5Gbps;
SRIO用户数据位宽:64 bit;
工程作用:让读者掌握FPGA实现SRIO图像视频传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
8、vivado工程源码5详解-->KU060,OV5640转SRIO版本
开发板FPGA型号:Xilinx--Kintex UltraScale--xcku060-ffva1156-2-i;
FPGA开发环境:Vivado2019.1;
视频输入:OV5640摄像头,分辨率为1280x720@30Hz;
视频输出:HDMI,RTL逻辑编码方案,分辨率1280x720@60Hz;
图像缓存方案:纯verilog实现2帧缓存,DDR4为介质;
SRIO方案:Xilinx Serial Rapidlo Gen2 IP核;
回环光口类型:2路SFP光口;
使用高速收发器类型:GTH,线速率5Gbps;
SRIO用户数据位宽:64 bit;
工程作用:让读者掌握FPGA实现SRIO图像视频传输的设计能力,以便能够移植和设计自己的项目;
工程Block Design和工程代码架构请参考第3章节的《工程源码架构》小节内容;
工程的资源消耗和功耗如下:
9、vivado工程源码6详解-->KU5P,OV5640转SRIO版本
开发板FPGA型号:Xilinx-->Kintex UltraScale+--xcku5p-ffvb676-1-i;
FPGA开发环境:Vivado2019.1;
视频输入:OV5640摄像头,分辨率为1280x720@30Hz;
视频输出:HDMI,RTL逻辑编码方案,分辨率1280x720@60Hz;
图像缓存方案:纯verilog实现2帧缓存,DDR4为介质;
SRIO方案:Xilinx Serial Rapidlo Gen2 IP核;
回环光口类型:2路SFP光口;
使用高速收发器类型:GTY,线速率5Gbps;
SRIO用户数据位宽:64 bit;
工程作用:让读者掌握FPGA实现SRIO图像视频传输的设计能力,以便能够移植和设计自己的项目;
工程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摄像头或模组;
FPGA开发板,没有开发板可以找本博提供;
SFP光模块和光纤;
HDMI线缆和显示器;
我的开发板了连接如下:
SRIO图像视频传输效果演示
SRIO图像视频传输效果演示如下:
FPGA实现SRIO图像视频传输
12、工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:文章末尾的V名片。
网盘资料如下:
此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务: