4. 视频采集接口工程实现

在Quartus视频图像处理系统中,CMOS传感器接口是整条图像链路的起点。OV5640与OV7725虽然分辨率、内部ISP能力不同,但对外接口高度相似:都通过SCCB(OmniVision串行摄像机控制总线)完成寄存器配置,通过DVP(Digital Video Port)并行接口输出像素数据,并配合PCLK、HREF/HSYNC、VSYNC三根同步信号完成时序对齐。本节以OV5640输出RGB565、OV7725输出RGB565或RAW8为例,说明从寄存器写入到像素捕获的完整工程实现路径。

一、SCCB配置:把传感器从默认状态带到目标工作模式

SCCB在电气层与I²C兼容,使用SCL与SDA两根线,但协议细节略有差异:OV系列器件地址通常为7位0x3C(写)与0x3D(读),写寄存器时先发器件地址+写位,再发寄存器地址,再发8位数据,最后以停止条件结束。OV7725的寄存器地址为8位,OV5640的寄存器地址为16位,因此OV5640需要发送高字节和低字节两个地址字节,这是两者配置代码不能直接复用的主要原因。

配置顺序建议遵循“先软复位、再时钟与PLL、再输出格式、最后使能”的原则。以OV5640输出RGB565、QVGA(320×240)为例,典型寄存器序列如下(示例参数,需按实际模块晶振与PLL计算):

// OV5640 SCCB 写序列(示例)
0x3103, 0x11   // 系统时钟从PLL直接输入
0x3008, 0x82   // 软复位
0x3037, 0x13   // PLL控制
0x3035, 0x21   // PLL倍频
0x3036, 0x69   // PLL倍频
0x3C07, 0x08   // 预充电
0x4300, 0x61   // 输出格式:RGB565
0x501F, 0x01   // ISP输出RGB565
0x3808, 0x01   // 水平输出高字节
0x3809, 0x40   // 水平输出低字节 = 320
0x380A, 0x00   // 垂直输出高字节
0x380B, 0xF0   // 垂直输出低字节 = 240
0x3008, 0x02   // 退出复位,进入工作

配置完成后应回读关键寄存器(如0x3008、0x4300、0x3808~0x380B)确认写入成功。若回读值恒为0xFF或0x00,优先检查上拉电阻、SCCB时钟频率(建议100~400 kHz)以及传感器供电与复位时序。

二、DVP并行接口时序捕获

DVP接口的同步关系是采集逻辑的核心。以OV5640为例,PCLK为像素时钟,HREF为行有效标志,VSYNC为帧同步。在RGB565模式下,一个像素占16位,分两个PCLK周期输出:第一个周期输出高字节(R[4:0]与G[5:3]),第二个周期输出低字节(G[2:0]与B[4:0])。因此采集模块必须在HREF有效期间按PCLK节拍对D[7:0]进行采样,并以“字节计数”方式拼装成16位像素。

工程上常用做法是:用PCLK的上升沿采样D[7:0],用HREF的下降沿作为行结束标志,用VSYNC的下降沿或上升沿作为帧起始标志。为避免亚稳态,建议在FPGA内部先用PCLK对HREF、VSYNC做两级同步,再生成行有效与帧有效信号。若传感器输出的是RAW8,则每个PCLK对应一个8位像素,直接按字节写入即可,但需注意Bayer排列顺序(如BGGR、GRBG),否则后续去马赛克会偏色。

OV5640 DVP RGB565 采集时序与数据拼装 VSYNC 帧起始 HREF 行有效 行有效 PCLK D[7:0] 高字节 低字节 高字节 低字节 …… 像素 = {高字节[7:0], 低字节[7:0]} RGB565: R[4:0] G[5:3] | G[2:0] B[4:0] ↑采样 ↑采样 ↑采样 ↑采样 帧 = VSYNC有效 → 若干行(HREF有效) → 每行320像素 → 每像素2字节 行内字节计数:0~639,偶数索引为高字节,奇数索引为低字节

三、RGB565与RAW数据格式解析

RGB565的16位分布为:R占高5位、G占中间6位、B占低5位。若采集模块直接输出16位像素,后续显示或存储时需注意字节序。Quartus中常用做法是定义一个16位寄存器,在字节计数为偶数时写入高字节,奇数时写入低字节,并在行结束时将像素写入行缓冲或FIFO。

RAW8模式下,每个像素仅8位,但每个像素只包含一个颜色分量,需按Bayer模板还原。以BGGR排列为例,第0行第0列为B,第0行第1列为G,第1行第0列为G,第1行第1列为R。若直接按RGB565显示RAW数据,会出现明显网格状偏色,因此RAW模式通常需要后续ISP或FPGA内插模块处理。

四、采集模块仿真验证

仿真验证的关键是构造符合DVP时序的激励。建议在Testbench中生成PCLK(如24 MHz)、VSYNC、HREF和D[7:0],并模拟一行320像素、每像素2字节的波形。验证点包括:行有效期间是否恰好采集640个字节;像素拼装是否正确;帧计数是否与VSYNC一致;FIFO是否溢出。

一个实用的检查清单如下:

  • VSYNC下降沿后,首个HREF上升沿是否被正确识别为第0行起始;
  • 每行HREF有效期间,字节计数器是否从0计到639;
  • 偶数字节写入像素高8位,奇数字节写入低8位,拼装后RGB565值是否与激励一致;
  • 行结束时是否产生行结束脉冲,并正确写入行缓冲;
  • 帧结束时帧计数器加1,且无FIFO写溢出。
若仿真中像素值恒为0xFFFF或0x0000,优先检查D[7:0]是否在HREF有效期间被正确驱动,以及字节计数是否因HREF毛刺而错位。建议在HREF同步后加一级消抖或至少两级寄存器同步。

完成上述采集模块后,即可将RGB565像素流送入后续的帧缓冲、缩放或显示模块。SCCB配置、DVP时序捕获与数据格式解析三者共同构成视频采集接口的完整闭环,也是后续图像处理算法能够稳定运行的前提。