3. 嵌入式视觉系统架构设计
嵌入式视觉系统的架构设计,本质上是在“传感器—FPGA—输出接口”这条主链路上做三件事:把数据通路定清楚,把带宽算明白,把模块边界划合理。三者顺序不能颠倒——通路决定数据往哪走,带宽决定这条路能不能走通,模块划分决定这条路好不好维护和扩展。本节围绕一条典型链路展开:CMOS 图像传感器输出 RAW/Bayer 数据,经 FPGA 完成采集、去马赛克、色彩校正、缩放与格式转换,再通过显示接口或高速串口输出。
一、数据通路的层次划分
从传感器到输出接口,数据通路可以按“物理层—像素层—帧层—应用层”四层理解。物理层关注 LVDS、MIPI D-PHY、DVP 等电气与时序接口;像素层关注像素时钟、行有效、帧有效等同步信号;帧层关注分辨率、帧率、位宽与格式;应用层关注缩放、色彩空间转换、叠加与输出时序。Lattice FPGA 的常见做法是用硬核或软核接收传感器差分信号,在像素层做同步与位对齐,再进入帧层缓存。
以 1920×1080@60fps、RAW10 为例,传感器侧有效像素带宽为 1920×1080×60×10 ≈ 1.244 Gbps。若采用 4 通道 MIPI,每通道约 311 Mbps,属于中低速档位,Lattice ECP5/CrossLink-NX 均可覆盖。若换成 3840×2160@30fps、RAW12,则约 2.986 Gbps,需重新评估通道数与参考时钟。
二、带宽估算的三种口径
带宽估算不能只算一个数,至少要分三种口径:传感器输出带宽、FPGA 内部处理带宽、输出接口带宽。三者往往不相等,因为中间存在格式转换和位宽变化。传感器输出 RAW10,FPGA 内部可能扩展为 16bit 处理,输出又压缩为 RGB888 或 YUV422。若忽略中间位宽膨胀,很容易在帧缓存处出现“算得下、跑不动”的情况。
以 1080p@60 为例,传感器侧约 1.244 Gbps;内部若按 16bit 处理,像素吞吐为 1920×1080×60×16 ≈ 1.990 Gbps;输出 RGB888 为 2.986 Gbps。可见输出接口反而是最紧的一环。若选用 Lattice CrossLink-NX 的硬核 MIPI 输出,需确认 lane 速率与像素时钟的对应关系;若走并行 RGB 接口,则要核对 PCLK 上限与建立保持时间。
三、模块划分方法
模块划分建议遵循“时钟域优先、数据格式其次、缓存位置最后”的原则。第一刀切在时钟域:传感器接收域、像素处理域、输出域通常不同频,跨域必须用异步 FIFO 或双口 RAM 隔离。第二刀切在数据格式:RAW、RGB、YUV 三种格式的处理逻辑差异大,混在一个模块里会导致条件分支过多、时序难收敛。第三刀切在缓存位置:行缓存用于去马赛克和滤波,帧缓存用于缩放和帧率转换,两者不应共用同一块 BRAM 控制器。
一个可落地的划分示例是:sensor_rx 负责 D-PHY 接收与字节对齐,输出像素流与同步信号;pixel_sync 负责行缓存与窗口生成,向 ISP 提供 3×3 或 5×5 像素窗口;isp_pipe 内部再分为去马赛克、色彩校正、Gamma、缩放四个子级,每级之间用 valid-ready 握手;out_tx 负责输出时序生成与编码。这样划分后,每个模块的输入输出接口清晰,便于单独仿真和替换。
四、参数配置与验证要点
在 Lattice 工具链中,传感器接收通常通过硬核 MIPI D-PHY 或软核 LVDS 实现,需配置 lane 数、数据速率、参考时钟和终止电阻。像素处理部分建议用流水线结构,每级插入寄存器以提升 Fmax。验证时先看同步信号:VSYNC 周期是否等于帧周期,HSYNC 数量是否等于行数,DE 有效区间是否覆盖有效像素。再看数据:用测试图案(如彩条)检查去马赛克后的颜色是否正确,用渐变图检查 Gamma 曲线是否单调。
综上,嵌入式视觉系统架构设计的关键在于:先画通路,再算带宽,最后切模块。通路决定数据流向,带宽决定资源分配,模块划分决定工程可维护性。三者相互约束,任何一处估算偏差都会在集成阶段暴露为时序违例或图像异常。建议在 RTL 编码前先用表格列出各节点的位宽、时钟频率与吞吐量,作为后续实现的基准。