FPGA实现USB3.0 UVC 相机HDMI视频输出 基于FT602驱动 提供工程源码和QT上位机源码

1、前言

目前USB3.0的实现方案很多,但就简单好用的角度而言,FT601/602应该是最佳方案,因为它电路设计简单,操作时序简单,软件驱动简单,官方甚至提供了包括FPGA驱动在内的丰富的驱动源码和测试软件;

本设计用FPGA驱动FT602芯片实现USB3.0UVC 相机彩条视频输出试验,使用同步245模式通信,提供vivado工程源码,用笔记本电脑模拟HDMI摄像头,HDMI视频输入到FPGA开发板板载的ADV7611解码芯片,将HDMI视频解码为RGB视频,FPGA将RGB视频数据经过图像三帧缓存至DDR3后读出,经过RGB转YUV送入UVC模块,经FT602芯片的USB3.0接口输出到电脑主机,电脑端用FT602官方的软件接收视频,同时也可以用我们提供的QT上位机接收;
本设计完全可以模拟和实现USB3.0 UVC 相机的功能;代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的USB3.0 UVC 通信和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式以及上板调试的演示视频放在了文章末尾,请耐心看到最后;

2、UVC简介

UVC 全称为 USB Video Class,即:USB 视频类,是一种为 USB 视频捕获设备定义的协议标准。是 Microsoft与另外几家设备厂商联合推出的为 USB 视频捕获设备定义的协议标准,目前已成为 USB org 标准之一。支持 USB Video Class (UVC) standard 1.1 可以让相机在所有的作业系统以及平台中使用(Windows, Linux, Mac etc.)。用户只需连接相机便可进行图像传输,而无需安装任何驱动程序。UVC 相机最适合作为工业网络相机在视频会议、站亭系统、小型设备生产、物流业等应用中使用。
本设计使用FT602芯片实现USB3.0协议,采用verilog语言实现UVC总线协议;

3、FT602芯片解读

FT602 是 USB-to-FIFO 接口 SuperSpeed USB(USB 3.1 Gen 1)USB 视频类(UVC)桥接芯片具有以下特点:
1:支持 USB 3.1 GEN 1 超高速:(5Gbps)/ USB 2.0 高速(480Mbps);
2:支持 USB 传输类型:控制/散装/中断;
3:支持 UVC 1.1 版:支持最多 4 个视频输入通道;
4:FIFO 总线:支持 2 个并行从 FIFO 总线协议,245 FIFO 和多通道 FIFO 模式,数据突发速率高达 400MB / s,32 位并行接口;
5:内置 16kB FIFO 数据缓冲 RAM;
6:用于视频设备的内置 I2C 主接口;
7:组态:
7.1:支持多电压 I / O:1.8V,2.5V 和 3.3V;
7.2:内部 LDO 1.0V 稳压器;
7.3:集成的上电复位电路;
7.4:用户可编程 USB 和 UVC 描述符;
7.5:工业工作温度范围:-40 至 85⁰C;
7.6:符合 RoHS 标准的紧凑型无铅 QFN-76 封装;
芯片框图如下:
在这里插入图片描述
参考电路如下:
在这里插入图片描述

4、我这儿的 FT601 USB3.0通信方案

我这儿现有的FPGA基于FT601和FT602的USB3.0通信方案主要有简单的测速方案、图像传输方案,图像传输方案包括简单的彩条传输采集、OV5640摄像头传输采集、HDMI视频采集,HDMI视频采集抓拍、USB3.0 UVC视频等等,所有工方案均包括FPGA工程和QT上位机源码;感兴趣的可以去我的FT601 USB3.0通信专栏阅读,专栏地址如下:
https://blog.csdn.net/qq_41667729/category_12339160.html?spm=1001.2014.3001.5482

5、详细设计方案

详细设计方案框图如下:
在这里插入图片描述
HDMI视频输入和采集:
用笔记本电脑模拟HDMI摄像头,HDMI视频输入到FPGA开发板板载的ADV7611解码芯片,将HDMI视频解码为RGB视频,ADV7611解码芯片需要i2c配置才能使用,例程里提供了纯verilog代码的i2c配置;
FDMA图像缓存:
FDMA图像三帧缓存,经常看我文章的兄弟都知道,这是我惯用的图像缓存套路,它由FDMA控制器和FDMA构成,作用是将输入的视频缓存到DDR3里做三帧缓存后再读出来,目的是使得图像数据的输入输出跨时钟域读写,输出图像平稳无撕裂等现象;关于FDMA的详细设计说明,请参考我之前的文章:点击直接前往
RGB888转YUV444:
很简单的一个模块,将RGB888转为YUV444视频,因为UVC模块输入需要YUV格式视频;

基于FT602的UVC模块详解

模块代码架构如下:
在这里插入图片描述
可以看到顶层模块 ft602_uvc_top.v 包含了 7 个子模块。其中,sys_pll.v 用于生成 ft602 模块所需的时钟,主要是生产视频时许所需的时钟 27MHz (VGA), 74.25MHz (HD) and 148.5MHz (Full HD);
模块 ft602_i2c_slv.v 模拟一个 IIC 从机,FT602Q 芯片通过该接口读取 FPGA 中视频信息,同时将上位机的配置信息通过该接口配置到 FPGA。
模块 ft602_uvc_reg.v 包含了 UVC 协议对应的一些寄存器,关于视频制式的信息也从这里修改。
模块 ft602_uvc_fsm.v 是 uvc 在总线读写 FIFO 控制的状态机,四个通道,实际工程中,我们只使用一个通道。
模块 Module ft602_pre_fet.v 数据预读取,用于优化时序。类似于 cache 功能。
模块 ft602_pch_inp.v 为视频流处理模块,将 IMG 数据流转换为 FT602Q 对应的接口数据格式,通过 FIFO 缓存;
模块 ft602_img_rx 处理 IMG 输入视频流数据或者前面生成的测试数据流,将视频格式的数据流转换为 FT602 总线对应的数据格式。
模块 ft602_dclk_fifo 控制双口 ram,接收 ft602_img_rx 模块的视频流数据,同时对外提供 FIFO 读接口。模块结构如下图:本设计只是用了一个通道 Video ch0;
在这里插入图片描述
FT602 驱动和QT上位机:
FT602 驱动由官方提供,QT上位机采用C++语言编写,实时采集USB3.0接口的视频数据并显示;我提供的资料包里有QT上位机软件和QT源码,做嵌入式软件开发的兄弟可以拿去参考;

6、vivado工程详解

开发板FPGA型号:xc7k325tffg900-2;
开发环境:vivado2022.2;
输入:HDMI 1080P分辨率;
输出:FT602–USB3.0接口;
应用:模拟和实现 USB3.0 UVC 相机的功能;

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

7、上板调试验证

上板调试需要安装FT602官方驱动,还需要软件的配置,鉴于篇幅原因,我专门写了一篇调试使用的文档,并放在了资料包里,路径如下,调试时请参考使用和调试手册,如下:
在这里插入图片描述
最后的输出效果如下:
在这里插入图片描述

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

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

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
获取和设置UVC相机属性可以使用Qt和Media Foundation框架。以下是一些步骤: 1. 首先,需要使用Media Foundation框架来获取UVC相机的属性。在此之前,需要确保已经正确安装了Media Foundation SDK和UVC相机驱动程序。 2. 使用Media Foundation框架中的IMFActivate接口来获取UVC相机设备的属性。可以使用以下代码: ``` IMFAttributes* pAttributes = NULL; IMFActivate** ppDevices = NULL; // Create an attribute store to specify the enumeration parameters. HRESULT hr = MFCreateAttributes(&pAttributes, 1); if (SUCCEEDED(hr)) { // Specify the enumeration parameter. hr = pAttributes->SetGUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID ); } if (SUCCEEDED(hr)) { // Enumerate the devices. UINT32 count; hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count); } if (SUCCEEDED(hr)) { // Iterate through the devices and get the properties. for (UINT32 i = 0; i < count; i++) { IMFAttributes* pDeviceAttributes = NULL; hr = ppDevices[i]->GetAttributes(&pDeviceAttributes); if (SUCCEEDED(hr)) { // Get the device name. WCHAR* pName = NULL; UINT32 cchName; hr = ppDevices[i]->GetAllocatedString(MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, &pName, &cchName); if (SUCCEEDED(hr)) { wprintf(L"Device name: %s\n", pName); CoTaskMemFree(pName); } // Get the device ID. WCHAR* pId = NULL; UINT32 cchId; hr = ppDevices[i]->GetAllocatedString(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, &pId, &cchId); if (SUCCEEDED(hr)) { wprintf(L"Device ID: %s\n", pId); CoTaskMemFree(pId); } // Get the device attributes. GUID subtype; UINT32 width, height, fps; hr = pDeviceAttributes->GetGUID(MF_MT_SUBTYPE, &subtype); if (SUCCEEDED(hr)) { hr = MFGetAttributeSize(pDeviceAttributes, MF_MT_FRAME_SIZE, &width, &height); } if (SUCCEEDED(hr)) { hr = MFGetAttributeRatio(pDeviceAttributes, MF_MT_FRAME_RATE, &fps, 1); } if (SUCCEEDED(hr)) { wprintf(L"Video format: %s, %dx%d, %dfps\n", GetSubtypeName(subtype), width, height, fps); } pDeviceAttributes->Release(); } ppDevices[i]->Release(); } CoTaskMemFree(ppDevices); } pAttributes->Release(); ``` 3. 上面的代码将枚举UVC相机设备并获取它们的属性,包括设备名称、设备ID和视频格式。可以根据需要设置其他属性,例如曝光时间、增益等。可以使用以下代码设置相机属性: ``` IMFMediaSource* pSource = NULL; IMFAttributes* pAttributes = NULL; // Create the media source from the device ID. hr = MFCreateDeviceSource(pId, &pAttributes, &pSource); if (SUCCEEDED(hr)) { // Set the exposure time. hr = pAttributes->SetUINT64(MF_VIDCAP_CAMERACONTROL_EXPOSURE, exposureTime); } if (SUCCEEDED(hr)) { // Set the gain. hr = pAttributes->SetUINT64(MF_VIDCAP_CAMERACONTROL_GAIN, gainValue); } if (SUCCEEDED(hr)) { // Set the white balance. hr = pAttributes->SetUINT32(MF_VIDCAP_CAMERACONTROL_WHITEBALANCE, whiteBalanceValue); } // Release the media source and attributes. pSource->Release(); pAttributes->Release(); ``` 4. 上面的代码将设置UVC相机的曝光时间、增益和白平衡。可以根据需要设置其他属性。 希望这些代码可以帮助你获取和设置UVC相机属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

9527华安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值