(目录)
# 1、设计思路和架构
本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;代码使用纯verilog实现,没有任何ip,可在Xilinx、Intel、国产FPGA间任意移植;代码以ram和fifo为核心进行数据缓存和插值实现,设计架构如下:
![在这里插入图片描述](
)
视频输入时序要求如下:
![在这里插入图片描述](
)
输入像素数据在dInValid和nextDin同时为高时方可改变;
视频输出时序要求如下:
![在这里插入图片描述](
)
输出像素数据在dOutValid 和nextdOut同时为高时才能输出;
# 2、纯verilog代码搭建,不带任何ip
代码使用纯verilog实现,没有任何ip,可在Xilinx、Intel、国产FPGA间任意移植;
图像缩放的实现方式很多,最简单的莫过于Xilinx的HLS方式实现,用opencv的库,以c++语言几行代码即可完成,关于HLS实现图像缩放请参考我之前写的文章[HLS实现图像缩放]([img pic_type=1 width= height=]https://blog.csdn.net/qq_41667729/article/details/128685859)</p><p>网上也有其他图像缩放例程代码,但大多使用了IP,导致在其他FPGA器件上移植变得困难,通用性不好;</p><p>相比之下,本设计代码就具有通用性;</p><p>代码架构如图;</p><p>![在这里插入图片描述](https://img-blog.csdnimg.cn/60b68034bafa4db488126b62f71d572a.png[/img]
)
其中顶层接口部分如下:
![在这里插入图片描述](
)
# 3、双线性插值和邻域插值算法
本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;
具体选择参数如下:
```c
input wire i_scaler_type //0-->bilinear;1-->neighbor
```
通过输入i_scaler_type 的值即可选择;
> 输入0选择双线性插值算法;
> 输入1选择邻域插值算法;
关于这两种算法的数学差异,请参考我之前写的文章[HLS实现图像缩放](https://blog.csdn.net/qq_41667729/article/details/128685859)
# 4、vivado和matlab联合仿真及结果
第一步:网上下载一张1280X720的图片,并用matlab将图片转换为RGB格式的txt文档;
第二步:在vivado下设计tstbench,将RGB格式的txt文档作为视频输入源给到图像缩放模块,并将缩放后的图像数据写入输出txt文档;
第二步:用matlab将输出txt文档转换为图片,并于原图一并输出显示以做比较;
根据以上方法得到以下仿真结果:
双线性插值算法原图1280X720缩小到800x600如下:
![在这里插入图片描述](
)
邻域插值算法原图1280X720缩小到800x600如下:
![在这里插入图片描述](
)
双线性插值算法原图1280X720放大到1920x1080如下:
![在这里插入图片描述](
)
邻域插值算法原图1280X720放大到1920x1080如下:
![在这里插入图片描述](
)
# 5、工程代码1:720P原始摄像头采集显示
三套工程的设计架构都一样,如下:
![在这里插入图片描述](
)
开发板:Xilinx Kintex7开发板;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720p;
输出:HDMI,1080P分辨率下的720P有效区域显示;
工程作用:采集原始的720P图像,以便和后面的缩小效果作比较;
工程BD如下:
![在这里插入图片描述](
)
其中FDMA控制器配置如下:
![在这里插入图片描述](
)
FDMA架构实现了视频到DDR3的三帧缓存读写,关于FDMA,请参考我之前写的文章[FDMA视频到DDR3的三帧缓存]([img pic_type=1 width= height=]https://blog.csdn.net/qq_41667729/article/details/127688741)</p><p>工程代码架构如下:</p><p>![在这里插入图片描述](https://img-blog.csdnimg.cn/76b90ad7195e4f0584fd4d455f5051c2.png[/img]
)
工程的资源消耗和功耗如下:
![在这里插入图片描述](
)
# 6、工程代码2:720P缩小到800x600P显示
开发板:Xilinx Kintex7开发板;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720p;
输出:HDMI,1080P分辨率下的800x600有效区域显示;
工程作用:1280x720原图缩小到800x600,并和原图作比较;
工程设计框架、BD、工程代码架构和工程1一样,FDMA配置如下:
![在这里插入图片描述](
)
# 7、工程代码3:720P缩放大1920x1080P显示
开发板:Xilinx Kintex7开发板;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720p;
输出:HDMI,1080P分辨率下的800x600有效区域显示;
工程作用:1280x720原图放大到1920x1080,并和原图作比较;
工程设计框架、BD、工程代码架构和工程1一样,FDMA配置如下:
![在这里插入图片描述](
)
# 8、上板调试验证并演示
板子连接如下:
![在这里插入图片描述](
)
工程1:原图1280x720输出效果如下:
![在这里插入图片描述](
)
工程2:原图1280x720缩小到800x600输出效果如下:
![在这里插入图片描述](
)
工程3:原图1280x720放大到1920x1080输出效果如下:
![在这里插入图片描述](
)
动态视频演示如下:
参考原文连接:https://blog.csdn.net/qq_41667729/article/details/128816196
# 9、福利:工程源码获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
![在这里插入图片描述](
)
# 1、设计思路和架构
本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;代码使用纯verilog实现,没有任何ip,可在Xilinx、Intel、国产FPGA间任意移植;代码以ram和fifo为核心进行数据缓存和插值实现,设计架构如下:
![在这里插入图片描述](
)
视频输入时序要求如下:
![在这里插入图片描述](
)
输入像素数据在dInValid和nextDin同时为高时方可改变;
视频输出时序要求如下:
![在这里插入图片描述](
)
输出像素数据在dOutValid 和nextdOut同时为高时才能输出;
# 2、纯verilog代码搭建,不带任何ip
代码使用纯verilog实现,没有任何ip,可在Xilinx、Intel、国产FPGA间任意移植;
图像缩放的实现方式很多,最简单的莫过于Xilinx的HLS方式实现,用opencv的库,以c++语言几行代码即可完成,关于HLS实现图像缩放请参考我之前写的文章[HLS实现图像缩放]([img pic_type=1 width= height=]https://blog.csdn.net/qq_41667729/article/details/128685859)</p><p>网上也有其他图像缩放例程代码,但大多使用了IP,导致在其他FPGA器件上移植变得困难,通用性不好;</p><p>相比之下,本设计代码就具有通用性;</p><p>代码架构如图;</p><p>![在这里插入图片描述](https://img-blog.csdnimg.cn/60b68034bafa4db488126b62f71d572a.png[/img]
)
其中顶层接口部分如下:
![在这里插入图片描述](
)
# 3、双线性插值和邻域插值算法
本设计将常用的双线性插值和邻域插值算法融合为一个代码中,通过输入参数选择某一种算法;
具体选择参数如下:
```c
input wire i_scaler_type //0-->bilinear;1-->neighbor
```
通过输入i_scaler_type 的值即可选择;
> 输入0选择双线性插值算法;
> 输入1选择邻域插值算法;
关于这两种算法的数学差异,请参考我之前写的文章[HLS实现图像缩放](https://blog.csdn.net/qq_41667729/article/details/128685859)
# 4、vivado和matlab联合仿真及结果
第一步:网上下载一张1280X720的图片,并用matlab将图片转换为RGB格式的txt文档;
第二步:在vivado下设计tstbench,将RGB格式的txt文档作为视频输入源给到图像缩放模块,并将缩放后的图像数据写入输出txt文档;
第二步:用matlab将输出txt文档转换为图片,并于原图一并输出显示以做比较;
根据以上方法得到以下仿真结果:
双线性插值算法原图1280X720缩小到800x600如下:
![在这里插入图片描述](
)
邻域插值算法原图1280X720缩小到800x600如下:
![在这里插入图片描述](
)
双线性插值算法原图1280X720放大到1920x1080如下:
![在这里插入图片描述](
)
邻域插值算法原图1280X720放大到1920x1080如下:
![在这里插入图片描述](
)
# 5、工程代码1:720P原始摄像头采集显示
三套工程的设计架构都一样,如下:
![在这里插入图片描述](
)
开发板:Xilinx Kintex7开发板;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720p;
输出:HDMI,1080P分辨率下的720P有效区域显示;
工程作用:采集原始的720P图像,以便和后面的缩小效果作比较;
工程BD如下:
![在这里插入图片描述](
)
其中FDMA控制器配置如下:
![在这里插入图片描述](
)
FDMA架构实现了视频到DDR3的三帧缓存读写,关于FDMA,请参考我之前写的文章[FDMA视频到DDR3的三帧缓存]([img pic_type=1 width= height=]https://blog.csdn.net/qq_41667729/article/details/127688741)</p><p>工程代码架构如下:</p><p>![在这里插入图片描述](https://img-blog.csdnimg.cn/76b90ad7195e4f0584fd4d455f5051c2.png[/img]
)
工程的资源消耗和功耗如下:
![在这里插入图片描述](
)
# 6、工程代码2:720P缩小到800x600P显示
开发板:Xilinx Kintex7开发板;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720p;
输出:HDMI,1080P分辨率下的800x600有效区域显示;
工程作用:1280x720原图缩小到800x600,并和原图作比较;
工程设计框架、BD、工程代码架构和工程1一样,FDMA配置如下:
![在这里插入图片描述](
)
# 7、工程代码3:720P缩放大1920x1080P显示
开发板:Xilinx Kintex7开发板;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720p;
输出:HDMI,1080P分辨率下的800x600有效区域显示;
工程作用:1280x720原图放大到1920x1080,并和原图作比较;
工程设计框架、BD、工程代码架构和工程1一样,FDMA配置如下:
![在这里插入图片描述](
)
# 8、上板调试验证并演示
板子连接如下:
![在这里插入图片描述](
)
工程1:原图1280x720输出效果如下:
![在这里插入图片描述](
)
工程2:原图1280x720缩小到800x600输出效果如下:
![在这里插入图片描述](
)
工程3:原图1280x720放大到1920x1080输出效果如下:
![在这里插入图片描述](
)
动态视频演示如下:
参考原文连接:https://blog.csdn.net/qq_41667729/article/details/128816196
# 9、福利:工程源码获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
![在这里插入图片描述](
)