目录
- 1、前言
- 免责声明
- 2、AR0135工业相机简介
- 3、我这里已有的 FPGA 图像处理解决方案
- 4、设计思路框架
- AR0135配置和采集
- 图像缓存
- 视频输出
- 5、vivado工程1–>Kintex7开发板工程
- 6、vivado工程1–>Zynq7100开发板工程
- 7、上板调试验证
- 8、福利:工程代码的获取
1、前言
没玩过GT资源都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。
GT资源是Xilinx系列FPGA的重要卖点,也是做高速接口的基础,不管是PCIE、SATA、MAC等,都需要用到GT资源来做数据高速串化和解串处理,Xilinx不同的FPGA系列拥有不同的GT资源类型,低端的A7由GTP,K7有GTX,V7有GTH,更高端的U+系列还有GTY等,他们的速度越来越高,应用场景也越来越高端。。。
本文使用Xilinx的Kintex7和zynq7100开发板配置采集AR0135工业相机,并做HDMI输出显示;AR0135工业相机需要i2c配置才能正常使用,跟博客提供纯verilog实现的i2c代码对AR0135进行配置,本设计配置AR0135输出分辨率为1280x720@60Hz;本博客提供2套vivado工程源码,2套工程的不同点在于使用的FPGA型号不同;本博客详细描述了FPGA配置采集AR0135工业相机的设计方案,工程代码可综合编译上板调试,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做学习提升,可应用于医疗、军工等行业的高速接口或图像处理领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
免责声明
本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。
2、AR0135工业相机简介
AR0135是车规级感光芯片,具有高动态、130万全局自动曝光、自动增益等特性,输出分辨率达到了1280x720@60Hz;输出超高清灰度图像,是机器视觉和图像识别领域的明星相机,也广泛应用于工业现场领域;AR0135给人的最直观感受就是画质的超高清,打个不太恰当的比方,当你玩儿OV5640之类的摄像头时,总感觉是在看有码的电影,当你玩儿上了AR0135时,呈现在你眼前的是超高清无码的视觉盛宴。。。
3、我这里已有的 FPGA 图像处理解决方案
我的主页有FPGA 图像处专栏,该专栏有涵盖了基于FPGA实现各种图像处理的多种方案,包括图像缩放、图像拼接、图像叠加、图像旋转、动态字符叠加、MIPI视频解码、PAL视频解码、CameraLink视频解码、SDI视频解码等等;以下是专栏地址:
点击直接前往
4、设计思路框架
本博客提供2套vivado工程源码,2套工程的不同点在于使用的FPGA型号不同,第1套vivado工程源码使用的FPGA平台为Kintex7;第2套vivado工程源码使用的FPGA平台为Zynq7100,图像缓存至PS端DDR3,2套vivado工程源码设计思路框架分别如下:
AR0135配置和采集
AR0135工业相机需要i2c配置才能正常使用,跟博客提供纯verilog实现的i2c代码对AR0135进行配置,本设计配置AR0135输出分辨率为1280x720@60Hz;代码如下:
模块顶层如下:
module AR0135_CFG_RX #(parameter I2C_ID_ADDR = 8'h20 , // AR0135的i2c器件地址parameter SYS_CLK_FREQ = 100_000000, // 模块参考时钟频率parameter I2C_CLK_FREQ = 10_000 , // i2c运行时钟频率parameter OUT_PCLK_FREQ = 74_250000 // AR0135输出像素时钟频率
)(input sys_clk ,input resetn ,input i_ar0135_dclk , // 27Minput i_ar0135_pclk , input o_ar0135_xclk , input i_ar0135_vs ,input i_ar0135_de , input [7:0] i_ar0135_data , output o_ar0135_vs ,output o_ar0135_de , output [7:0] o_ar0135_data , output i2c_ar0135_sck,inout i2c_ar0135_sda
);
AR0135摄像头需要一个27M的运行时钟;AR0135视频采集后输出8bit的灰度图像;
图像缓存
经常看我博客的老粉应该都知道,我做图像缓存的套路是FDMA,他的作用是将图像送入DDR中做3帧缓存再读出显示,目的是匹配输入输出的时钟差和提高输出视频质量,关于FDMA,请参考我之前的博客,博客地址:点击直接前往
还有我用到了Zynq7100开发板,有别于全网其他博主的套路,他们基本都是用以VDMA为核心的图像缓存架构,这样做固然是可以的,但这一大堆IP你看不到源码,且用起来很烦,哪一个脚连错了都可能导致IP工作不起来,而且这些IP还需要用SDK配置,对于没有嵌入式C编程基础的兄弟而言很是头疼,我事儿仰望星空,我们就像快乐的玩儿一玩儿FPGA为什么就这么难呢?
就目前而言,VDMA有如下不便之处:
1:需要将视频转为AXI4-Stream流,无论是自己用fifo转还是使用官方的Video In to AXI4-Stream IP转,无疑都增加了资源消耗,对资源紧张的FPGA不宜,再者也加大了FPGA开发难度,对于刚入门的兄弟而言望而却步,最后,Video In to AXI4-Stream这个 IP也是个黑箱,出了问题排查问题太繁琐;
2:需要SDK配置,跑个VDMA还要打开SDK去调用官方库函数进行一大堆配置,无疑是烦,加之有些做硬件的兄弟c语言水平跟我一样菜,根本就搞不定嵌入式C,只想安安心心地干点儿FPGA的活儿就这么难吗?哈哈。。。
3:VDMA输出还要调用Video Time Controller和AXI4-Stream to Video Out这两个IP才能实现AXI4-Stream视频流到VGA时序的转换,实属费力又不讨好,还是同样的问题,增加资源消耗,黑箱操作,出了问题排查太繁琐;
基于此,我用zynq做图像缓存时就不用VDMA,而是用FDMA,在zynq中用FDMA取代VDMA具有以下优势:
1:不需要将输入视频转为AXI4-Stream流;节约资源,开发难度低;
2:不需要SDK配置,不要要会嵌入式C,纯FPGA开发者的福音;
3:看得到的源码,不存在黑箱操作问题;
关于如何在zynq中使用FDMA,请参考我之前的博客,博客地址:点击直接前往
视频输出
视频从FDMA读出后,经过VGA时序模块和HDMI发送模块后输出显示器,代码位置如下:
VGA时序配置为1920X1080,HDMI发送模块采用verilog代码手写,可以用于FPGA的HDMI发送应用,关于这个模块,请参考我之前的博客,博客地址:点击直接前往
5、vivado工程1–>Kintex7开发板工程
开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:AR0135,分辨率1280x720@60Hz;
输出:HDMI显示器,分辨率1280x720@60Hz;
应用:FPGA的AR0135视频采集输出;
工程Block Design如下:
工程代码架构如下:
综合编译完成后的FPGA资源消耗和功耗预估如下:
6、vivado工程1–>Zynq7100开发板工程
开发板FPGA型号:Xilinx–Zynq7100–xc7z100ffg900-2;
开发环境:Vivado2019.1;
输入:AR0135,分辨率1280x720@60Hz;
输出:HDMI显示器,分辨率1280x720@60Hz;
应用:Zynq的AR0135视频采集输出;
工程Block Design如下:
工程代码架构如下:
综合编译完成后的FPGA资源消耗和功耗预估如下:
由于没有用VDMA,所以SDK仅需运行一个简单的hello world即可;
7、上板调试验证
静态展示,Kintex7开发板工程为例;
动态展示,Zynq7100开发板工程为例;
Zynq7100-AR0135
8、福利:工程代码的获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下: