基于FPGA的系统通过合成两条视频流来提供3D视频

简介

视频系统,目前已经深入消费应用的各个方面,在汽车、机器人和工业领域日益普遍。其在非消费应用中的增长主要源于HDMI标准以及更快、更高效的DSP和FPGA的出现。

本文将概要讨论利用模拟或HDMI摄像机实现立体视觉(3D视频)的各种要求。文章将描述一个基于FPGA的系统,它将两个视频流结合成一个3D视频流,通过HDMI 1.4发射器进行传输,同时还要介绍一个基于DSP的系统,与通常需从两台摄像机接收数据相比,该系统可以节省DMA带宽。另外,本文还将描述一种方法,该方法可以实现一种并排格式,可供3D摄像机或要求3D视频的系统使用。

概述

立体视觉要求使用两台摄像机,二者相距大约5.5厘米,这是人类双眼之间的典型间距,如图1所示。

Figure 1
图1 支架上的两台摄像机(已针对立体视觉对齐)

图2所示高级功能框图使用了采用相同视频标准的两台同步摄像机、两个视频解码器和一个FPGA。为了确保完全一致的帧速率,摄像机必须行锁定到共同的参考时序。如果没有同步,不使用外部存储器,就不可能将输出组合起来并存储为完整的视频帧。

Figure 2
图2 高级功能框图

图3显示两个行锁定视频流被合并成一个立体图像。图4显示,如果不将整个视频帧保存在外部存储器中,则异步视频流无法合并。

Figure 3
图3 合并两个同步视频流
Figure 4
图4 如果不使用外部存储器,则无法合并异步视频流

然后,两台同步摄像机的输出由视频解码器(如ADV7181D, ADV7182ADV7186 用于模拟摄像机)进行数字化处;也可由 HDMI receivers(如ADV7610ADV7611用于数字摄像机)进行数字化处理。

视频解码器和HDMI接收器都采用内部锁相环(PLL)在其输出总线上产生时钟和像素数据。这意味着,在数字化模拟视频,或者接收HDMI流时,将为两台摄像机产生两个独立的时钟域。另外,两个视频流可能存在对齐误差。这些时序差异和对齐误差必须在后端器件(如FPGA)中进行补偿,先将数据带至共同的时钟域,然后再将两个视频图像结合成单个立体视频帧。然后,通过一个支持3D的HDMI 1.4HDMI 接收器(如ADV7511ADV7513—也可以将其提供给DSP(如 ADSP-BF609 Blackfin®处理器)—以便进一步处理。

时钟架构

视频解码器有两种完全不同的时钟源,具体取决于其是否锁定。当视频PLL被锁定至输入同步信号时——水平同步(视频解码器)或TMDS时钟(HDMI)——结果会产生一个锁定至输入视频源的时钟。当视频失锁时,或者当PLL处于强制自由运行模式时,视频PLL不会锁定至输入同步信号,结果会产生一个锁定至晶振时钟的时钟输出。另外,时钟可能不会在复位后输出,因为LLC时钟驱动器在复位后设置为高阻抗模式。

因此,如果系统有两个或多个始于视频解码器或HDMI接收器的视频路径,即使将同一晶振时钟提供给两个视频解码器或HDMI接收器,仍会有两个不同频率、不同相位的不同时钟域,因为每个器件都会基于自己的PLL产生自己的时钟。

带锁定视频解码器的同步系统

典型的立体视频使用两个视频源,其中,每个视频解码器都会锁定至输入视频信号,并会基于输入水平同步或TMDS时钟产生自己的时钟。当两台摄像机同步——或行锁定至同一参考时序时——分帧线将始终对齐。由于两个独立的视频解码器会收到相同的水平同步信号,因此,像素时钟将拥有相同的像素时钟频率。这样,就可以将两条数据路径带入同一个时钟域,如图5所示。

Figure 5
图5 同步至同一参考源的两台摄像机。

两个视频解码 器都会收到同一同步信号,因此,它们也会锁定

异步视频系统

不幸的是,其中一个视频解码器可能因视频源信号质量欠佳而失锁,如图6所示;或者,摄像机因视频链路断开而失去同步性,如图7所示。这会在两条数据路径中导致不同的频率,结果又会导致进入后端中的数据量不对称。

Figure 6
图6 带未锁定视频解码器的行锁定摄像机
Figure 7
图7 带锁定视频解码器的未锁定摄像机

视频失锁可以通过使用一个中断(SD视频解码器为SD_UNLOCK,分量视频解码器为CP_UNLOCK,或HDMI接收器中的TMDSPLL_LCK寄存器)来检测,该中断会在一定延迟后介入。视频解码器集成了不稳定水平同步平滑机制,因此,视频失锁的检测可能需要两三行。该延迟可通过控制FPGA中的失锁来减少。

时钟三态模式

在设计FPGA时钟资源时,必须知道,默认情况下,许多视频解码器和HDMI产品在复位后将时钟和数据线路置为三态模式。因此,LLC像素时钟不适用于同步复位。

两条视频流中的数据对齐误差

为了简化系统并减少合并两幅图像所需存储器,到达FPGA的数据应进行同步,以使来自第一台摄像机的第M 行第N个 像素与来自第二台摄像机的第M 行第N个 像素同时收到。

在FPGA输入端,这可能很难实现,因为两条视频路径可能具有不同的延迟:行锁定摄像机可能输出存在对齐误差的行,不同的连接长度可能加大对齐误差,而视频解码器则可能带来可变启动延迟。受这些延迟影响,采用行锁定摄像机的系统会有一些存在对齐误差的像素。

行锁定摄像机对齐误差

即使是行锁定摄像机也可能输出存在对齐误差的视频行。图8显示来自两台摄像机的CVBS输出端的垂直同步信号。一台摄像机(同步主机)为第二台摄像机(同步从机)提供行锁定信号。380 ns的对齐误差是清楚可见的。图9展示的是这些摄像机输出端的视频解码器传输的数据。可以看到11个像素的位移。

Figure 8
图8 行锁定视频摄像机之间的380 ns视频对齐误差
Figure 9
图9 数字域中未补偿的11个像素的视频对齐误差

不同的连接长度

所有电气连接都会带来传播延迟,因此,要确保两条视频路径具有相同的轨道和电缆长度。

视频解码器/HDMI接收器延迟

所有视频解码器都会带来可能因启用的功能而异的延迟。另外,有些视频器件含有可能增加随机启动延迟的因素——如深色FIFO。采用视频解码器的典型立体系统的随机启动延迟大约为5个像素时钟。含有HDMI发射器和接收器的系统(如图10所示)的随机启动延迟可能为40个像素时钟左右。

Figure 10
图10 流水线延迟测量设置

对齐误差补偿

图11所示系统中,一个视频解码器对来自各摄像机的模拟信号进行数字化处理。各视频路径的数据和时钟是独立的。两条视频路径都连接至FIFO,后者对输入数据进行缓冲,以补偿数据对齐误差。在输出数据时,FIFO使用来自其中一个解码器的共用时钟。在锁定系统中,两条数据路径应具有完全相同的时钟频率,以确保在摄像机行锁定且视频解码器锁定的情况下,不会出现FIFO溢出或下溢现象。

通过启用或禁用FIFO输出,控制模块可以维持FIFO电平以尽量减少像素对齐误差。如果采取了正确的补偿措施,则FPGA模块的输出应为与第一个像素对齐的两条数据路径。然后该数据提供给FPGA后端,以生成3D格式。

Figure 11
图11 使用数字FIFO来重新对齐视频图像

对齐误差测量

两个数字化数据流之间的对齐误差可以在视频FIFO输出端进行测量,其方法是使用一个单一时钟计数器,该计数器在输入信号之一的垂直同步(VS)脉冲上复位。图12所示两个视频流(vs_a_in和vs_b_in)的对齐误差为4个像素。计数器使用列表1中所示方法测量对齐误差。计数从VS1的上升沿开始,并在VS2的上升沿终止。

如果一个帧的总像素长度是已知的,则可以通过从帧长中减去计数值,从而算出负偏斜(VS2位于VS1之前)。该负值应在偏斜超过像素帧长的一半时计算。结果应用来重新对齐FIFO中存储的数据。

Figure 12
图12 对齐误差测量

列表1 简单对齐误差测量(Verilog®).

module misalign_measurement(
 input wire reset,
 input wire clk_in,
 input wire vs_a_in,
 input wire vs_b_in,
 output reg [15:0] misalign,
 output reg ready);

reg [15:0] cnt;
reg cnt_en, cnt_reset;
reg vs_a_in_r, vs_b_in_r;
assign vs_a_rising = vs_a_in > vs_a_in_r;
assign vs_b_rising = vs_b_in > vs_b_in_r;

always @(posedge clk_in)
begin
 vs_a_in_r <= vs_a_in;
 vs_b_in_r <= vs_b_in;
end

always @(posedge clk_in)
 if (reset)
 begin
 { ready, cnt_en } <= 2'b00;
 misalign <= 0;
 end else begin
 if ((vs_a_in == 1'b0) && (vs_b_in == 1'b0))
 { ready, cnt_reset } <= 2'b01;
 else
 cnt_reset <= 1'b0;

 /* beginning */
 if (vs_a_rising && vs_b_rising)
 begin
 misalign <= 0;
 { ready, cnt_en } <= 2'b10;
 end
 else if ((vs_a_rising > vs_b_in) || (vs_b_rising > vs_a_in))
 { ready, cnt_en } <= 2'b01;

  /* ending */
 if ((cnt_en == 1'b1) && (vs_a_rising || vs_b_rising))
 begin
 { ready, cnt_en } <= 2'b10; 
 misalign <= vs_a_rising ? (-(cnt + 1)) : (cnt + 1);
 end
 end

always @(posedge clk_in) /* counter */
 if ((cnt_reset) || (reset))
 cnt <= 0;
 else if (cnt_en)
 cnt <= cnt + 1;

endmodule

从两个对齐视频流生成3D视频

一旦像素、行和帧数据都真正同步,FPGA可以将视频数据转换成3D视频流,如图13所示。

Figure 13
图13 用于实现3D格式的简化架构

输入数据由共用时钟读入存储器。同步时序分析仪检查输入的同步信号,并抽取视频时序,包括水平前后沿长度、垂直前后沿、水平和垂直同步长度、水平有效行长、垂直有效行数和同步信号极化。将该信息与当前水平和垂直像素位置一起传给同步时序再发生器,这样可以生成经修改的时序,以便支持所需3D视频结构。新生成的时序应延迟,以确保FIFO含有所需数据量。

并排3D视频

对存储器要求最低的架构是并排格式,只需要一个两行缓冲器(FIFO)即可存储来自两个视频源的行内容。并排格式的宽度应为原始输入模式的两倍。为此,应使用一个双倍时钟来为拥有双倍水平行长度的再生同步时序提供时钟。用于为后端提供时钟的双倍时钟将以双倍速率清空第一个FIFO和第二个FIFO,这样即可并排显示图像,如图14所示。并排图像如图15所示。

Figure 14
图14 使用简单的FPGA行缓冲器来并排合并两幅图像
Figure 15
图15 视频时序下的并排576p图像

结论

ADI公司的解码器和HDMI产品以及简单的后处理技术可以打造出真正的立体3D视频,并为其传输提供条件。如本文所示,用简单的数字模块,无需使用昂贵的存储器,即可实现3D视频。这种系统可用于需要3D视觉的任何类型的系统中,从简单的摄像机,到基于ADSP-BF609 DSP的可以跟踪物体及其距离的专业系统。

作者

Witold Kaczurba

Witold Kaczurba

Witold Kaczurba 是ADI公司高级电视部(爱尔兰利默里克)资深应用工程师,负责支持解码器和HDMI产品。2007年从波兰弗罗茨瓦夫理工大学毕业并获得电气工程硕士学位后,他加入ADI公司。学生期间,他曾为小型电子和IT公司工作,后来作为工读生加入ADI公司(爱尔兰),随后成为应用工程师。