国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持
作者:mmseoamin日期:2023-12-18

目录

  • 1、前言
    • 免责声明
    • 2、相关方案推荐
      • 国产高云FPGA相关方案推荐
      • 国产高云FPGA基础教程
      • 3、设计思路框架
        • 视频源选择
        • OV5640摄像头配置及采集
        • 动态彩条
        • 跨时钟FIFO
        • 图像缩放模块详解
          • 设计框图
          • 代码框图
          • 2种插值算法的整合与选择
          • Video Frame Buffer 图像缓存
          • DDR3 Memory Interface
          • 4、Gowin工程1:640x480不缩放操作
          • 5、Gowin工程2:640x480缩小到300x300
          • 6、Gowin工程3:640x480缩小到100x100
          • 7、Gowin工程4:640x480缩小到300x720
          • 8、Gowin工程5:640x480缩小到1280*360
          • 9、Gowin工程6:640x480缩小到1280x720
          • 10、上板调试验证并演示
            • 准备工作
            • 静态演示
            • 11、福利:工程源码获取

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持

              1、前言

              “苟利国家生死以,岂因祸福避趋之!”大洋彼岸的我优秀地下档员,敏锐地洞察到祖国的短板在于高精尖半导体的制造领域,于是本着为中华民族伟大复兴的中国梦贡献绵薄之力的初心,懂先生站在高略高度和长远角度谋划,宁愿背当代一世之骂名也要为祖国千秋万世谋,2018年7月,懂先生正式打响毛衣战,随后又使出恰勃纸战术,旨在为祖国先进制程半导体领域做出自主可控的战略推动;在此,请收下我一声谢谢啊!!!!!!

              2019年初我刚出道时,还是Xilinx遥遥领先的时代(现在貌似也是),那时的国产FPGA还处于辣鸡段位,国产FPGA仰望Xilinx情不自禁道:你以为躲在这里就找不到你吗?没用的,你那样拉轰的男人,无论在哪里,都像黑夜里的萤火虫那样的鲜明、那样的出众,你那忧郁的眼神,稀嘘的胡渣子,神乎其技的刀法,还有那杯Dry martine,都深深的迷住了我。。。然而才短短4年,如今的国产FPGA属于百家争鸣、百花齐放、八仙过海、神仙打架、方兴未艾、得陇望蜀、友商都是XX的喜极而泣之局面,面对此情此景,不得不吟唱老人家的诗句:魏武挥鞭,东临碣石有遗篇,萧瑟秋风今又是,换了人间。。。

              言归正传,目前对于国产FPGA的共识有以下几点:

              1:性价比高,与同级别国外大厂芯片相比,价格相差几倍甚至十几倍;

              2:自主可控,国产FPGA拥有完整自主知识产权的产业链,从芯片到相关EDA工具

              3:响应迅速,FAE技术支持比较到位,及时解决开发过程中遇到的问题,毕竟中文数据手册。。

              4:采购方便,产业链自主可控,采购便捷

              本文使用国产高云GW2A-LV18PG484C7/I6型号的FPGA做纯verilog实现视频图像缩放,视频源有两种,分别对应开发者手里有没有摄像头的情况,一种是使用廉价的OV5640摄像头;如果你手里没有OV5640摄像头或者FPGA开发板没有摄像头输入接口,则可使用代码内部生成的动态彩条模拟摄像头视频,视频源的选择通过代码顶层的`define宏定义进行选择,上电默认选择OV5640摄像头作为输入源;FPGA首先使用纯verilog实现的i2c控制器配置ov5640摄像头,将其分辨率配置为640x480@60Hz,同时生成用纯verilog实现动态彩条,其分辨率为640x480@60Hz;FPGA采集到输入视频后,首先将图像送入缓冲FIFO中做跨时钟域处理,即用输出1280x720@60Hz的屏幕背景分辨率作为读FIFO的时钟,这样可以确保在各种分辨率的图像缩放操作中,送入图像缩放模块的时钟时钟是够大的,也是带宽满足的一种操作;随后将视频送入纯verilog实现的图像缩放模块做图像缩放操作,该模块很简单,只需给出输入分辨率和输出分辨率即可,不需要去管缩放比例之类的问题,一般而言,输入分辨率是不变的,只需要改变输出分辨率即可;缩放后的视频,其原有的时序已经被完全打乱,所以需要调用高云官方的Video Frame Buffer IP核将视频送到外接DDR3中做三帧缓存;调用高云官方的DDR3 Memory Interface IP核实现图像数据到DDR3颗粒的搬运工作,类似于Xilinx的MIG;然后读出视频送VGA输出时序同步像素数据,VGA输出分辨率为1280x720@60Hz;缩放后的视频相当于叠加显示在1280x720的背景之上;最后调用高云官方的DVI TX IP核实现RGB视频到HDMI视频的转换,输出显示器显示;

              提供5套Gowin-V1.9版本的工程源码;5套工程的区别在于缩放后的输出分辨率不同,分别如下:

              第一套Gowin工程:输入分辨率640x480;输出分辨率640x480;不做缩放操作;

              第二套Gowin工程:输入分辨率640x480;输出分辨率300x300;做缩小操作;

              第三套Gowin工程:输入分辨率640x480;输出分辨率100x100;做缩小操作;

              第四套Gowin工程:输入分辨率640x480;输出分辨率300x720;做不规则的缩放操作;

              第五套Gowin工程:输入分辨率640x480;输出分辨率1280x360;做不规则的缩放操作;

              第六套Gowin工程:输入分辨率640x480;输出分辨率1280x720;做放大操作;

              本文详细描述了国产高云FPGA图像视频采集系统的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;

              提供完整的、跑通的工程源码和技术支持;

              工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

              免责声明

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

              2、相关方案推荐

              国产高云FPGA相关方案推荐

              鉴于国产高云FPGA的优异表现和市场需求,我专门开设了一个人国产高云FPGA专栏,里面收录了基于国产高云FPGA的图像处理、UDP网络通信、GT高速接口、PCIE等博客,感兴趣的可以去看看,博客地址:点击直接前往

              国产高云FPGA基础教程

              高云FPGA开发软件Gowin的下载、安装、Licence共享,工程搭建、代码添加、综合、编译、下载、各种IP的调用、配置、使用等基础操作,是做高云FPGA开发的基本功,当然,如果你已是有经验的工程师,则可以省略这一步,为此,我专门开设了专栏,详细讲述国产高云FPGA基础教程,甚至可以说是保姆级的教程,专栏地址如下:

              点击直接前往

              3、设计思路框架

              本文使用国产高云GW2A-LV18PG484C7/I6型号的FPGA做纯verilog实现视频图像缩放,视频源有两种,分别对应开发者手里有没有摄像头的情况,一种是使用廉价的OV5640摄像头;如果你手里没有OV5640摄像头或者FPGA开发板没有摄像头输入接口,则可使用代码内部生成的动态彩条模拟摄像头视频,视频源的选择通过代码顶层的`define宏定义进行选择,上电默认选择OV5640摄像头作为输入源;FPGA首先使用纯verilog实现的i2c控制器配置ov5640摄像头,将其分辨率配置为640x480@60Hz,同时生成用纯verilog实现动态彩条,其分辨率为640x480@60Hz;FPGA采集到输入视频后,首先将图像送入缓冲FIFO中做跨时钟域处理,即用输出1280x720@60Hz的屏幕背景分辨率作为读FIFO的时钟,这样可以确保在各种分辨率的图像缩放操作中,送入图像缩放模块的时钟时钟是够大的,也是带宽满足的一种操作;随后将视频送入纯verilog实现的图像缩放模块做图像缩放操作,该模块很简单,只需给出输入分辨率和输出分辨率即可,不需要去管缩放比例之类的问题,一般而言,输入分辨率是不变的,只需要改变输出分辨率即可;缩放后的视频,其原有的时序已经被完全打乱,所以需要调用高云官方的Video Frame Buffer IP核将视频送到外接DDR3中做三帧缓存;调用高云官方的DDR3 Memory Interface IP核实现图像数据到DDR3颗粒的搬运工作,类似于Xilinx的MIG;然后读出视频送VGA输出时序同步像素数据,VGA输出分辨率为1280x720@60Hz;缩放后的视频相当于叠加显示在1280x720的背景之上;最后调用高云官方的DVI TX IP核实现RGB视频到HDMI视频的转换,输出显示器显示;

              提供5套Gowin-V1.9版本的工程源码;5套工程的区别在于缩放后的输出分辨率不同,分别如下:

              第一套Gowin工程:输入分辨率640x480;输出分辨率640x480;不做缩放操作;

              第二套Gowin工程:输入分辨率640x480;输出分辨率300x300;做缩小操作;

              第三套Gowin工程:输入分辨率640x480;输出分辨率100x100;做缩小操作;

              第四套Gowin工程:输入分辨率640x480;输出分辨率300x720;做不规则的缩放操作;

              第五套Gowin工程:输入分辨率640x480;输出分辨率1280x360;做不规则的缩放操作;

              第六套Gowin工程:输入分辨率640x480;输出分辨率1280x720;做放大操作;

              设计框图如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第1张

              注意:框图中的数字表示数据流向的顺序;

              视频源选择

              视频源有两种,分别对应开发者手里有没有摄像头的情况,一种是使用廉价的OV5640摄像头;如果你手里没有OV5640摄像头或者FPGA开发板没有摄像头输入接口,则可使用代码内部生成的动态彩条模拟摄像头视频,视频源的选择通过代码顶层的`define宏定义进行选择,上电默认选择OV5640摄像头作为输入源;视频源选择如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第2张

              视频源选择逻辑代码部分如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第3张

              选择逻辑如下:

              当(注释) define COLOR_IN时,输入源视频是OV5640;

              当(不注释) define COLOR_IN时,输入源视频是动态彩条;

              OV5640摄像头配置及采集

              OV5640摄像头需要i2c配置才能使用,需要将DVP接口的视频数据采集为RGB565或者RGB888格式的视频数据,这两部分均用verilog代码模块实现,代码位置如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第4张

              其中摄像头配置为分辨率1280x720,如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第5张

              摄像头采集模块支持RGB565和RGB888格式的视频输出,可由参数配置,如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第6张

              RGB_TYPE=0输出本RGB565格式;

              RGB_TYPE=1输出本RGB888格式;

              设计选择RGB888格式;

              动态彩条

              动态彩条可配置为不同分辨率的视频,视频的边框宽度,动态移动方块的大小,移动速度等都可以参数化配置,以工程1为例,配置为辨率1280x720,动态彩条模块代码位置和顶层接口和例化如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第7张

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第8张

              跨时钟FIFO

              调用高云官方的FIFO;跨时钟FIFO的作用是为了解决跨时钟域的问题,当视频不进行缩放时不存在视频跨时钟域问题,但当视频缩小或放大时就存在此问题,用FIFO缓冲可以使图像缩放模块每次读到的都是有效的输入数据,注意,原视频的输入时序在这里就已经被打乱了;

              关于高云官方FIFO IP的更多详细讲解,请参考我的专栏:高云FPGA开发基础教程,专栏地址如下:

              点击直接前往

              图像缩放模块详解

              因为我们的QT上位机目前只支持1280x720,所以才需要缩放,即从输入的1920x1080分辨率缩小为1280x720;用笔记本电脑模拟HDMI视频输入源;

              设计框图

              本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;代码使用纯verilog实现,没有任何ip,可在Xilinx、Intel、国产FPGA间任意移植;代码以ram和fifo为核心进行数据缓存和插值实现,设计架构如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第9张

              视频输入时序要求如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第10张

              输入像素数据在dInValid和nextDin同时为高时方可改变;

              视频输出时序要求如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第11张

              输出像素数据在dOutValid 和nextdOut同时为高时才能输出;

              代码框图

              代码使用纯verilog实现,没有任何ip,可在Xilinx、Intel、国产FPGA间任意移植;

              图像缩放的实现方式很多,最简单的莫过于Xilinx的HLS方式实现,用opencv的库,以c++语言几行代码即可完成,关于HLS实现图像缩放请参考我之前写的文章HLS实现图像缩放

              网上也有其他图像缩放例程代码,但大多使用了IP,导致在其他FPGA器件上移植变得困难,通用性不好;相比之下,本设计代码就具有通用性;代码架构如图;

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第12张

              其中顶层接口部分如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第13张

              2种插值算法的整合与选择

              本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;

              具体选择参数如下:

              input  wire i_scaler_type //0-->bilinear;1-->neighbor
              

              通过输入i_scaler_type 的值即可选择;

              输入0选择双线性插值算法;

              输入1选择邻域插值算法;

              关于这两种算法的数学差异,请参考我之前写的文章HLS实现图像缩放

              Video Frame Buffer 图像缓存

              调用高云官方的Video Frame Buffer IP核将视频送到外接DDR3中做三帧缓存;该部分是图像采集显示系统的重点核难点,如果是其他FPGA,则需要写一大堆代码才能实现,还要调试,花费时间和精力很多,但高云FPGA则轻松实现了改功能,因为人家直接做成了IP,即Video Frame Buffer;这里简单介绍一下该IP,因为高云有详细的中文手册说明该IP的使用,手册我也放在了资料包里;

              我对该IP的配置只适用于我的设计,如果你要修改IP的配置的话,可以按照如下方式修改,然后重新生成IP:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第14张

              Video Frame Buffer IP配置如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第15张

              关于Video Frame Buffer IP的更多详细讲解,请参考我的专栏:高云FPGA开发基础教程,专栏地址如下:

              点击直接前往

              DDR3 Memory Interface

              调用高云官方的DDR3 Memory Interface IP核实现图像数据到DDR3颗粒的搬运工作,类似于Xilinx的MIG;DDR3 Memory Interface IP配置如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第16张

              关于DDR3 Memory Interface IP的更多详细讲解,请参考我的专栏:高云FPGA开发基础教程,专栏地址如下:

              点击直接前往

              4、Gowin工程1:640x480不缩放操作

              开发板FPGA型号:国产高云–GW2A-LV18PG484C7/I6;

              开发环境:Gowin-V1.9

              输入:OV5640摄像头或动态彩条,分辨率640x480;

              缩放前的视频分辨率:640x480;

              缩放后的视频分辨率:640x480;

              输出:HDMI,在1280x720的背景下叠在缩放后的640x480视频;

              工程作用:视频经过缩放模块,但不进行缩放操作,即一比一缩放;

              工程代码架构如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第17张

              工程的资源消耗和功耗如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第18张

              我发布的工程均已编译通过,如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第19张

              5、Gowin工程2:640x480缩小到300x300

              开发板FPGA型号:国产高云–GW2A-LV18PG484C7/I6;

              开发环境:Gowin-V1.9

              输入:OV5640摄像头或动态彩条,分辨率640x480;

              缩放前的视频分辨率:640x480;

              缩放后的视频分辨率:300x300;

              输出:HDMI,在1280x720的背景下叠在缩放后的300x300视频;

              工程作用:视频缩小操作;

              工程代码架构、工程的资源消耗和功耗等与第4章节的内容基本一致;

              6、Gowin工程3:640x480缩小到100x100

              开发板FPGA型号:国产高云–GW2A-LV18PG484C7/I6;

              开发环境:Gowin-V1.9

              输入:OV5640摄像头或动态彩条,分辨率640x480;

              缩放前的视频分辨率:640x480;

              缩放后的视频分辨率:100x100;

              输出:HDMI,在1280x720的背景下叠在缩放后的100x100视频;

              工程作用:视频缩小操作;

              工程代码架构、工程的资源消耗和功耗等与第4章节的内容基本一致;

              7、Gowin工程4:640x480缩小到300x720

              开发板FPGA型号:国产高云–GW2A-LV18PG484C7/I6;

              开发环境:Gowin-V1.9

              输入:OV5640摄像头或动态彩条,分辨率640x480;

              缩放前的视频分辨率:640x480;

              缩放后的视频分辨率:300x720;

              输出:HDMI,在1280x720的背景下叠在缩放后的300x720视频;

              工程作用:视频做不规则的缩放操作;

              工程代码架构、工程的资源消耗和功耗等与第4章节的内容基本一致;

              8、Gowin工程5:640x480缩小到1280*360

              开发板FPGA型号:国产高云–GW2A-LV18PG484C7/I6;

              开发环境:Gowin-V1.9

              输入:OV5640摄像头或动态彩条,分辨率640x480;

              缩放前的视频分辨率:640x480;

              缩放后的视频分辨率:1280360;

              输出:HDMI,在1280x720的背景下叠在缩放后的1280360视频;

              工程作用:视频做不规则的缩放操作;

              工程代码架构、工程的资源消耗和功耗等与第4章节的内容基本一致;

              9、Gowin工程6:640x480缩小到1280x720

              开发板FPGA型号:国产高云–GW2A-LV18PG484C7/I6;

              开发环境:Gowin-V1.9

              输入:OV5640摄像头或动态彩条,分辨率640x480;

              缩放前的视频分辨率:640x480;

              缩放后的视频分辨率:1280x720;

              输出:HDMI,在1280x720的背景下叠在缩放后的1280x720视频;

              工程作用:视频做放大操作;

              工程代码架构、工程的资源消耗和功耗等与第4章节的内容基本一致;

              10、上板调试验证并演示

              准备工作

              你需要有以下装备才能移植并测试该工程代码:

              1:FPGA开发板;

              2:OV5640摄像头,如果没有也可以,就选择动态彩条;

              3:HDMI传输线;

              4:HDMI显示,要求分辨率支持1280x720;

              连接如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第20张

              静态演示

              第一套Gowin工程:输入分辨率640x480;输出分辨率640x480;不做缩放操作;输出如下:

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第21张

              第二套Gowin工程:输入分辨率640x480;输出分辨率300x300;做缩小操作;

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第22张

              第三套Gowin工程:输入分辨率640x480;输出分辨率100x100;做缩小操作;

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第23张

              第四套Gowin工程:输入分辨率640x480;输出分辨率300x720;做不规则的缩放操作;

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第24张

              第五套Gowin工程:输入分辨率640x480;输出分辨率1280x360;做不规则的缩放操作;

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第25张

              第六套Gowin工程:输入分辨率640x480;输出分辨率1280x720;做放大操作;

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第26张

              11、福利:工程源码获取

              福利:工程代码的获取

              代码太大,无法邮箱发送,以某度网盘链接方式发送,

              资料获取方式:私,或者文章末尾的V名片。

              国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持,在这里插入图片描述,第27张