3. 帧同步基础:帧同步信号(VSYNC/HSYNC)、行同步与场同步、Sensor与ISP的同步握手

帧同步,说白了就是让Sensor和ISP按照同一个节拍干活。你想想看,Sensor每秒输出30帧图像,ISP每秒也要处理30帧,如果两者节奏对不上,画面就会出现撕裂、花屏、丢帧。我刚开始做ISP驱动时,就吃过这个亏——Sensor明明在输出第N帧,ISP却还在处理第N-1帧的数据,结果画面一半是新的、一半是旧的,调试起来非常痛苦。

3.1 VSYNC与HSYNC:帧同步的两大核心信号

帧同步的基础,就是两个信号:VSYNC(垂直同步)和HSYNC(水平同步)。

  • VSYNC(垂直同步):也叫场同步,标志着一帧图像的开始和结束。高电平有效时,表示新的一帧即将开始传输。
  • HSYNC(水平同步):也叫行同步,标志着一行像素的开始和结束。每输出一行像素,HSYNC就跳变一次。

我习惯把VSYNC比作“书的封面”,HSYNC比作“每一行的页码”。没有封面,你不知道书从哪里开始;没有页码,你找不到每一行的位置。

关键时序参数:

  • VSYNC脉宽:通常为几行到几十行的时间
  • HSYNC脉宽:通常为几个到几十个像素时钟周期
  • 消隐区(Blanking):VSYNC和HSYNC之间的无效数据区域

3.2 行同步与场同步:从模拟到数字的演变

行同步和场同步的概念,最早来自模拟电视时代。那时候用电子枪扫描荧光屏,一行扫完需要回扫,一帧扫完也需要回扫。回扫期间不显示图像,这就是消隐区。

到了数字图像传感器时代,这个机制被继承了下来。Sensor内部有一个像素阵列,逐行读出数据。每读出一行,HSYNC拉高一次;所有行都读出后,VSYNC拉高一次,表示这一帧结束。

概念 模拟时代含义 数字时代含义
行同步(HSYNC) 电子枪从右到左回扫 一行像素读出完成,准备下一行
场同步(VSYNC) 电子枪从下到上回扫 一帧图像读出完成,准备下一帧
消隐区 回扫期间不显示图像 无效数据区域,用于同步和配置

嗯,这里要注意:数字Sensor的消隐区并不是完全“空白”的。有些Sensor会在消隐区插入一些控制信息,比如帧号、增益值、温度数据。我在一个项目中就遇到过,ISP把消隐区的控制数据当成了有效像素,结果画面出现奇怪的条纹。后来加了过滤逻辑才解决。

3.3 Sensor与ISP的同步握手:谁等谁?

Sensor和ISP之间,有三种常见的同步方式:

  1. 主从模式(Master-Slave):Sensor做主设备,ISP做从设备。Sensor输出VSYNC/HSYNC,ISP被动接收。这是最常见的模式。
  2. 外部触发模式(External Trigger):ISP或外部控制器发送触发信号,Sensor收到后才开始输出一帧。多用于多摄像头同步。
  3. 自由运行模式(Free-Running):Sensor按自己的节奏输出,ISP通过FIFO或帧缓冲来匹配速度。适用于低帧率或非实时场景。

我的经验:主从模式最稳定,但要注意ISP的处理速度不能比Sensor慢。否则ISP会丢帧。我曾经用FPGA做了一个帧率匹配模块,当ISP处理不过来时,自动丢弃部分帧,保证实时性。

3.4 同步握手的关键时序

同步握手,说白了就是Sensor告诉ISP:“我要开始发数据了,你准备好了吗?”ISP回答:“准备好了,来吧。”这个过程在硬件上就是VSYNC和HSYNC的边沿检测。

我建议在FPGA中这样处理:

// VSYNC边沿检测
reg vsync_d1, vsync_d2;
wire vsync_rising, vsync_falling;

always @(posedge clk) begin
    vsync_d1 <= sensor_vsync;
    vsync_d2 <= vsync_d1;
end

assign vsync_rising  = vsync_d1 & ~vsync_d2;
assign vsync_falling = ~vsync_d1 & vsync_d2;

// 帧开始标志
wire frame_start = vsync_rising;
wire frame_end   = vsync_falling;

为什么要打两拍?因为跨时钟域同步需要消除亚稳态。Sensor的输出时钟和ISP的时钟可能不同频,直接采样会出问题。我见过一个工程师没做同步处理,结果VSYNC偶尔会误触发,导致ISP认为新帧开始了,实际上数据还是上一帧的。画面撕裂就是这么来的。

3.5 多Sensor同步:一个更复杂的场景

在多摄像头系统中,比如双目视觉、全景拼接,所有Sensor必须严格同步。否则左右眼画面时间不对齐,算法就没法用。

常用的做法是:

  • 所有Sensor共用同一个外部触发信号
  • 所有Sensor配置相同的曝光时间和帧率
  • ISP同时接收多个VSYNC,判断是否对齐

避坑指南:我曾经在一个双目项目中,两个Sensor的VSYNC总是差几微秒。查了半天,发现是PCB走线长度不同,导致触发信号到达时间不一致。后来在FPGA里做了可编程延迟补偿,才把误差控制在1个像素时钟以内。

3.6 帧同步的SVG流程图

下面这张图展示了Sensor与ISP之间的帧同步握手流程:

帧同步握手流程图 Sensor与ISP帧同步握手流程 图像Sensor ISP处理器 ① 输出VSYNC高电平 ② 检测VSYNC上升沿 ③ 准备接收像素数据 ④ 逐行输出HSYNC+数据 ⑤ 输出VSYNC低电平 ⑥ 检测帧结束,处理完成 关键点:VSYNC上升沿表示帧开始,下降沿表示帧结束;HSYNC每行跳变一次,携带像素数据

3.7 常见问题与调试技巧

帧同步调试,我总结了几个常见问题:

现象 可能原因 解决方法
画面撕裂 ISP读取速度慢于Sensor输出 增加FIFO深度,或降低帧率
画面偏移 VSYNC边沿检测错误 增加同步打拍,消除亚稳态
多摄像头不同步 触发信号延迟不一致 PCB等长布线,或FPGA延迟补偿
消隐区数据干扰 误将消隐区数据当作有效像素 根据HSYNC计数过滤无效数据

调试小技巧:用示波器同时抓VSYNC和HSYNC,观察两者的时序关系。正常情况是VSYNC高电平期间,HSYNC连续跳变。如果VSYNC和HSYNC的边沿对不上,说明同步有问题。

帧同步是ISP硬件设计的基础,也是最容易出问题的地方。我个人习惯在设计初期就把同步逻辑单独拿出来仿真验证,而不是等到板级调试再排查。因为一旦同步出问题,画面表现千奇百怪,很难定位根因。