目录
- 1、前言
- 工程概述
- 免责声明
- 2、相关方案推荐
- 我这里已有的FPGA图像缩放方案
- 4K视频输入输出方案
- Video Processing Subsystem视频缩放方案
- 3、详细设计方案
- 设计框图
- 测试彩条
- AXI4-Stream Data FIFO
- Video Processing Subsystem
- HDMI 1.4/2.0 Transmitter Subsystem
- Video PHY Controller
- 输出均衡电路
- 视频输出显示
- FPGA开发板
- 工程源码架构
- 4、工程源码1详解-->Kintex7版本,4K@30Hz版本
- 5、工程源码2详解-->Kintex7版本,4K@60Hz版本
- 6、工程源码3详解-->XCZU4EV版本,4K@30Hz版本
- 7、工程源码4详解-->XCZU4EV版本,4K@60Hz版本
- 8、工程移植说明
- vivado版本不一致处理
- FPGA型号不一致处理
- 其他注意事项
- 9、上板调试验证并演示
- 准备工作
- 输出效果演示
- 10、福利:工程代码的获取
Xilinx系列FPGA实现4K视频缩放,基于Video Processing Subsystem实现,提供4套工程源码和技术支持
1、前言
没玩过图像缩放都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。目前市面上主流的FPGA图像缩放方案如下:
1:Xilinx的HLS方案,该方案简单,易于实现,但只能用于Xilinx自家的FPGA;
2:非纯Verilog方案,大部分代码使用Verilog实现,但中间的fifo或ram等使用了IP,导致移植性变差,难以在Xilinx、Altera和国产FPGA之间自由移植;
3:纯Verilog方案;
以上方案基本都很难实现4K分辨率的视频缩放,对此,Xilinx官方推出了Video Processing Subsystem IP核,该IP可轻松支持4K视频缩放,但遗憾的是仅可在Xilinx自家系列FPGA上使用,或许复旦微也可以;
工程概述
本设采用Xilinx官方的Video Processing Subsystem IP核为核心,实现4K视频缩放;输入源为手写的一个彩条视频,彩条分辨率为1920x1080@30Hz或60Hz,双像素输出(一个时钟48bit像素),输出接口为AXI4-Stream;彩条生成后给到Xilinx官方的AXI4-Stream Data FIFO实现数据跨时钟域处理;然后给到Xilinx官方的Video Processing Subsystem IP核实现视频缩放操作,将输入的1920x1080视频放大为3840x2160;然后给到Xilinx官方HDMI 1.4/2.0 Transmitter Subsystem IP核做4K视频的编码工作,可同时编码视频流和音频流,本工程没有音频输入;输出3路AXI4-Stream流和DDC控制信号,3路AXI4-Stream流进入Xilinx官方的Video PHY Controller IP核做4K视频并串转化工作,将原3路20bit的AXI4-Stream并行数据串化为高速串行信号,该IP需使用FPGA GT高速接口资源;输出的差分视频信号从GT BANK上输出,进入到板载的DP159或其他同等功能的芯片做均衡处理,然后连接到HDMI2.0输出接口;HDMI2.0周边电路需要i2c配置,所以还需要调用Zynq或者MicroBlaze软核进行配置,软核开发工具为Vitis SDK;
针对目前市面上主流的FPGA,共移植了4套工程源码,详情如下:
现对上述4套工程源码做如下解释,方便读者理解:
工程源码1
开发板FPGA型号为Xilinx–>Xilinx–Kintex7–xc7k325tffg676-2;FPGA内部逻辑产生一个分辨率为1920x1080@30Hz、双像素输出(一个时钟48bit像素)、输出接口为AXI4-Stream的彩条视频作为输入源,再经过Xilinx官方的AXI4-Stream Data FIFO实现数据跨时钟域处理;再经过Xilinx官方的Video Processing Subsystem IP核实现视频缩放操作,将输入的1920x1080@30Hz视频放大为3840x2160@30Hz;再经过Xilinx官方的HDMI 1.4/2.0 Transmitter Subsystem IP核做4K视频的编码,再经过Xilinx官方的Video PHY Controller IP核做4K视频并串转换,输出的差分视频信号从GTX BANK上输出,最后连接到HDMI2.0输出接口;该工程需要运行MicroBlaze软核进行配置,适用于Xilinx 7系列FPGA开发移植;
工程源码2
开发板FPGA型号为Xilinx–>Xilinx–Kintex7–xc7k325tffg676-2;FPGA内部逻辑产生一个分辨率为1920x1080@60Hz、双像素输出(一个时钟48bit像素)、输出接口为AXI4-Stream的彩条视频作为输入源,再经过Xilinx官方的AXI4-Stream Data FIFO实现数据跨时钟域处理;再经过Xilinx官方的Video Processing Subsystem IP核实现视频缩放操作,将输入的1920x1080@60Hz视频放大为3840x2160@60Hz;再经过Xilinx官方的HDMI 1.4/2.0 Transmitter Subsystem IP核做4K视频的编码,再经过Xilinx官方的Video PHY Controller IP核做4K视频并串转换,输出的差分视频信号从GTX BANK上输出,最后连接到HDMI2.0输出接口;该工程需要运行MicroBlaze软核进行配置,适用于Xilinx 7系列FPGA开发移植;
工程源码3
开发板FPGA型号为Xilinx–>Xilinx–Zynq UltraScale+MPSoCs–xczu4ev-sfvc784-2-i;FPGA内部逻辑产生一个分辨率为1920x1080@30Hz、双像素输出(一个时钟48bit像素)、输出接口为AXI4-Stream的彩条视频作为输入源,再经过Xilinx官方的AXI4-Stream Data FIFO实现数据跨时钟域处理;再经过Xilinx官方的Video Processing Subsystem IP核实现视频缩放操作,将输入的1920x1080@30Hz视频放大为3840x2160@30Hz;再经过Xilinx官方的HDMI 1.4/2.0 Transmitter Subsystem IP核做4K视频的编码,再经过Xilinx官方的Video PHY Controller IP核做4K视频并串转换,输出的差分视频信号从GTH BANK上输出,最后连接到HDMI2.0输出接口;该工程需要运行Zynq软核进行配置,适用于Xilinx UltraScale+系列FPGA开发移植;
工程源码4
开发板FPGA型号为Xilinx–>Xilinx–Zynq UltraScale+MPSoCs–xczu4ev-sfvc784-2-i;FPGA内部逻辑产生一个分辨率为1920x1080@60Hz、双像素输出(一个时钟48bit像素)、输出接口为AXI4-Stream的彩条视频作为输入源,再经过Xilinx官方的AXI4-Stream Data FIFO实现数据跨时钟域处理;再经过Xilinx官方的Video Processing Subsystem IP核实现视频缩放操作,将输入的1920x1080@60Hz视频放大为3840x2160@60Hz;再经过Xilinx官方的HDMI 1.4/2.0 Transmitter Subsystem IP核做4K视频的编码,再经过Xilinx官方的Video PHY Controller IP核做4K视频并串转换,输出的差分视频信号从GTH BANK上输出,最后连接到HDMI2.0输出接口;该工程需要运行Zynq软核进行配置,适用于Xilinx UltraScale+系列FPGA开发移植;
本文详细描述了Xilinx系列FPGA实现4K视频缩放的设计方案,经过反复大量测试稳定可靠,可在项目中直接移植使用,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字通信领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
免责声明
本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。
2、相关方案推荐
我这里已有的FPGA图像缩放方案
我的主页目前有FPGA图像缩放专栏,改专栏收录了我目前手里已有的FPGA图像缩放方案,从实现方式分类有基于HSL实现的图像缩放、基于纯verilog代码实现的图像缩放;从应用上分为单路视频图像缩放、多路视频图像缩放、多路视频图像缩放拼接;从输入视频分类可分为OV5640摄像头视频缩放、SDI视频缩放、MIPI视频缩放等等;以下是专栏地址:
点击直接前往
4K视频输入输出方案
Xilinx系列FPGA有一套专用的基于GT高速接口资源的4K视频实现方案,我之前出过专门的博客,博客链接如下:
点击直接前往
Video Processing Subsystem视频缩放方案
Video Processing Subsystem是Xilinx官方推出的视频缩放方案,我之前出过专门的博客,博客链接如下:
点击直接前往
3、详细设计方案
设计框图
本设计使用的是Xilinx官方推荐的方案,设计框图如下:
测试彩条
输入源为纯verilog手写的一个彩条视频,彩条分辨率为1920x1080@30Hz或60Hz,双像素输出(一个时钟48bit像素),输出接口为AXI4-Stream;由于是双像素,所以30Hz的彩条参考时钟为74.25÷2=37.125M;60Hz的彩条参考时钟为148.5÷2=74.25M;彩条设置为8阶彩条,效果如下:
测试彩条在Block Design中如下:
AXI4-Stream Data FIFO
AXI4-Stream Data FIFO的作用是实现彩条数据跨时钟处理,由原来的37.125M或74.25M跨越到300M,这里的读时钟用300M,对应3840x2160的参考时钟;AXI4-Stream Data FIFO在Block Design中如下:
Video Processing Subsystem
本设计用到Xilinx官方的Video Processing Subsystem IP核实现视频缩放操作,将输入的1920x1080@30Hz视频放大为3840x2160@30Hz;Video Processing Subsystem有缩放、去隔行、颜色空间转换等功能,这里仅使用图像缩放功能;其特点如下:
优点1:适用于Xilinx所有系列的FPGA器件和所有的Vivado版本;
优点2:支持最大分辨率8K的视频缩放;
优点3:输入视频格式:AXI4-Stream,方便对接Xilinx图像处理套路的相关IP;
优点4:输出视频格式:AXI4-Stream,方便对接Xilinx图像处理套路的相关IP;
优点5:模块占用的FPGA逻辑资源更小,相比于自己写的HLS图像缩放而言,官方的Video Processing Subsystem资源占用大约减小30%左右,且更高效:
注意!!!!
注意!!!!
注意!!!!
注意!!!!
缺点1:需要SDK软件配置,其本质为通过AXI_Lite 做寄存器配置,设计难度现对复杂,对新手小白不太友好;
缺点2:Xilinx官方提供的Video Processing Subsystem IAP并不能实现任意尺寸的图像缩放,只能在IAP中视频分辨率查找表范围内进行缩放操作,如果想要实现自定义任意尺寸缩放,需要修改Xilinx官方提供的API源代码,对新手小白极其友好,有此类需求的朋友可以联系博主,提供私人定制服务,也就是我帮你修改Xilinx官方提供的API源代码,以实现自定义任意尺寸缩放操作;但本设计的4K30帧分辨率在官方的API中存在,所以不需要定制;
以工程源码2为例,Video Processing Subsystem逻辑资源如下,请谨慎评估你的FPGA资源情况;
Video Processing Subsystem IP配置如下:
HDMI 1.4/2.0 Transmitter Subsystem
用XIlinx方案做4K HDMI视频收发必须要用到此IP,需要输出的4K HDMI视频先进入Xilinx官方的HDMI 1.4/2.0 Transmitter Subsystem IP核做4K 高清视频的编码工作,同时编码视频流和音频流,这里的音频流并没有数据传入,只是做了预留,用户可根据需求决定是否加入音频;输出3路AXI4-Stream流和DDC控制信号;DMI 1.4/2.0 Transmitter Subsystem配置如下:
该IP需要在Vitis SDK中做进一步详细配置,详情参考Vitis SDK C语言软件代码;
Video PHY Controller
用XIlinx方案做4K HDMI2.0视频收发必须要用到此IP,Video PHY Controller IP核主要做解串和串化的工作,利用FPGA GT资源,在发送端做4K 高清视频并做串化工作,将原3路20bit的AXI4-Stream并行数据串化为高速串行信号;Video PHY Controller配置如下:
该IP需要在Vitis SDK中做进一步详细配置,详情参考Vitis SDK C语言软件代码;
输出均衡电路
在HDMI输出端需要加均衡器电路,大体方案如下:
图中IC型号只做参考,具体根据你的项目方案而定;
视频输出显示
视频输出显示需要支持4K@60Hz,一般情况下,1千块以内的显示器是不支持的,我是用的是家里的电视机,品牌为小米电视EA55-2022款(@雷军,雷总请给鸡腿),你可以查询一下你的电视是否支持4K@60Hz。。。
FPGA开发板
为了确保工程与硬件FPGA开发板的适配性,推荐使用本博主同款开发板,以减少移植难度和快速验证,当然,如果你有自己的FPGA板子,也可以用自己的,只不过需要根据你板子将工程移植一下;本博主现有两款FPGA开发板可配套本工程的两套代码,分别如下:
1–>Xilinx Kintxe7 FPGA开发板;
2–>Zynq UltraScale+ FPGA开发板
需要这两款开发板的请联系博主。。。
工程源码架构
工程源码架构包括vivado Block Design逻辑设计和vitis SDK软件设计;
以工程源码2为例,Block Design逻辑设计架构截图如下:
综合后的源码架构如下:
Vitis SDK软件代码如下:
代码为了兼容不同板卡的外围IC,所以代码显得冗余复杂,图中标记的为必须使用到的代码,大多数保持默认即可;主函数中图像缩放驱动调用如下:
4、工程源码1详解–>Kintex7版本,4K@30Hz版本
开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2022.2;
输入:FPGA内部生成彩条,双像素,分辨率1920x1080@30Hz;
图像缩放方案:Xilinx官方Video Processing Subsystem方案;
图像缩放示例:1920x1080@30Hz放大为3840x2160@30Hz;
输出:小米电视,HDMI2.0,分辨率3840x2160@30Hz;
软核类型:MicroBlaze;
使用GT资源类型:GTX;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
工程作用:此工程目的是让读者掌握Xilinx系列FPGA实现4K视频缩放的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
5、工程源码2详解–>Kintex7版本,4K@60Hz版本
开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2022.2;
输入:FPGA内部生成彩条,双像素,分辨率1920x1080@60Hz;
图像缩放方案:Xilinx官方Video Processing Subsystem方案;
图像缩放示例:1920x1080@60Hz放大为3840x2160@60Hz;
输出:小米电视,HDMI2.0,分辨率3840x2160@60Hz;
软核类型:MicroBlaze;
使用GT资源类型:GTX;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
工程作用:此工程目的是让读者掌握Xilinx系列FPGA实现4K视频缩放的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
6、工程源码3详解–>XCZU4EV版本,4K@30Hz版本
开发板FPGA型号:Xilinx–Zynq UltraScale+MPSoCs–xczu4ev-sfvc784-2-i;
开发环境:Vivado2022.2;
输入:FPGA内部生成彩条,双像素,分辨率1920x1080@30Hz;
图像缩放方案:Xilinx官方Video Processing Subsystem方案;
图像缩放示例:1920x1080@30Hz放大为3840x2160@30Hz;
输出:小米电视,HDMI2.0,分辨率3840x2160@30Hz;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
软核类型:Zynq UltraScale+ MPSoC;
使用GT资源类型:GTH;
工程作用:此工程目的是让读者掌握Xilinx系列FPGA实现4K视频缩放的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
7、工程源码4详解–>XCZU4EV版本,4K@60Hz版本
开发板FPGA型号:Xilinx–Zynq UltraScale+MPSoCs–xczu4ev-sfvc784-2-i;
开发环境:Vivado2022.2;
输入:FPGA内部生成彩条,双像素,分辨率1920x1080@60Hz;
图像缩放方案:Xilinx官方Video Processing Subsystem方案;
图像缩放示例:1920x1080@60Hz放大为3840x2160@60Hz;
输出:小米电视,HDMI2.0,分辨率3840x2160@60Hz;
工程源码架构请参考前面第3章节中的《工程源码架构》小节;
软核类型:Zynq UltraScale+ MPSoC;
使用GT资源类型:GTH;
工程作用:此工程目的是让读者掌握Xilinx系列FPGA实现4K视频缩放的设计能力,以便能够移植和设计自己的项目;
工程的资源消耗和功耗如下:
8、工程移植说明
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软核;
9、上板调试验证并演示
准备工作
试验需要准备以下设备:
FPGA开发板,可以自行购买,也可以找本博主购买同款开发板;
HDMI线;
4K分辨率显示器;
以工程源码1的开发板为例进行上板调试;
连接如下:
输出效果演示
输出效果静态演示如下:
输出效果动态演示如下:
FPGA-4K视频缩放
10、福利:工程代码的获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
此外,有很多朋友给本博主提了很多意见和建议,希望能丰富服务内容和选项,因为不同朋友的需求不一样,所以本博主还提供以下服务: