FPGA采集CameraLink相机Full模式解码输出,附带工程源码和技术支持

news/2024/7/21 6:55:16 标签: fpga开发, CameraLink, LVDS, 图像采集, 图像处理

目录

  • 1、前言
  • 2、CameraLink协议基础
  • 3、目前我已有的CameraLink收发工程
  • 4、设计方案
    • 输入CameraLink相机
    • 视频缓存
    • 视频输出
    • 软件配置
  • 5、vivado工程详解
  • 6、上板调试验证
  • 7、福利:工程代码的获取

1、前言

FPGA实现CameraLink视频编解码目前有两种方案:
一是使用专用编解码芯片,比如典型的DS90CR287;另一种方案是使用FPGA实现编解码,利用FPGA的serdes资源实现解串,优点是合理利用了FPGA资源,serdes资源不用白不用,缺点是操作难度大一些,对FPGA水平要求较高。

本文详细描述了FPGA采集CameraLink相机Full模式解码输出的实现设计方案,思路是这样的,CameraLink相机输入到FPGA板子,FPGA使用内部逻辑资源实现LVDS视频解码,解析出像素时钟、行同步信号、场同步信号、数据有效信号、以及像素数据,然后将视频转为Xilinx的AXI4-Sream的视频流,经VDMA送入DDR3缓存,然后读取出视频再经过AXI4-Sream to Video Out通过HDMI接口输出视频,这是Xilinx图像处理常用的套路,可谓相当精巧的方案,呵呵。。。

工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

CameraLink_10">2、CameraLink协议基础

关于这部分,网上有很多博主解释过,我找了几篇推荐兄弟们去学习理论知识:
第一篇链接:点击直接前往
第二篇链接,这是我之前写的:点击直接前往

CameraLink_14">3、目前我已有的CameraLink收发工程

我的CameraLink视频专栏有很多FPGA的CaeraLink视频编解码方案,既有CaeraLink接收,也有CaeraLink发送,既有CaeraLink普通输出显示,也有CaeraLink视频拼接输出等等,专栏链接如下:欢迎前往查看:点击直接前往

4、设计方案

详细设计方案如下:
在这里插入图片描述

CameraLink_19">输入CameraLink相机

CameraLink相机型号为北京微视的RS-A5241-CC107-S00型彩色 CameraLink 相机,该相机可通过串口配置为Base模式或者Full模式,本工程使用的是Full模式;分辨率为全幅面 25602048 下,帧率可达 107fps;本工程配置为12801024;
在这里插入图片描述
CameraLink解码模块在Base模式时输入信号如下:
1路差分时钟,4路差分数据;利用Xilinx官方的IDELAY和ISERDES源语实现串并转换;
IDELAY源语的作用是延时,以便于FPGA采样时的CameraLink视频数据是稳定的;
ISERDES源语的作用是实现CameraLink视频数据的串并转换;
整个CameraLink解码模块严格按照设计框图实现,主要是调用源语,所以没啥可讲的,具体看代码,代码量很少;
CameraLink解码模块参数配置如下:
在这里插入图片描述
这两个参数可自由配置,以适应CameraLink相机的不同模式;具体配置如下:
在这里插入图片描述

视频缓存

解码后的视频转为Xilinx的AXI4-Sream的视频流,经VDMA送入DDR3缓存,然后读取出视频再经过AXI4-Sream to Video Out通过HDMI接口输出视频,这是Xilinx图像处理常用的套路;整个视频缓存架构以VDMA为核心,全部调用Xilixn的IP实现,只需配置IP即可使用,这里的配置既包括UI界面的配置,也包括软件的配置,由于本工程采用Kintex7位平台,所以调用MicroBlaze软核运行SDK来配置这些IP;

视频输出

这里调用了Video Mixer这个IP,因为CameraLink相机配置为12801024,输出分辨率为19201080,所以用Video Mixer来做19201080的黑色背景,再其上叠加12801024的相机视频;
调用AXI4-Sream to Video Out输出VGA时序,板载一颗sil9022芯片完成VGA转TMDS最终由HDMI接口输出显示器显示;

软件配置

所以调用MicroBlaze软核运行SDK来配置这些IP、配置CameraLink相机、配置sil9022芯片、以及完成和上位机的人机交互;
调用一个AXI-UART完成和上位机的人机交互,也就是上位机通过串口调试助手给程序发指令;
调用一个AXI-UART完成CameraLink相机的配置,本工程配置为1280*1024分辨率,Full模式;
调用一个AXI-IIC完成sil9022芯片的配置;

5、vivado工程详解

开发板FPGA型号:xc7k325tffg676-2;
开发环境:vivado2019.1;
输入:CameraLink相机;Full模式;12801024分辨率;
输出:HDMI,1920
1080分辨率;

Bolck Design设计如下:
在这里插入图片描述
1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
综合后的工程代码架构如下:
在这里插入图片描述
综合编译完成后的FPGA资源消耗和功耗预估如下:
在这里插入图片描述
SDK软件程序架构如下:
在这里插入图片描述

6、上板调试验证

由于CamerLink转接板不方便出境,仅展示FPGA板子及对应的CamerLink转接板接口,如下:
在这里插入图片描述
工程的使用和配置过程较为复杂,这里感觉步骤太多了写不下,所以我专门写了一篇使用调试手册的文档,放在了资料包里,路径如下:
在这里插入图片描述
注意!!!
注意!!!
注意!!!
下载本工程后,请将文件放到一个最短路径的文件夹里去,因为路径太长可能导致工程编译失败;还有,本工程试用了HLS的IP核,在编译前请更新官方的补丁文件,不然综合时会报错,更新官方的补丁文件的文件下载和更新方法都写在了上图的文档里,记得仔细阅读;
输出效果如下:
在这里插入图片描述

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

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式1:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/361610.html

相关文章

Python+Pandas数据清洗的步骤

一、导语二、常见步骤1. 导入 Pandas:2. 加载数据:3. 观察数据:4. 处理缺失值:5. 处理重复值:6. 数据类型转换:7. 处理异常值:8. 数据重塑:9. 数据归一化/标准化:10. 保存…

C++ Qt Animation Framework基操

Qt Animation Framework &#xff0c;该框架提供了一些预定义的动画效果&#xff0c;如淡入淡出、旋转、缩放等&#xff0c;并且可以自定义动画效果。 以下是一个简单的演示如何使用 Qt Animation Framework 来实现一个简单的动画效果&#xff1a; #include <QApplicatio…

作为996社畜,如何自学Python?一文讲清楚

作为996社畜&#xff0c;应该如何自学Python&#xff1f;今天就给大家分享一下&#xff0c;工作之余&#xff0c;应该如何学习Python&#xff1f; 1. 明确目标 对于零基础的学员而言&#xff0c;要明确你学习Python仅仅是为了满足好奇心&#xff1f;还是有工作需要&#xff0c…

堪称「史上最详细」的整车信息安全强标将发布!释放了哪些信号?

确保汽车整车信息安全&#xff0c;或成为车企们继智能化竞争的下一个竞争焦点。 可以说&#xff0c;在智能化、网联化的驱动下&#xff0c;智能汽车成为了数据收集、数据传输、数据处理的关键节点&#xff0c;消费者在享受汽车智能化带来便利的同时&#xff0c;也逐渐重视智能…

Flutter_环境配置

FlutterSDK 下载FlutterSDK管理工具<SideKick>下载安装<SideKick>下载FlutterSDK设置全局SDK 修改Flutter配置文件获取全局SDK路径 验证配置是否成功验证环境配置 下载FlutterSDK管理工具 下载安装 SideKick下载链接 下载FlutterSDK 打开 SideKick选择需要的SD…

Stack 栈的实现与应用

目录 1. 概念 2. 常用的栈的方法 2.1 方法 2.2 代码 3. 自己实现栈 3.1 构造MyStack 3.2 push() 3.3 ensureCapacity&#xff08;&#xff09; 3.4 pop() 3.5 peek() 3.6 empty() 3.7 szie() 4. 栈的应用 1. 概念 栈&#xff08;Stack&#xff09;是一种数据结构&…

Java并发体系-锁与同步-[2]

可见性设计的硬件 从硬件的级别来考虑一下可见性的问题 **1、第一个可见性的场景&#xff1a;**每个处理器都有自己的寄存器&#xff08;register&#xff09;&#xff0c;所以多个处理器各自运行一个线程的时候&#xff0c;可能导致某个变量给放到寄存器里去&#xff0c;接着…

python入门(9)面向对象 :封装、继承、多态与垃圾回收

1. 封装 在Python中&#xff0c;封装是面向对象编程中的一个重要概念&#xff0c;它允许将数据和方法隐藏在类的内部&#xff0c;只暴露一部分接口供外部访问。通过封装&#xff0c;可以有效地控制数据的访问权限&#xff0c;提高代码的可维护性和安全性。 1.1 修饰符 Pytho…