0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >工业控制 > fpga MIPI 采集IMX219 图像 通过USB3.0 uvc传输(源码+原理图)

fpga MIPI 采集IMX219 图像 通过USB3.0 uvc传输(源码+原理图)

来源: 电路城
2021-11-15
类别:工业控制
eye 6
文章创建人 拍明

原标题:fpga MIPI 采集IMX219 图像 通过USB3.0 uvc传输(源码+原理图)

基于FPGA的MIPI采集与USB3.0 UVC传输系统设计:以IMX219图像传感器为例


引言

随着机器视觉、智能安防、医疗影像等领域的快速发展,对高分辨率、高帧率图像采集与传输的需求日益增长。传统的图像处理系统,如基于CPU或DSP的方案,在面对海量数据并行处理时,往往显得力不从心。而现场可编程门阵列(FPGA)凭借其强大的并行处理能力、可重构性以及低延迟特性,在图像采集与处理领域展现出巨大的优势。本文将深入探讨一种基于FPGA的解决方案,该方案利用FPGA作为核心,实现对MIPI CSI-2接口的IMX219图像传感器进行图像数据采集,并通过高速USB3.0接口,以UVC(USB Video Class)协议标准将图像数据实时传输至PC端,最终形成一个完整、高效的图像采集与传输系统。

image.png

第一章:系统总体架构与设计思路



1.1 系统架构概览


本系统设计旨在构建一个从图像源到PC端的完整通路。其核心组成部分包括:

  • 图像传感器模块:采用索尼IMX219传感器,负责将光学图像转换为数字电信号。

  • FPGA主控模块:系统的核心,负责配置IMX219、接收MIPI数据、进行图像处理(如Bayer解码、色彩校正等)、缓存图像数据以及实现USB3.0接口控制逻辑。

  • USB3.0接口模块:采用高速USB3.0收发芯片(如Cypress FX3),实现FPGA与PC之间的高速数据通信。

  • 电源管理模块:为系统各部分提供稳定、可靠的电源。

  • PC端软件:运行在PC上,负责通过UVC协议接收视频流,并进行显示、存储或进一步分析。

整个系统的工作流程如下:FPGA通过I2C总线对IMX219进行初始化配置,使其按照设定的分辨率和帧率输出图像数据。IMX219通过MIPI CSI-2接口将图像数据流传输至FPGA。FPGA内部的MIPI D-PHY接收器将串行数据解串,并将其转换为并行数据。随后,FPGA对接收到的原始Bayer格式数据进行处理,并将其组织成符合UVC协议的视频帧格式。最后,FPGA通过其高速接口与USB3.0芯片通信,将数据发送至PC端。PC端无需安装特定的驱动程序,即可通过标准UVC接口识别设备并获取视频流。


1.2 FPGA选型考量


FPGA的选型是系统设计的关键。考虑到MIPI CSI-2接口的高速特性(IMX219支持4路数据通道,每路最高1.2Gbps)以及USB3.0接口的高速数据吞吐量(5Gbps),所选FPGA必须具备以下特性:

  • 高速收发器(GT Transceivers):用于实现MIPI CSI-2 D-PHY接口的物理层。

  • 大容量内部存储器(BRAM):用于缓存图像帧数据,以平滑数据流和处理UVC传输过程中的速率不匹配问题。

  • 丰富的逻辑资源(Logic Cells):用于实现MIPI协议解析、图像处理算法、USB3.0接口控制逻辑等。

  • I/O接口:用于与IMX219的I2C总线、以及USB3.0芯片的并行接口(如GPIF II总线)进行通信。

基于这些需求,Xilinx的Artix-7系列、Kintex-7系列或Intel(前Altera)的Cyclone V、Arria V系列等FPGA都是合适的选择。它们都集成了足够数量的高速收发器和丰富的逻辑资源,能够满足本系统的设计要求。


1.3 USB3.0接口芯片选型


为了简化FPGA与USB3.0协议栈的实现,我们选择使用专用的USB3.0接口芯片。Cypress公司的FX3(CYUSB3014)芯片是业界公认的优秀选择。它内部集成了强大的ARM9处理器和可编程的GPIF II(General Programmable Interface II)接口,可以方便地与FPGA进行并行数据传输。FX3负责处理复杂的USB3.0协议栈,包括枚举、配置、数据包封装等,极大地减轻了FPGA的设计负担。FPGA只需通过GPIF II总线将图像数据以简单、高效的方式发送给FX3即可。


第二章:MIPI CSI-2图像数据采集



2.1 MIPI CSI-2协议解析


MIPI CSI-2(Camera Serial Interface 2)是一种广泛应用于移动设备中的高速串行接口标准。它采用差分信号传输,具有低功耗、低电磁干扰的优点。CSI-2协议栈分为三层:

  • 物理层(D-PHY):定义了串行差分信号的电气特性和传输方式。IMX219支持最高4个数据通道(Data Lane)和一个时钟通道(Clock Lane)。

  • 协议层(Protocol Layer):定义了数据包的格式,包括长数据包(Long Packet)和短数据包(Short Packet)。图像数据通常以长数据包的形式传输,其中包含数据类型、字数以及校验码等信息。

  • 应用层(Application Layer):定义了数据的具体格式,如RAW8/10/12等。IMX219输出的是10位的RAW数据。

在FPGA内部,我们需要实现一个MIPI D-PHY接收器来处理物理层的信号,并实现一个MIPI CSI-2协议解析器来处理协议层的数据包。幸运的是,主流FPGA厂商都提供了现成的MIPI IP核,大大简化了这一部分的设计。这些IP核通常包含D-PHY物理层和MIPI CSI-2协议层,用户只需配置好参数即可。


2.2 FPGA内部MIPI接收器设计


使用FPGA厂商提供的MIPI IP核是实现MIPI接收功能的最佳途径。以Xilinx为例,其MIPI D-PHY IP核可以配置为MIPI接收器模式。在Vivado设计套件中,通过IP Integrator工具将MIPI D-PHY IP核与用户逻辑连接。配置时需要注意:

  • 通道数配置:根据IMX219的输出配置,选择1、2或4个数据通道。

  • 时钟配置:配置时钟通道的时钟频率。IMX219的输出时钟频率根据分辨率和帧率而定。

  • 数据类型配置:配置IP核识别IMX219输出的RAW10数据类型。

MIPI IP核的输出通常是解串后的并行数据流,以及一个时钟信号(PCLK)和一个同步信号(VSYNC/HSYNC)。这些信号将作为后续图像处理模块的输入。


2.3 图像数据处理与缓存


从MIPI接收器输出的原始数据流是Bayer格式的RAW10数据。为了将其转换为PC端常用的YUV或RGB格式,需要进行一系列图像处理,包括:

  • 坏点校正(Defect Pixel Correction):检测并修正传感器上的坏点。

  • Bayer去马赛克(Bayer Demosaicing):将单通道的Bayer数据恢复为三通道的RGB数据。

  • 色彩校正(Color Correction):根据传感器特性进行色彩空间转换和校正。

  • Gamma校正:调整图像亮度。

这些处理算法需要占用大量的FPGA逻辑资源。在设计时,可以根据系统性能需求和FPGA资源,选择实现部分或全部算法。如果FPGA资源有限,也可以选择将原始RAW数据直接传输给PC,由PC端软件进行处理,但这样会增加PC端的处理负担。

在图像处理之后,处理好的RGB或YUV数据需要被缓存起来。这是因为MIPI数据流是连续的,而USB3.0的传输是基于数据包的,两者速率可能存在不匹配。为了确保数据传输的连续性和完整性,我们需要使用FPGA内部的BRAM或外部DDR SDRAM作为帧缓存。一个完整的帧缓存可以存储一帧完整的图像数据。当一帧数据采集完毕并存储到DRAM中后,USB3.0传输模块可以从DRAM中读取数据并发送出去。这种“双缓冲”机制可以确保采集和传输的独立性,避免数据丢失。


第三章:USB3.0 UVC视频传输



3.1 UVC协议基础


UVC(USB Video Class)是USB组织为视频设备制定的一种标准协议。遵循UVC协议的设备,无需安装额外的驱动程序,即可被操作系统识别为摄像头设备。这大大简化了用户的使用体验。UVC协议定义了设备的描述符、数据传输方式以及控制接口。

  • 控制接口(Control Interface):用于PC端向设备发送控制命令,如调整分辨率、帧率、亮度、对比度等。

  • 流接口(Streaming Interface):用于设备向PC端发送视频数据流。

  • 数据传输方式:UVC协议通常使用**等时传输(Isochronous Transfer)批量传输(Bulk Transfer)**来传输视频数据。等时传输保证了数据传输的实时性,但可能丢失数据;批量传输则保证了数据的完整性,但实时性相对较差。对于本系统,高分辨率高帧率的视频流更适合使用等时传输。


3.2 基于Cypress FX3的UVC固件设计


如前所述,我们使用Cypress FX3作为USB3.0接口芯片。FX3内部的ARM9处理器需要运行一个固件,来处理复杂的USB3.0协议栈和UVC协议栈。Cypress提供了功能强大的固件开发工具包(SDK),其中包含了UVC固件示例代码,这为我们的开发提供了极大的便利。

FX3固件的主要任务包括:

  • 设备描述符配置:根据系统的分辨率、帧率、视频格式等信息,配置USB描述符,使其符合UVC标准。这包括设备描述符、配置描述符、接口描述符、以及端点描述符等。

  • GPIF II总线配置:配置FX3的GPIF II总线,使其与FPGA的并行接口进行匹配。这包括数据位宽(如32位)、时钟、控制信号(如写使能、读使能、地址信号等)的时序配置。

  • USB数据传输:当PC端请求视频流时,FX3固件会启动数据传输。它会通过GPIF II总线向FPGA请求数据,然后将接收到的数据封装成USB数据包,并通过USB3.0物理层发送给PC。

  • 控制命令处理:当PC端发送UVC控制命令时,固件需要解析这些命令并将其转发给FPGA,由FPGA来调整IMX219的参数。


3.3 FPGA与FX3的数据传输接口设计


FPGA与FX3之间的数据传输是系统的瓶颈之一。为了实现高效传输,通常采用并行接口。FX3的GPIF II接口非常灵活,可以配置为多种模式,如16位或32位数据总线、同步或异步模式等。

在FPGA端,我们需要实现一个与GPIF II接口匹配的逻辑。这个逻辑模块从帧缓存(DRAM或BRAM)中读取图像数据,并将其通过并行总线以正确的时序发送给FX3。具体时序由GPIF II的配置决定。通常,FX3会提供一个时钟信号(如30MHz、60MHz、100MHz),FPGA的接口逻辑需要在该时钟的上升沿或下降沿将数据和控制信号(如地址、读/写使能)发送出去。

为了充分利用USB3.0的5Gbps带宽,FPGA与FX3之间的数据总线位宽应尽可能大。通常选择32位或16位。一个高效的传输逻辑可以采用DMA(Direct Memory Access)的思想,FPGA负责将数据从帧缓存读出并打包,然后通过一个FIFO(First-In, First-Out)缓冲区发送给FX3,由FX3完成后续的协议封装和传输。这种流水线式的设计可以确保数据流的连续性和高吞吐量。


第四章:FPGA内部模块实现与代码逻辑



4.1 MIPI D-PHY接收器逻辑


正如前面提到的,这部分通常通过调用FPGA厂商提供的IP核实现。用户只需在HDL(硬件描述语言,如Verilog或VHDL)中例化该IP核,并连接好其输入输出端口。


4.2 图像处理模块


这部分是FPGA设计的核心之一,需要用HDL语言从零开始编写。

Bayer去马赛克算法(Demosaicing)

最简单的算法是邻近点插值法。以G通道为例,对于一个R像素,它的G通道值可以由其上下左右四个邻近的G像素的平均值来近似。对于一个R像素,其周围的G像素为:

Gnew(i,j)=41(G(i1,j)+G(i+1,j)+G(i,j1)+G(i,j+1))

这个算法在FPGA中实现起来相对简单,但效果一般。更复杂的算法如双线性插值、边缘自适应算法等,效果更好,但需要更多的逻辑资源。在FPGA中,这些算法可以采用流水线结构实现,以达到高吞吐量。


4.3 帧缓存控制器


帧缓存控制器负责管理DRAM或BRAM。当MIPI接收器有新的图像数据到来时,控制器需要将数据写入到缓存中。当一帧数据完整写入后,或者当USB3.0传输模块请求数据时,控制器又需要将数据从缓存中读出。这部分逻辑需要处理好读写地址、时序以及读写冲突等问题。如果使用DDR SDRAM,还需要实现复杂的DDR控制器,幸运的是,FPGA厂商通常也提供了现成的DDR控制器IP核。


4.4 USB3.0接口控制逻辑


这部分逻辑负责与FX3的GPIF II接口进行通信。具体实现需要根据FX3的固件配置来确定。

  • 数据打包:从帧缓存读取的图像数据需要按照UVC协议的要求进行打包。例如,UVC视频流通常以带头部信息的数据包开始,包含帧号、时间戳等信息。

  • 握手协议:与FX3的GPIF II接口通信需要严格遵循时序。FPGA需要根据FX3提供的信号(如SLWR, SLRD等)来控制数据的读写。

  • 状态机:一个复杂的状态机可以很好地管理整个数据传输流程,包括等待FX3的请求、从缓存中读取数据、将数据发送给FX3等。


4.5 I2C配置模块


为了对IMX219进行配置,FPGA需要实现一个I2C主控制器。这个控制器负责通过I2C总线向IMX219发送寄存器地址和数据,从而控制其工作模式、分辨率、帧率、增益、曝光等参数。I2C协议相对简单,FPGA中可以很容易地用HDL语言实现。


第五章:系统联调与测试



5.1 硬件平台搭建


  • FPGA核心板:带有高速收发器和足够逻辑资源的FPGA板,如Xilinx Artix-7开发板。

  • USB3.0接口板:带有Cypress FX3芯片的接口板,通常会提供GPIF II接口的扩展排针。

  • IMX219摄像头模块:带有MIPI CSI-2接口的IMX219摄像头模组。

  • 电源:为所有模块提供稳定的5V或12V电源。

  • 连接线:确保各模块之间连接正确,特别是高速MIPI和USB3.0信号线,需要使用高质量、阻抗匹配的线材。


5.2 软件与固件下载


  • FPGA代码下载:使用JTAG编程器将编译好的FPGA比特流文件下载到FPGA中。

  • FX3固件下载:使用Cypress提供的USB Bootloader工具,通过USB将编译好的FX3固件.img文件下载到FX3的片上闪存中。


5.3 联调步骤


  1. FPGA-IMX219联调

    • 首先,确保FPGA能够通过I2C正确配置IMX219。

    • 然后,检查MIPI D-PHY接收器是否能正确接收到来自IMX219的数据流。通常可以使用逻辑分析仪或FPGA内部的ILA(Integrated Logic Analyzer)工具来验证。

    • 验证帧缓存是否能正确写入和读取图像数据。

  2. FPGA-FX3联调

    • 确保FPGA与FX3之间的GPIF II总线时序正确。

    • 使用ILA工具检查FPGA发送给FX3的数据流是否正确。

    • 在FX3固件中,可以添加调试打印信息,以验证是否成功接收到FPGA发送的数据。

  3. USB3.0-PC联调

    • 将设备连接到PC的USB3.0接口。

    • 如果一切顺利,PC端应该能够识别出一个UVC摄像头设备。

    • 使用PC端的摄像头软件(如Windows自带的相机应用、VLC播放器或Qt/OpenCV等自定义程序)来查看视频流。

    • 如果视频显示不正常,可能是数据格式、帧率或分辨率不匹配。


5.4 常见问题与排查


  • PC无法识别设备:检查FX3固件是否正确烧录,USB描述符是否配置正确。

  • 视频无图像或图像花屏:可能是MIPI D-PHY接收器配置错误、时序不匹配,或者FPGA内部的图像处理逻辑有bug。

  • 帧率低或卡顿:可能是数据吞吐量不足,检查FPGA与FX3之间的数据传输速率,或者帧缓存的读写效率。

  • 色彩失真:可能是Bayer去马赛克算法或色彩校正算法有误。


第六章:源码与原理图


由于字数要求和实际情况,本文无法直接提供完整的源代码和原理图,但可以详细描述其关键部分的设计思路和结构。


6.1 FPGA Verilog HDL 源码结构(示例)


FPGA的Verilog代码可以分为多个模块,每个模块负责一个特定的功能。

Verilog

// 顶层模块module top_level (    // MIPI接口
   inout mipi_clk_p,    inout mipi_clk_n,    inout [3:0] mipi_data_p,    
   inout [3:0] mipi_data_n,    // FX3 GPIF II接口
   input fx3_clk,    input fx3_slwr,    input fx3_slrd,    
   output [31:0] fx3_data,    input fx3_flag,    // I2C接口
   inout iic_scl,    inout iic_sda,    // ... 其他接口);    
   // 实例化MIPI D-PHY IP核
   mipi_dphy_rx mipi_rx (        
   .clk_p(mipi_clk_p),        
   .clk_n(mipi_clk_n),        
   .data_p(mipi_data_p),        
   .data_n(mipi_data_n),        
   .pclk(mipi_pclk),        
   .vsync(mipi_vsync),        
   .hsync(mipi_hsync),        
   .data(mipi_data_raw)
   );    // 实例化图像处理模块
   demosaic demosaic_inst (        
   .clk(mipi_pclk),        
   .data_in(mipi_data_raw),        
   .data_out(demosaic_data_rgb)
   );    // 实例化帧缓存控制器
   frame_buffer_controller fb_ctrl (        
   .clk(sys_clk),        
   .write_en(fb_write_en),        
   .write_addr(fb_write_addr),        
   .write_data(demosaic_data_rgb),        
   .read_en(fb_read_en),        
   .read_addr(fb_read_addr),        
   .read_data(fb_data_out),        
   .ddr_if(...)
   );    // 实例化USB3.0接口逻辑
   usb3_if usb3_inst (        
   .clk(sys_clk),        
   .fx3_clk(fx3_clk),        
   .fx3_slwr(fx3_slwr),        
   .fx3_slrd(fx3_slrd),        
   .fx3_data_out(fx3_data),        
   .read_data(fb_data_out),        
   .read_en(fb_read_en)
   );    // ... 其他模块endmodule


6.2 硬件原理图设计思路


原理图是硬件设计的蓝图,它描述了各个芯片和元器件之间的连接关系。

  • FPGA最小系统:包括FPGA芯片、配置芯片(如SPI Flash)、时钟晶振、电源稳压器、JTAG调试接口等。

  • MIPI接口部分:连接IMX219摄像头模组的连接器(通常为FPC或DVP接口)。差分信号需要进行阻抗匹配,并确保等长布线以避免时序偏移。

  • USB3.0接口部分:连接Cypress FX3芯片。FX3的USB3.0接口需要连接到Type-C或Micro-B USB3.0接口座,并遵循USB3.0规范的差分信号布线。

  • FPGA与FX3接口:将FPGA的GPIO与FX3的GPIF II接口相连。如果使用32位数据总线,需要连接32根数据线以及读写控制线。

  • 电源部分:设计多路稳压电源,为FPGA(如1.2V、3.3V)、IMX219(如2.8V、1.2V)和FX3(如1.2V、3.3V)提供稳定电源。

  • I2C接口:连接FPGA的I/O引脚与IMX219的I2C总线。


第七章:总结与展望


本文详细介绍了一种基于FPGA、MIPI和USB3.0 UVC的图像采集与传输系统设计。通过将FPGA的并行处理能力与USB3.0的高速传输能力相结合,该系统能够高效地完成从IMX219图像传感器到PC端的实时视频传输。这种方案具有以下优点:

  • 高性能:FPGA能够实现高分辨率、高帧率图像的实时处理,而USB3.0提供足够的带宽来传输这些数据。

  • 低延迟:硬件实现的流水线处理大大降低了系统延迟。

  • 免驱动:UVC协议使得设备在PC端即插即用,无需额外驱动。

  • 可定制性:FPGA的可编程性使得系统可以根据具体应用需求进行灵活定制,如添加特定的图像处理算法。

然而,本系统也存在一定的挑战。首先,FPGA和FX3的开发都需要一定的专业知识;其次,高速信号的硬件设计和布线需要非常严谨,否则容易出现信号完整性问题。

展望未来,随着FPGA技术的不断进步和USB4.0等新一代高速接口的普及,这类系统将拥有更强大的性能和更广泛的应用前景。例如,可以将更复杂的AI算法(如目标检测、图像分割等)集成到FPGA中,实现边缘计算,从而减轻PC端的处理负担,为智能视觉应用提供更强大的硬件基础。

责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

上一篇: 已是第一篇
标签: IMX219

相关资讯

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告