camera - link

发布时间 : 星期四 文章camera - link更新完毕开始阅读

人才

一种基于Camera Link 接口的图像采集和处理系统

作者:华中光电技术研究所 彭春萍 来源:电子设计应用2009年第3期

引言

随着CMOS图像传感器制造工艺的不断提高,数字相机的分辨率和帧频也不断提高,这使得相机和图像采集卡之间的通信速

率变得非常重要。Camera Link是一种基于视频应用的接口,解决了视频数据输出和采集之间的速度匹配问题。

某项目的前端数字相机分辨率高达1400×1024,帧频为100Hz,要求将数字相机的图像采集下来并存储,经过DSP处理完

后,再转换成模拟的PAL制式视频供监视器显示。本文主要介绍了该项目的硬件结构部分,讨论了基于Camera Link接口的图像采集的逻辑时序部分。

图1 系统硬件结构框图

图像采集和处理系统硬件平台

整个系统的结构如图1所示,系统包括以FPGA为核心的数字图像采集单元,以DSP为核心的图像处理单元以及图像显示单

元。其中图像采集单元由信号输入端口SDR26接插件开始,Camera Link的差分信号经过三个芯片转换后变成LVTTL信号, LVTTL

信号直接连至FPGA,由FPGA负责控制采集时序,DAC由FPGA控制进行显示。

图2 状态转移示意图

由于采集、处理、显示均要访问存储器,为了降低成本,选用普通的异步SRAM。各个SRAM的读写逻辑由FPGA控制,采

用三帧存储器乒乓方式进行切换,每一帧时读取状态变量,决定各个存储器的操作方式。这里共将存储器分为三组:SRAM组A、SRAM组B、 SRAM组C。图2为状态转移图,共有四种状态:系统复位时为Idel状态,复位信号变为1后,在帧同步信号下降沿的触发下,依次在Frame k、Frame k+1和Frame k+2三个状态中切换。

Frame k状态时,FPGA将采集的图像写至SRAM组A,DSP从SRAM组B中读数进行处理,FPGA从SRAM组C中读数

送至DAC进行显示。

Frame k+1状态时,FPGA将采集的图像写至SRAM组B,DSP从SRAM组C中读数进行处理,FPGA从SRAM组A中

读数送至DAC进行显示。

Frame k+2状态时,FPGA将采集的图像写至SRAM组C,DSP从SRAM组A中读数进行处理,FPGA从SRAM组B中

读数送至DAC进行显示。

当FPGA采集完一帧图像后,向DSP发出中断申请信号,DSP响应中断,读取图像数据进行处理,将处理完的结果写在特定

的存储器空间内。然后由FPGA读取采集的图像数据和DSP处理完的结果,将二者叠加后,按照PAL制式时序向DAC芯片送视频数据,这样监视器就可以输出标准的PAL制式图像。

Camera Link接口的特点

Camera Link的信号包括视频、相机控制、串行通信三个部分。视频部分是Camera Link的核心,主要包括5对差分信号,

即X0-~X0+、X1-~X1+、X2-~X2+、X3-~X3+、Xclk-~Xclk+;相机控制包括4对差分信号,即CC1-~CC1+、CC2-~CC2+、CC3-~CC3+、CC4-~CC4+;串行通信部分包括2对差分信号,即SerTC-~SerTC+和SerTFG-~ SerTFG+。

视频部分发送端将28位的数据信号和1个时钟信号,按7:1的比例将数据转换成5对差分信号,接收端则将5对差分信号转换成28位的数据信号和1个时钟信号。对于视频部分的5对差分输出信号,选用Channel Link转TTL/CMOS的芯片DS90CR288作为接收芯片,接收4对差分数据信号和1对差分时钟信号,输出28位数据和1路时钟信号,且该芯片能通过的最高时钟频率可达85MHz。

相机控制部分包括4对差分信号,相机生产厂商可以根据不同的相机对这四个信号进行不同的定义。这里选用差分驱动芯片

DS90LV07A,该芯片刚好可以驱动4对差分信号。

串行通信部分包括2对差分信号,串行通信规定为异步通信模式,通过串行通信可以对相机的各种参数进行设置。选用具有1

对差分发送和1对差分接收的芯片DS90LV019就可将差分对信号转换成LVTTL信号,之后再经RS-232电平转换芯片MAX232转换成RS-232电平,这样可直接和微机通信。

由于单个Camera Link芯片只有28位数据可用,有些相机为了提高传输数据的效率,需要几个Camera Link芯片。按使

用要求不同,分为三种配置:基本配置为一个Camera Link芯片,一根电缆;中档配置为两个Camera Link芯片,一根电缆;全部配置为两个Camera Link芯片,两根电缆。

由于选用的相机属于基本配置,因此这里主要介绍这种配置下的28位数据的详细说明。28位数据信号中包括三个数据端口:

A口(8位)、B口(8位)、C口(8位),和四个视频控制信号FVAL(帧有效)、DVAL(数据有效)、LVAL(行有效)、SPARE(空,暂时未用)。经过Camera Link芯片转换后的时钟信号是整个相机的同步驱动信号,所有的数据和视频控制信号都和该时钟信号同步。

图3 相机的时序图

Camera Link时序控制逻辑设计

这里选用的相机采用的是下降沿触发的方式。在FPGA编写逻辑时序时要格外注意。结合相机的说明书和示波器测量结果,得

到时序图如图3所示。

相机可以配置成8位或10位的输出位宽,40MHz像素时钟或80MHz像素时钟,2×40MHz或2×80MHz的数据输出速率。

当相机配置在100Hz帧频、像素时钟为80MHz时,因相机在一个像素周期内输出2个数据,所以数据速率高达160MHz。由该时序图可知,数据在时钟信号的下降沿有效,帧同步信号和行同步信号均和时钟下降沿严格对齐。

Camera Link采集8位数据的逻辑代码关键之处在于产生存储器的地址信号、存储器写信号以及在对应的地址处将数据稳定

地写进存储器。我们用像素时钟产生列地址计数器,行同步信号产生行地址计数器,二者拼接产生存储器的地址信号。这样产生的有效地址虽然不连续,但意义明确,而且有利于显示部分的隔行隔列显示。对于行同步清零信号,由于行同步上升沿与帧同步上升沿严格同步,所以专门产生了一个行同步地址清零信号CamL_Add_Clr。对于8位的数据,可将4个有效数据拼接成32位后再存储,这样做的好处在于降低FPGA读写存储器的速度。下面是用Verilog写的关于Camera Link数据采集部分的源代码:

always@(posedge camlink _CLK) begin

reg1_camlink_DVAL <= camlink_DVAL; end

reg[9:0] CamL_PCNT1 ; reg[10:0] CamL_HCNT1 ; always@(posedge camlink_CLK) begin

if(camlink_DVAL==0) CamL_PCNT1 <= 10'h0; else

CamL_PCNT1 <= CamL_PCNT1+1; end

reg [24: 0] CamL_AClr_Cnt; wire CamL_Add_Clr;

always@(posedge camlink_CLK) begin

if(camlink_FS== 0)

CamL_AClr_Cnt <= 24'h000000; else if(CamL_AClr_Cnt>24'h110000) CamL_AClr_Cnt <= 24'h120000;

else

CamL_AClr_Cnt <= CamL_AClr_Cnt+1; end

assign CamL_Add_Clr = (CamL_AClr_Cnt>=24'h000100)&&(CamL_AClr_Cnt<24'h001000); always@(posedge reg1_camlink_DVAL) begin if(CamL_Add_Clr == 1) CamL_HCNT1 <= 0; else

CamL_HCNT1 <= CamL_HCNT1+1; end

always@(posedge camlink_CLK) begin

sample_addr <={1'b0,CamL_HCNT1[9:0],CamL_PCNT1[9:1]}; end

always@(posedge camlink_CLK) begin

if(camlink_DVAL==1)

case(CamL_PCNT1[0])//case(CamL_PCNT[0]) 1'b0 :

low_16bit <= {camlink_B,camlink_A};

1'b1 : high_16bit<= {camlink_B,camlink_A}; endcase end

always@(posedge CamL_PCNT1[0]) begin

sample_data32 <= {low_16bit,high_16bit}; end

assign sram_we=(reg1_camlink_DVAL==1)?(~(CamL_PCNT1[0])):1;

图4是ModelSim仿真时序图。由图可以看出,在写信号的上升沿,地址和数据都处于稳定期,从而确保了图像采集的正确

性。实验证明采集的结果正确。

图4 ModelSim仿真时序图

结语

本文结合实际的工程项目,介绍了Camera Link接口的规范和时序,详细讨论了FPGA控制采集的逻辑时序。这种信号采集

方法还可以用于其它基于Camera Link接口的高速图像数据采集的场合中。

联系合同范文客服:xxxxx#qq.com(#替换为@)