宁波模板建站代理,江西师范大学两学一做专题网站,商城小程序开发定制,网页制作难吗目录 1、前言版本更新说明免责声明 2、相关方案推荐FPGA图像缩放方案推荐FPGA视频拼接方案推荐 3、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条缓冲FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 视频拼接算法图像缓存视频输出 4、vivado工程12路视频缩放拼接5、vivado工程24路视频缩放拼接6、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他注意事项 7、上板调试验证并演示准备工作静态演示动态演示 8、福利工程源码获取 FPGA 多路视频处理图像缩放视频拼接显示HDMI采集提供2套工程源码和技术支持 1、前言
没玩过图像缩放和视频拼接都不好意思说自己玩儿过FPGA这是CSDN某大佬说过的一句话鄙人深信不疑。。。本文使用Xilinx的Kintex7 FPGA的图像缩放多路视频拼接方案视频源有两种分别对应开发者手里有没有摄像头的情况一种是使用板载的HDMI输入接口(笔记本电脑模拟HDMI输入)使用IT6802解码芯片将TMDS的差分HDMI视频解码为24位的RGB视频数据供FPGA使用如果你的FPGA开发板没有HDMI输入接口则可使用代码内部生成的动态彩条模拟摄像头视频视频源的选择通过代码顶层的define宏定义进行选择上电默认使用HDMI输入作为视频源提供2套vivado2019.1版本的工程源码2套工程源码的不同点在于图像缩放后的分辨率不同和视频拼接的方式不同工程1将输入的1920x1080分辨率视频通过图像缩放模块缩小到960x1080然后将视频复制两份用以模拟两路视频输入做两路视频拼接后在1920x1080分辨率的输出视频上做2分屏拼接显示工程2将输入的1920x1080分辨率视频通过图像缩放模块缩小到960x480然后将视频复制4份用以模拟4路视频输入做4路视频拼接后在1920x1080分辨率的输出视频上做4分屏拼接显示FPGA缩放后的视频用我常用的FDMA套路进行图像缓存缓存的介质为DDR3然后读出视频生成标准的1920x1080分辨率的VGA时序再用纯verilog实现的RGB转HDMI模块将视频输出到显示器显示
本博客详细描述了FPGA 图像缩放多路视频拼接的设计方案工程代码可综合编译上板调试可直接项目移植适用于在校学生、研究生项目开发也适用于在职工程师做学习提升可应用于医疗、军工等行业的高速接口或图像处理领域 提供完整的、跑通的工程源码和技术支持 工程源码和技术支持的获取方式放在了文章末尾请耐心看到最后
版本更新说明
此版本为第2版根据读者的建议对第1版工程做了如下改进和更新 1增加了输入视频静态彩条的选择有的读者说他的FPGA开发板没有HDMI输入接口导致在移植过程中困难很大基于此增加了静态彩条它由FPGA内部产生不需要外接摄像头就可以使用使用方法在后文有说明 2优化了FDMA之前的FDMA内AXI4的数据读写突发长度为256导致在低端FPGA上带宽不够从而图像质量不佳基于此将FDMA内AXI4的数据读写突发长度改为128 3优化了HDMI输出模块之前用的自定义IP有读者说IP无法更新虽能正常使用但看源码不方便基于此将HDMI输出模块改为纯verilog实现的直接了当
免责声明
本工程及其源码即有自己写的一部分也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等)若大佬们觉得有所冒犯请私信批评教育基于此本工程及其源码仅限于读者或粉丝个人学习和研究禁止用于商业用途若由于读者或粉丝自身原因用于商业用途所导致的法律问题与本博客及博主无关请谨慎使用。。。
2、相关方案推荐
本工程是图像缩放和视频拼接的整合版在此之前我分别推出过FPGA图像缩放方案和FPGA视频拼接方案所以推荐如下
FPGA图像缩放方案推荐
该方案使用纯verilog代码实现任意尺寸图像缩放详细请参考我之前的博客博客链接如下 直接点击前往
FPGA视频拼接方案推荐
该方案使用纯verilog代码实现多路视频拼接详细请参考我之前的博客博客链接如下 4路视频拼接方案参考博客链接如下直接点击前往 8路视频拼接方案参考博客链接如下直接点击前往 16路视频拼接方案参考博客链接如下直接点击前往
3、设计思路框架
视频源有两种分别对应开发者手里有没有摄像头的情况一种是使用板载的HDMI输入接口(笔记本电脑模拟HDMI输入)使用IT6802解码芯片将TMDS的差分HDMI视频解码为24位的RGB视频数据供FPGA使用如果你的FPGA开发板没有HDMI输入接口则可使用代码内部生成的动态彩条模拟摄像头视频视频源的选择通过代码顶层的define宏定义进行选择上电默认使用HDMI输入作为视频源提供2套vivado2019.1版本的工程源码2套工程源码的不同点在于图像缩放后的分辨率不同和视频拼接的方式不同工程1将输入的1920x1080分辨率视频通过图像缩放模块缩小到960x1080然后将视频复制两份用以模拟两路视频输入做两路视频拼接后在1920x1080分辨率的输出视频上做2分屏拼接显示工程2将输入的1920x1080分辨率视频通过图像缩放模块缩小到960x480然后将视频复制4份用以模拟4路视频输入做4路视频拼接后在1920x1080分辨率的输出视频上做4分屏拼接显示FPGA缩放后的视频用我常用的FDMA套路进行图像缓存缓存的介质为DDR3然后读出视频生成标准的1920x1080分辨率的VGA时序再用纯verilog实现的RGB转HDMI模块将视频输出到显示器显示 工程1设计框图如下 工程2设计框图如下
视频源选择
视频源有两种分别对应开发者手里有没有摄像头的情况一种是使用板载的HDMI输入接口(笔记本电脑模拟HDMI输入)使用IT6802解码芯片将TMDS的差分HDMI视频解码为24位的RGB视频数据供FPGA使用如果你的FPGA开发板没有HDMI输入接口则可使用代码内部生成的动态彩条模拟摄像头视频视频源的选择通过代码顶层的宏定义进行选择上电默认使用HDMI输入作为视频源视频源的选择通过代码顶层的define宏定义进行如下 视频源选择逻辑代码部分如下 选择逻辑如下 当(注释) define USE_SENSOR时输入源视频是动态彩条 当(不注释) define USE_SENSOR时输入源视频是HDMI
IT6802解码芯片配置及采集
IT6802解码芯片需要i2c配置才能使用关于IT6802解码芯片的配置和使用请参考我往期的博客博客地址点击直接前往 IT6802解码芯片配置及采集这两部分均用verilog代码模块实现代码位置如下 代码中配置为1920x1080分辨率
动态彩条
动态彩条可配置为不同分辨率的视频视频的边框宽度动态移动方块的大小移动速度等都可以参数化配置我这里配置为辨率1280x720动态彩条模块代码位置和顶层接口和例化如下
缓冲FIFO
缓冲FIFO的作用是为了解决跨时钟域的问题当视频不进行缩放时不存在视频跨时钟域问题但当视频缩小或放大时就存在此问题用FIFO缓冲可以使图像缩放模块每次读到的都是有效的输入数据注意原视频的输入时序在这里就已经被打乱了
图像缩放模块详解
设计框图
本设计将常用的双线性插值和邻域插值算法融合为一个代码中通过输入参数选择某一种算法代码使用纯verilog实现没有任何ip可在Xilinx、Intel、国产FPGA间任意移植代码以ram和fifo为核心进行数据缓存和插值实现设计架构如下 视频输入时序要求如下 输入像素数据在dInValid和nextDin同时为高时方可改变 视频输出时序要求如下 输出像素数据在dOutValid 和nextdOut同时为高时才能输出
代码框图
代码使用纯verilog实现没有任何ip可在Xilinx、Intel、国产FPGA间任意移植 图像缩放的实现方式很多最简单的莫过于Xilinx的HLS方式实现用opencv的库以c语言几行代码即可完成关于HLS实现图像缩放请参考我之前写的文章HLS实现图像缩放 网上也有其他图像缩放例程代码但大多使用了IP导致在其他FPGA器件上移植变得困难通用性不好相比之下本设计代码就具有通用性代码架构如图 其中顶层接口部分如下
2种插值算法的整合与选择
本设计将常用的双线性插值和邻域插值算法融合为一个代码中通过输入参数选择某一种算法 具体选择参数如下
input wire i_scaler_type //0--bilinear;1--neighbor通过输入i_scaler_type 的值即可选择 输入0选择双线性插值算法 输入1选择邻域插值算法 关于这两种算法的数学差异请参考我之前写的文章HLS实现图像缩放
视频拼接算法
视频拼接方案如下以工程2的4路OV5640摄像头拼接为例 输出屏幕分辨率为1920X1080 输入摄像头分辨率为960X540 4路输入刚好可以占满整个屏幕 多路视频的拼接显示原理如下 以把 2 个摄像头 CAM0 和 CAM1 输出到同一个显示器上为列为了把 2 个图像显示到 1 个显示器首先得搞清楚以下关系 hsize每 1 行图像实际在内存中占用的有效空间以 32bit 表示一个像素的时候占用内存大小为 hsize4 hstride用于设置每行图像第一个像素的地址,以 32bit 表示一个像素的时候 v_cnt hstride4 vsize有效的行 因此很容易得出 cam0 的每行第一个像素的地址也是 v_cnt hstride4 同理如果我们需要把 cam1 在 hsize 和 vsize 空间的任何位置显示我们只要关心 cam1 每一行图像第一个像素的地址可以用以下公式 v_cnt hstride*4offset uifdma_dbuf 支持 stride 参数设置stride 参数可以设置输入数据 X(hsize)方向每一行数据的第一个像素到下一个起始像素的间隔地址利用 stride 参数可以非常方便地摆放输入视频到内存中的排列方式。 关于uifdma_dbuf可以参考我之前写的文章点击查看FDMA实现视频数据三帧缓存 根据以上铺垫每路摄像头缓存的基地址如下 CAM0ADDR_BASE0x80000000 CAM1ADDR_BASE0x80000000(1920-960)X4 CAM2ADDR_BASE0x80000000(1080-540)X1920X4 CAM3ADDR_BASE0x80000000(1080-540)X1920X4(1920-960)X4 地址设置完毕后基本就完事儿了
图像缓存
经常看我博客的老粉应该都知道我做图像缓存的套路是FDMA他的作用是将图像送入DDR中做3帧缓存再读出显示目的是匹配输入输出的时钟差和提高输出视频质量关于FDMA请参考我之前的博客博客地址点击直接前往 这里多路视频拼接时调用多路FDMA进行缓存具体讲就是每一路视频调用1路FDMA以4路视频拼接为例 调用4路FDMA其中三路配置为写模式因为这三路视频在这里只需要写入DDR3读出是由另一个FDMA完成配置如下 另外1路FDMA配置为读写模式因为4路视频需要同时一并读出配置如下 视频拼接的关键点在于4路视频在DDR3中缓存地址的不同还是以4路视频拼接为例4路FDMA的写地址以此为 第一路视频缓存写基地址0x80000000 第二路视频缓存写基地址0x80000f00 第三路视频缓存写基地址0x803f4800 第四路视频缓存写基地址0x803f5700 视频缓存读基地址0x80000000
视频输出
视频从FDMA读出后经过VGA时序模块和HDMI发送模块后输出显示器代码位置如下 VGA时序配置为1280X720HDMI发送模块采用verilog代码手写可以用于FPGA的HDMI发送应用关于这个模块请参考我之前的博客博客地址点击直接前往
4、vivado工程12路视频缩放拼接
开发板FPGA型号Xilinx–Kintex7–xc7k325tffg676-2 开发环境Vivado2019.1 输入HDMI(IT6802解码)或动态彩条分辨率1920x1080 输出HDMI1080P分辨率下的显示2路拼接视频 工程应用FPGA 图像缩放多路视频拼接 工程BD如下 工程代码架构如下 工程的资源消耗和功耗如下
5、vivado工程24路视频缩放拼接
开发板FPGA型号Xilinx–Kintex7–xc7k325tffg676-2 开发环境Vivado2019.1 输入HDMI(IT6802解码)或动态彩条分辨率1920x1080 输出HDMI1080P分辨率下的显示4路拼接视频 工程应用FPGA 图像缩放多路视频拼接 工程BD如下 工程代码架构如下 工程的资源消耗和功耗如下
6、工程移植说明
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软核
7、上板调试验证并演示
准备工作
你需要有以下装备才能移植并测试该工程代码 1FPGA开发板 2板载的HDMI输入接口如果没有也可以就选择动态彩条 3HDMI传输线 4HDMI显示要求分辨率支持1920x1080
静态演示
工程1HDMI(IT6802解码)1920x1080输入缩放到960x1080后2路视频拼接2分屏输出如下 工程1动态彩条1920x1080输入缩放到960x1080后2路视频拼接2分屏输出如下 工程2HDMI(IT6802解码)1920x1080输入缩放到960x540后4路视频拼接4分屏输出如下 工程2动态彩条1920x1080输入缩放到960x540后4路视频拼接4分屏输出如下
动态演示
动态视频演示如下 FPGA-视频缩放拼接-HDMI-2023 8、福利工程源码获取
福利工程代码的获取 代码太大无法邮箱发送以某度网盘链接方式发送 资料获取方式私或者文章末尾的V名片。 网盘资料如下