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之间,有三种常见的同步方式:
- 主从模式(Master-Slave):Sensor做主设备,ISP做从设备。Sensor输出VSYNC/HSYNC,ISP被动接收。这是最常见的模式。
- 外部触发模式(External Trigger):ISP或外部控制器发送触发信号,Sensor收到后才开始输出一帧。多用于多摄像头同步。
- 自由运行模式(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之间的帧同步握手流程:
3.7 常见问题与调试技巧
帧同步调试,我总结了几个常见问题:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 画面撕裂 | ISP读取速度慢于Sensor输出 | 增加FIFO深度,或降低帧率 |
| 画面偏移 | VSYNC边沿检测错误 | 增加同步打拍,消除亚稳态 |
| 多摄像头不同步 | 触发信号延迟不一致 | PCB等长布线,或FPGA延迟补偿 |
| 消隐区数据干扰 | 误将消隐区数据当作有效像素 | 根据HSYNC计数过滤无效数据 |
调试小技巧:用示波器同时抓VSYNC和HSYNC,观察两者的时序关系。正常情况是VSYNC高电平期间,HSYNC连续跳变。如果VSYNC和HSYNC的边沿对不上,说明同步有问题。
帧同步是ISP硬件设计的基础,也是最容易出问题的地方。我个人习惯在设计初期就把同步逻辑单独拿出来仿真验证,而不是等到板级调试再排查。因为一旦同步出问题,画面表现千奇百怪,很难定位根因。