MIPI CSI-2协议 FPGA应用详解

一,前言

  本文主要阐述mipi phy layer 到csi2 lane managenment layer 到low level protocol layer的数据接收过程,更高层的byte to pixel以及医用层可按照csi2协议解包.

本文主要参考文献:

1.mipi D PHY specification version 1.2

2.mipi CSI-2 specification version 2.1

二,正文

1.mipi csi-2结构简介

mipi csi-2的结构类似于以太网的分层结构,如下图所示:

MIPI CSI-2协议 FPGA应用详解_第1张图片

phy layer为物理层,通过控制时钟以及数据通道信号的电平值,实现低速模式(low power,或者说低功耗模式)与高速模式(high speed)的切换.

lane management layer 负责检测各通道(lane)低速模式到高速模式的跳变,并检测高速数据的同步头(HS ...00011101...序列),进一步将各通道的同步头对齐到字节,最终各通道的同步头实现对齐.

low level protocol layer,按照csi2协议,解析出帧起始(Frame Start,FS)短包,视频数据长包,以及帧结束(Frame End,FE)短包.输出图像数据,帧有效,数据有效.

byte to pixel unpack format层负责将基于字节的数据,按照协议,还原成各颜色空间/格式的像素数据,比如rgb565,raw10等格式.

2.csi-2采集整体结构

整体结构图如下:

MIPI CSI-2协议 FPGA应用详解_第2张图片

首先运行摄像头配置模块,通过iic总线配置摄像头,是摄像头输出指定格式的视频流.

sensor输出视频流后,phy层接收模块会接收到4通道(或者2通道,可配置)串行双沿差分数据以及一个通道的差分时钟信号.phy层接收模块会调用fpga厂家提供的源语,对输入信号做串并转换以及差分到单端的转换.输出每个通道的两根差分线可输出l0,l1两bit低速信号(4通道就是l0[3:0]以及l1[3:0]),或者输出四路高速视频数据,rx_byte_clk的时钟频率是rx_clk_p/n的四分之一,内部源语的解串比是4:1,再双沿转单沿后,四个通道的数据共32bit数据输出给字节对齐模块.(四个字节之间还没对齐)

字节对齐模块检测各个通道低速模式到高速模式的跳变,并检测高速数据的同步头,先将各个通道的同步头对齐到字节,再将各个通道的同步头也对齐.

解包模块解析出帧起始短包,数据长包,以及帧结束短包.输出图像,后续按照协议将包数据恢复成各种格式的像素.

3.phy层设计

phy层接收模块示意图如下:

MIPI CSI-2协议 FPGA应用详解_第3张图片

GTP_IOBUF_RX_MIPI源语完成差分转单端,逻辑电平转换(不完成双沿转单沿,iserdes以4:1的时钟比,将串行双沿数据转换成8bit单沿并行数据).高低电平转换指示为高时,该源语工作于高速模式,电压摆幅200mv,有利于高速传输数据.指示为低时,源语工作于低速模式,此时源语输出两根低速单端信号.

根据csi-2协议,低速信号LP11->LP01->LP00序列标志着主设备(摄像头)从低速模式进入高速模式.从设备(fpga)可设置一个状态机,先让源语工作在低速模式,实时监测LP11->LP01->LP00序列.监测到该序列后,向GTP_IOBUF_RX_MIPI源语发出转换到高速模式的指示.进入高速模式后,监测各个通道的rx_data_hs是否出现同步头(...00011101...),低位先传,即监测0xB8序列.

4.字节对齐模块设计

序列00011101有可能分布在两拍rx_data_hs[7:0]上,因此需将各个通道的同步头做相应的移位,使得B8位于一个字节之内,然后再对齐各个通道的B8,使得各通道的B8位于同一拍时钟之内.简单代码如下:

assign data_2byte = {rx_data_hs,rx_data_hs_d1};

for(i=0;i<8;i=i+1)

{

always@(*)

begin

if(c_state==LP00)

    begin

        if(data_2byte[(i+8):i]==8'hb8  && data_2byte[i:0]==8'b0)

            lane0[i]=1'b1

        else

            lane0[i]=1'b0;

    end

end

}

always@(posedge rx_byte_clk)

begin

if(lane0 != 8'b0 && sot_flag0==1'b0)

begin

    case(lane0)

        8'd1:reg <= 3'd0;

        8'd2:reg <= 3'd1;

        8'd4:reg <= 3'd2;

...

        8'd128 <= reg <= 3'd7;

    endcase

end

end

always@(posedge rx_byte_clk)

begin

    if(c_state==IDLE)

        sot_flag0 <=0;

    else if(lane0 != 0)

        sot_flag0<= 1;

end

always@(*)

begin

    case(reg)

        3'd0:lane_byte = date_2byte_d1[8:1];

        3'd1:lane_byte = date_2byte_d1[9:2];

...

        3'd7:ane_byte = date_2byte_d1[15:8];

    endcase

end

lane_byte就是某一通道对齐到字节的同步头.

一般各通道对齐后的同步头,会位于同一时钟周期内.四个通道的b8下一拍就是数据包的内容,可以按照csi2协议解包

5.解包模块

mipi的数据包分为长包和短包两大类.长包用于传输视频数据,一个长包传输一行视频数据.短包用于传输帧头帧尾,行头行尾(可选)

长包格式如下图:

MIPI CSI-2协议 FPGA应用详解_第4张图片

上图中SOT即前文所述的B8同步头.SOT后的首字节为包类型信息

CS后,LP信息由LP00跳转到LP11,表明lane由高速转入低速模式.

解包模块的接口信号如下:

input rx_byte_clk,

input rst_n,

input dpckt_en,

input [31:0] shift_data,

output [31:0] csi_data,

output csi_fv,

output csi_data_vld

解包模块的整体思路是,在字节对齐模块对齐B8后,拉高depkt_en,以状态机检测帧起始短包,检测到短包以后拉高帧有效信号csi_fv,检测到长包以后拉高csi_data_vld.输出数据csi_data,则是将shift_data延迟若干拍.该输出数据信号尚未对齐到像素.

将对齐到字节的数据转换成各种格式的视频像素(raw10,rgb565,yuv422等),可按照协议进一步解析.难度不大.

 

 

 

 

你可能感兴趣的:(接口协议)