1. ISP Pipeline 概览与 FPGA 选型
各位同学好,我是你们的讲师。今天咱们正式开篇,聊聊 ISP Pipeline 的整体框架,以及怎么根据算法挑 FPGA。说实话,我见过不少工程师一上来就盯着算法细节猛啃,结果做到一半发现芯片资源不够,或者带宽撑不住,那叫一个难受。所以这一章,咱们先把全局地图铺开,再讲讲选型那点事儿。
1.1 什么是 ISP Pipeline?
ISP,全称 Image Signal Processor,说白了就是把 CMOS 传感器吐出来的原始数据,变成人眼看着舒服、机器能分析的图像。你想想看,传感器出来的东西是啥?是一堆 Bayer 格式的 RAW 数据,每个像素只有一种颜色分量,红的、绿的、蓝的混在一起,根本没法看。
ISP Pipeline 就是一条流水线,把 RAW 数据一步步“洗”成 RGB 或 YUV 图像。我习惯把它分成三个阶段:
- 前端处理:黑电平校正、坏点校正、去噪、Bayer 插值(Demosaic)
- 中端处理:白平衡(AWB)、色彩校正矩阵(CCM)、Gamma 校正
- 后端处理:锐化(Sharpen)、降噪、色彩增强、格式转换
每个阶段都有各自的算法复杂度,有的偏计算密集,有的偏存储密集。咱们做 FPGA 部署,就得把这些算法拆开,看看哪些适合并行流水,哪些需要缓存多帧。
核心观点:ISP Pipeline 的本质是“数据流 + 算法流”的协同。FPGA 的优势在于流水线并行,而不是像 CPU 那样串行跑。
1.2 ISP 核心模块速览
下面这张表,是我整理的核心模块功能与 FPGA 实现要点。每个模块我都踩过坑,后面会细讲。
| 模块 | 功能简述 | FPGA 实现要点 |
|---|---|---|
| Bayer 输入 | 接收传感器 RAW 数据,格式为 RGGB/GRBG 等 | LVDS/MIPI 接口,数据对齐,时钟域同步 |
| 黑电平校正 | 减去暗电流偏移,恢复真实黑电平 | 简单减法,单周期完成 |
| 坏点校正 | 检测并替换死点/亮点 | 需要 3x3 窗口,比较阈值,中值替换 |
| Demosaic | 从 Bayer 恢复全彩色,常用双线性或边缘导向 | 5x5 窗口,梯度计算,乘法器密集 |
| AWB | 估计光源色温,调整 R/G/B 增益 | 统计 R/G/B 均值,查表或迭代计算 |
| CCM | 3x3 矩阵乘法,校正色彩偏差 | 9 个乘法器 + 累加,流水线设计 |
| Gamma | 非线性映射,适应显示设备 | LUT 查表,256 或 1024 深度 |
| Sharpen | 增强边缘对比度,常用拉普拉斯或非锐化掩模 | 3x3 或 5x5 卷积,注意噪声放大 |
嗯,这里要注意:Demosaic 和 Sharpen 是资源消耗大户。我在一个 1080p 60fps 的项目里,光 Demosaic 就吃掉了 40% 的 DSP 资源。所以选型时,这两个模块的并行度要重点考虑。
1.3 ISP Pipeline 的典型数据流
为了让你更直观地理解,我画了一张流程图。这张图基本覆盖了主流 ISP 的骨架,咱们后面每一章都会围绕它展开。
你看,数据从传感器进来,经过前端、Demosaic、中端、后端,最后输出。每个模块之间用 FIFO 或行缓冲衔接。我个人习惯在 AWB 和 CCM 之间加一个帧缓冲,因为 AWB 需要统计整帧的 R/G/B 均值,没法做到逐像素流水。
1.4 FPGA 选型:Xilinx vs Altera/Intel
选型这事儿,说白了就是看你的算法要吃多少资源,跑多快,预算多少。我这些年用过 Xilinx 的 Artix、Kintex、Zynq,也用过 Altera 的 Cyclone、Arria。下面这张表是我自己的对比心得。
| 维度 | Xilinx (AMD) | Altera/Intel (PSG) |
|---|---|---|
| 开发工具 | Vivado,生态成熟,IP 核丰富 | Quartus,界面稍旧,但稳定 |
| DSP 资源 | DSP48E2,支持 27x27 乘法,适合 ISP | DSP Block,18x19 为主,高精度需组合 |
| BRAM/MLAB | BRAM 容量大,36Kb 块,适合行缓冲 | MLAB 灵活,但大容量需 M20K |
| 高速接口 | GTH/GTY,SerDes 速率高 | Transceiver,性能相当 |
| ISP 相关 IP | 有 MIPI CSI-2、VDMA、HLS 视频库 | 有 VIP 套件,但不如 Xilinx 丰富 |
| 成本 | 中高端偏贵,Artix 性价比不错 | Cyclone 系列便宜,适合量产 |
我的建议:如果你做的是 1080p 30fps 以内的 ISP,用 Xilinx Artix-7 或 Altera Cyclone V 就够了。但如果是 4K 60fps,老老实实上 Kintex 或 Arria 10,别省那点钱,否则时序跑不过有你哭的。
1.5 选型实战:如何估算资源?
我记得有一次,一个客户拿着一个 4K 30fps 的 ISP 需求来找我,说想用 Cyclone IV 做。我一看,Cyclone IV 的 DSP 才 200 多个,光 Demosaic 的 5x5 窗口就要 25 个乘法器,再加上 CCM 的 9 个、Sharpen 的 9 个,还有去噪的……算下来至少 80 个 DSP。再加上行缓冲,BRAM 也得 100 多块。Cyclone IV 根本扛不住。
所以,我一般按这个步骤估算:
- 算分辨率与帧率:1080p 60fps 的像素时钟约 148.5 MHz,4K 30fps 约 297 MHz。时钟越高,时序越难。
- 算 DSP 数量:每个卷积或矩阵乘法模块,按窗口大小估算。比如 5x5 卷积需要 25 个乘法器,但可以用 DSP48 的 27x27 模式一次算两个。
- 算 BRAM 数量:行缓冲是 ISP 的标配。1080p 的一行数据约 1920 像素,每个像素 16 位,一行就是 30 Kb。5 行缓冲需要 150 Kb,约 5 块 BRAM36K。
- 留余量:我习惯留 30% 的余量,因为后期调试、加功能、修 bug 都会吃资源。
警告:千万不要只看 LUT 和 FF 数量!ISP 的瓶颈往往是 DSP 和 BRAM。我曾经见过一个项目,LUT 用了 60%,但 DSP 用了 95%,结果布局布线跑得跟蜗牛一样。
1.6 选型决策树
最后,我画了一个简单的决策树,帮你快速锁定芯片范围。