图像采集与硬件加速方案实战 - 第3节
一、FPGA 基本架构:它到底长什么样?
说实话,很多刚接触 FPGA 的朋友,第一反应都是——这玩意儿跟 CPU 有啥区别?
我当年刚入行时也这么想。直到第一次在项目里用 FPGA 做图像采集,才真正体会到它的特别之处。
FPGA 的全称是 Field Programmable Gate Array,现场可编程门阵列。说白了,它是一块可以让你「自定义硬件电路」的芯片。CPU 是软件执行指令,FPGA 是硬件直接干活。
1.1 核心组成:四个关键模块
一个典型的 FPGA 芯片内部,主要由这几部分构成:
- 可编程逻辑单元(Logic Cells)——这是 FPGA 的「肌肉」。每个逻辑单元包含查找表和触发器,用来实现各种逻辑功能。我在项目中做图像预处理时,就是用这些单元搭建的卷积运算模块。
- 可编程互连资源(Interconnect)——相当于 FPGA 的「血管」。它把各个逻辑单元连接起来。布线好不好,直接影响时序能不能跑通。
- 块存储器(Block RAM)——FPGA 内部的存储资源。图像采集时,我经常用它做行缓存(Line Buffer),存一帧图像的一行数据。
- I/O 引脚(I/O Pins)——跟外界打交道的接口。图像传感器传过来的数据,就是通过这些引脚进来的。
重点理解:FPGA 是「硬件可编程」,不是「软件可编程」。你写的 Verilog 代码,最终会变成实实在在的硬件电路。
1.2 跟 CPU、GPU 比,FPGA 强在哪?
| 对比项 | CPU | GPU | FPGA |
|---|---|---|---|
| 执行方式 | 指令串行 | 并行计算 | 硬件并行 |
| 延迟 | 高(微秒级) | 中(毫秒级) | 低(纳秒级) |
| 适合场景 | 复杂控制 | 大规模矩阵运算 | 实时信号处理 |
| 图像采集 | 需外部接口 | 不适合 | 天生适合 |
你想想看,图像传感器一秒钟输出 60 帧 1080p 的数据,每帧 200 多万个像素。CPU 处理起来得排队,FPGA 呢?直接硬件流水线,数据进来一个处理一个,延迟几乎为零。
二、FPGA 开发流程:从代码到硬件
很多初学者觉得 FPGA 开发难,其实是因为不熟悉它的「套路」。我刚开始做第一个项目时,也踩了不少坑。这里把流程梳理一下。
2.1 标准开发流程
- 需求分析与架构设计——先想清楚你要做什么。图像采集?图像预处理?还是显示输出?
- 代码编写(RTL 设计)——用 Verilog 或 VHDL 写逻辑代码。我个人习惯用 Verilog,语法简洁,上手快。
- 功能仿真(Simulation)——在电脑上模拟运行,看看逻辑对不对。这一步很重要,能省下大量调试时间。
- 综合(Synthesis)——把 Verilog 代码转换成门级网表。说白了,就是把你的「设计图纸」翻译成 FPGA 能理解的「电路图」。
- 实现(Implementation)——包括布局、布线。把逻辑单元放到芯片的物理位置上,并连好线。
- 时序分析(Timing Analysis)——检查电路能不能跑在目标频率上。嗯,这里要注意,时序不过关,板子跑起来就会出各种诡异问题。
- 生成比特流并下载——最后一步,生成配置文件,烧录到 FPGA 芯片里。
我的经验:仿真阶段多花 1 小时,调试阶段能省 10 小时。别急着上板子,先把仿真跑通。
2.2 开发工具链
目前主流的两大厂商:
- Xilinx(AMD)——Vivado 工具链。我最早用的就是它,生态成熟,文档齐全。
- Intel(Altera)——Quartus 工具链。有些老项目还在用。
我个人建议初学者从 Xilinx 入手,社区资源多,遇到问题好查。
三、FPGA 在图像采集中的角色:它到底干了什么?
图像采集系统,说白了就是「把光信号变成数字信号,再存起来或者处理掉」。FPGA 在这个链条里扮演什么角色?我画了一张图,你看完就明白了。
3.1 数据接收与同步
图像传感器输出的数据,通常带有像素时钟、行同步、帧同步信号。FPGA 要做的第一件事,就是把这些信号「接住」并同步到内部时钟域。
我曾经在一个项目中,传感器输出的时钟频率是 74.25MHz(1080p 标准),FPGA 内部逻辑跑 150MHz。跨时钟域处理没做好,图像就出现了「花屏」。后来加了异步 FIFO 才搞定。
3.2 图像预处理
原始数据从传感器出来,往往是 Bayer 格式(一种单通道的彩色排列方式)。FPGA 可以实时完成:
- 去马赛克(Demosaic)——把 Bayer 转成 RGB
- 白平衡调整——校正颜色偏差
- 降噪滤波——去除传感器噪声
- 缩放裁剪——调整图像尺寸
这些操作如果用 CPU 做,一帧 1080p 图像可能要几十毫秒。FPGA 呢?流水线一开,延迟只有几微秒。
3.3 缓存与帧控制
FPGA 内部 Block RAM 容量有限,存不下一整帧图像。所以通常需要外接 DDR 内存。FPGA 负责控制 DDR 的读写时序,把图像数据暂存起来。
注意:DDR 控制器的设计比较复杂,建议直接用厂商提供的 IP 核。我自己第一次写 DDR 控制器时,折腾了两周才跑通,后来发现用 IP 核十分钟就搞定了。
3.4 数据输出
处理完的图像数据,FPGA 可以通过多种接口送出去:
- MIPI / LVDS——给显示面板
- USB 3.0 / GigE——给上位机
- AXI4-Stream——给 SoC 内部的 ARM 核
说白了,FPGA 在图像采集系统里,既是「翻译官」又是「搬运工」,还是「预处理车间」。三个角色一肩挑。
一句话总结:FPGA 做图像采集,核心优势就两个字——实时。数据从传感器出来,经过 FPGA 处理,再到输出,整个过程是硬件流水线,没有软件中断,没有操作系统调度,延迟可控在纳秒级。
好了,这一章我们聊了 FPGA 的基本架构、开发流程,以及它在图像采集中的具体角色。下一章,我们会深入传感器接口,看看 MIPI 和 LVDS 到底怎么接、怎么配。到时候我会分享一些实际项目中的调试经验,保证让你少走弯路。