• FPGA双线性插值图像缩放详细讲解,上板验证稳定通过,提供两套工程源码


    1、前言

    本设计图像缩放算法采用双线性插值,实现方式是Xilinx的HLS,采用C++语言实现代码级功能,再有HLS2019.1综合编译导出RTL级verilog代码,最后导出IP使用。
    本文详细描述了FPGA HLS双线性插值图像缩放+视频拼接的实现设计方案,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的高速信号传输领域;
    提供完整的、跑通的工程源码和技术支持;
    工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
    本设计提供3套工程源码:
    工程1:HDMI视频输入1080P,不缩放1080P直接输出;
    工程2:HDMI视频输入1080P,缩小至720P输出;
    工程3:HDMI视频输入1080P,缩小至960x540,调用Video Mixer IP二分频输出;
    附带还有HLS图像缩放的HLS工程源码;
    本例程使用的是Xilinx Kintex7 FPGA,若要用于Zynq,将HLS工程的FPGA器件型号更改后重新综合编译导出IP即可。

    2、HLS实现双线性插值图像缩放

    开局直接放大招:提供源码及工程;
    重点讲解双线性插值图像缩放;
    此功能模块使用HLS实现,并已封装导出IP,可在工程中添加并使用,可提供HLS工程源码;
    若是用verilog实现双线性插值图像缩放,是一项及其复杂的事情,且不能做到任意比例,网上也有源码,不信你可以去下载并验证,肯定做不到任意比例缩放;这样一来,HLS则成为了更好的选项,偷偷告诉你,HLS几行代码就搞定了;关于这个ip可以看我前面的文章HLS实现双线性插值图像缩放
    前面文章里的IP适用于zynq系列机器,这里讲的这个IP适用于7系列机器;

    3、vivado工程1:1080P缩小720P

    前面废话太多了,直接上工程:
    工程1:1080P缩小至720P;
    开发板:Xilinx Kintex7 开发板;
    开发环境:vivado2019.1;
    输入:HDMI-1080P;
    输出:HDMI-720P;
    工程架构如下:
    在这里插入图片描述
    用电脑输出1080P视频模拟输入;
    输入HDMI视频经IT6802解码为VGA格式的RGB视频流,关于IT6802的芯片解读和寄存器配置,请参考我前面的文章IT6802的芯片解读和寄存器配置
    然后用Xilinx官方IP将VGA格式的RGB视频流转为AXIS视频流;
    经自定义双线性插值图像缩放IP VIDEO SCALER将原视频缩小至720P;
    后面就是Xilinx的图像处理套路了,什么VDMA之类的,这里就不多说了;
    BD工程如下:
    在这里插入图片描述
    代码架构如下:
    在这里插入图片描述
    SDK软件文件如下:
    在这里插入图片描述
    主函数c代码如下:

    #include 
    #include "xgpio.h"
    #include "oak_iic.h"
    #include "unistd.h"
    #include "helai_vdma.h"
    #include "helai_color_back.h"
    #include "xvideo_scaler.h"
    
    XVideo_scaler K7_XVideo_scaler;
    XGpio_Config *XGpioCfg;
    XGpio led_gpio;
    #define	AXI_GPIO_DEVICE_ID	XPAR_GPIO_0_DEVICE_ID
    
    int main(){
    	XGpioCfg = XGpio_LookupConfig(AXI_GPIO_DEVICE_ID);
    	XGpio_CfgInitialize(&led_gpio, XGpioCfg, XGpioCfg->BaseAddress);
    	XGpio_SetDataDirection(&led_gpio, 1, 0);	//output
    	XGpio_DiscreteWrite(&led_gpio, 1, 0);
    	oak_i2c_init(IT6802_IIC_BASEADDR, 100000, 0x90>>1, IIC_REG_LEN8, IIC_DATA_LEN8);
    	IT6802_Init(IT6802_IIC_BASEADDR);
    	XVideo_scaler_Initialize(&K7_XVideo_scaler, XPAR_VIDEO_SCALER_0_DEVICE_ID);
    	XHls_video_scaler_setup(1080,1920,540,960);
    	helai_vdma();
    	while(1){
    		usleep(500000);
    		XGpio_DiscreteWrite(&led_gpio, 1, 1);
    		usleep(500000);
    		XGpio_DiscreteWrite(&led_gpio, 1, 0);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    4、vivado工程2:1080P缩小后video mixer拼接

    工程2:1080P缩小至960x540并用video mixer二分屏显示;
    开发板:Xilinx Kintex7 开发板;
    开发环境:vivado2019.1;
    输入:HDMI-1080P;
    输出:HDMI-960x540二分屏显示;
    工程架构如下:
    在这里插入图片描述
    用电脑输出1080P视频模拟输入;
    输入HDMI视频经IT6802解码为VGA格式的RGB视频流,关于IT6802的芯片解读和寄存器配置,请参考我前面的文章IT6802的芯片解读和寄存器配置
    然后调用两个Xilinx官方IP将VGA格式的RGB视频流转为两路AXIS视频流;
    调用两个自定义双线性插值图像缩放IP VIDEO SCALER将原视频缩小至720P;
    后面就是Xilinx的图像处理套路了,什么VDMA之类的,这里就不多说了;这里是两路视频,所以IP要用两个
    BD工程如下:
    在这里插入图片描述
    代码架构如下:
    在这里插入图片描述
    SDK软件文件如下:
    在这里插入图片描述
    主函数c代码如下:

    #include 
    #include "xgpio.h"
    #include "oak_iic.h"
    #include "unistd.h"
    #include "helai_vdma.h"
    #include "helai_color_back.h"
    #include "xvideo_scaler.h"
    #include "helai_mixer.h"
    
    XVideo_scaler K7_XVideo_scaler0,K7_XVideo_scaler1;
    XGpio_Config *XGpioCfg;
    XGpio led_gpio;
    #define	AXI_GPIO_DEVICE_ID	XPAR_GPIO_0_DEVICE_ID
    
    int main(){
    	XGpioCfg = XGpio_LookupConfig(AXI_GPIO_DEVICE_ID);
    	XGpio_CfgInitialize(&led_gpio, XGpioCfg, XGpioCfg->BaseAddress);
    	XGpio_SetDataDirection(&led_gpio, 1, 0);	//output
    	XGpio_DiscreteWrite(&led_gpio, 1, 0);
    	oak_i2c_init(IT6802_IIC_BASEADDR, 100000, 0x90>>1, IIC_REG_LEN8, IIC_DATA_LEN8);
    	IT6802_Init(IT6802_IIC_BASEADDR);
    
    	XVideo_scaler_Initialize(&K7_XVideo_scaler0, XPAR_VIDEO_SCALER_0_DEVICE_ID);
    	XHls_video_scaler_setup(&K7_XVideo_scaler0,1080,1920,540,960);
    	XVideo_scaler_Initialize(&K7_XVideo_scaler1, XPAR_VIDEO_SCALER_1_DEVICE_ID);
    	XHls_video_scaler_setup(&K7_XVideo_scaler1,1080,1920,540,960);
    	helai_vdma();
    	helai_mixer();
    	while(1){
    		usleep(500000);
    		XGpio_DiscreteWrite(&led_gpio, 1, 1);
    		usleep(500000);
    		XGpio_DiscreteWrite(&led_gpio, 1, 0);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    5、上板调试验证并演示

    上板调试:
    给出工程2的调试输出视频:

    hdmi_scaler_mixer2

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

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

  • 相关阅读:
    Sqlserver存储过程快速上手分享
    无胁科技-TVD每日漏洞情报-2022-11-16
    【PAT(甲级)】1069 The Black Hole of Numbers(易错点)
    php实战案例记录(24)不要键名只保留值的算法
    1.0零基础尝试DCM通讯(c-store)
    论文解读(SR-GNN)《Shift-Robust GNNs: Overcoming the Limitations of Localized Graph Training Data》
    EIA/TIA 561 Pin Layout and RS-232 pin assignments
    Node.js 事件循环和事件派发器
    torch.nn.init.kaiming_normal_
    JDK的安装-详细版
  • 原文地址:https://blog.csdn.net/qq_41667729/article/details/127583329