2、核心硬件架构:处理器选型

好,咱们进入第二章。这一章我打算聊聊核心硬件架构,说白了就是——你那个视觉系统的大脑到底该选什么?

MCU、MPU、FPGA、ASIC,这四个词你肯定不陌生。但真到选型的时候,很多人就懵了。我见过不少项目,芯片选错了,后面整个推倒重来,那叫一个痛苦。所以这一章,我把自己踩过的坑和积累的经验,一次性倒给你。

2.1 处理器选型:MCU vs MPU vs FPGA vs ASIC

先给个总体的判断框架。我个人习惯,把视觉任务拆成三块:图像采集、预处理、推理决策。不同处理器擅长干的事,完全不一样。

处理器类型 典型频率 并行能力 功耗 开发难度 适合场景
MCU 几十~几百 MHz 极低 (mW级) 简单特征检测、二维码识别
MPU 几百 MHz~2 GHz 中等 (W级) Linux系统、复杂算法、人脸识别
FPGA 几十~几百 MHz 极高 中等 (W级) 实时预处理、高速接口、定制加速
ASIC 定制 极高 极低 极高 海量量产、固定算法、极致功耗

MCU,说白了就是单片机。我最早做的一个项目,用STM32F4跑一个简单的圆形检测,帧率只有5fps。但功耗才几十毫瓦,电池能撑好几天。如果你只是做做颜色识别、条形码扫描,MCU完全够用。别一上来就上Linux,那是杀鸡用牛刀。

MPU,比如树莓派、瑞芯微RK3588、全志系列。这类芯片能跑Linux,生态丰富。我建议,只要你的算法需要OpenCV、需要深度学习框架,直接上MPU。我在一个工业缺陷检测项目里,用RK3588跑YOLOv5s,能做到30fps,功耗才5W左右。嗯,这个平衡点很舒服。

FPGA,这玩意儿我一开始也觉得难。但后来发现,它做图像预处理简直是神器。比如做高斯滤波、边缘检测,FPGA一个时钟周期就能处理一个像素,而MCU要循环几十次。我曾经在一个高速产线项目里,用FPGA做实时去噪和缩放,把1080p图像处理延迟压到了1ms以内。MPU根本做不到。

ASIC,比如谷歌的TPU、地平线的BPU。这东西性能最强,功耗最低,但开模费动辄几百万。我建议,只有你的产品年出货量在10万片以上,才考虑ASIC。否则,老老实实用FPGA或MPU。

核心结论:没有最好的处理器,只有最合适的。我的经验是——先定算法,再定处理器。算法复杂度决定了你需要什么级别的算力。

2.2 异构计算架构

好,接下来聊异构计算。这个词听起来高大上,其实说白了就是——让不同的处理器干自己最擅长的事

你想想看,一个典型的嵌入式视觉系统,任务流是这样的:

  1. 摄像头采集原始图像(需要高速接口,比如MIPI)
  2. 图像预处理(去噪、缩放、色彩空间转换)
  3. 特征提取或推理(卷积、分类、检测)
  4. 结果输出(控制电机、显示、通信)

这些任务对处理器的要求完全不同。第1、2步需要高吞吐、低延迟,FPGA最合适。第3步需要复杂计算,MPU或NPU最合适。第4步需要实时控制,MCU最合适。

所以,一个典型的异构架构长这样:

+--------+     +--------+     +--------+
| Camera |---->| FPGA   |---->| MPU    |
| (MIPI) |     | (预处理) |     | (推理)  |
+--------+     +--------+     +--------+
                                    |
                                    v
                               +--------+
                               | MCU    |
                               | (控制)  |
                               +--------+

我在一个智能相机项目里,就用了这种架构。FPGA做实时去拜耳、白平衡,然后通过DMA直接把数据扔给MPU的内存。MPU跑一个轻量级CNN,检测结果通过UART发给MCU,MCU控制云台转动。整个系统延迟不到50ms。

我的建议:异构架构的关键是数据流设计。别让数据在处理器之间来回拷贝,那会吃掉所有性能。尽量用DMA、共享内存、或者高速总线(比如PCIe)来传输。

2.3 数据流路径分析

数据流路径,说白了就是图像数据从摄像头到最终结果,到底走了哪条路。这条路设计得好不好,直接决定了系统的实时性和功耗。

我见过最糟糕的设计是什么?摄像头采集一张图,先存到DDR,然后CPU读出来做预处理,再存回去,再读出来做推理,再存回去……每次读写DDR,功耗和延迟都翻倍。

正确的做法是:尽量让数据在片上流动

举个例子,一个典型的FPGA+MPU异构数据流:

摄像头 --MIPI--> FPGA (Line Buffer) --Stream--> FPGA (预处理) --AXI-Stream--> MPU (NPU推理) --结果--> 控制

这里的关键是:FPGA内部用Line Buffer做行缓存,不需要整帧存到DDR。预处理完的数据通过AXI-Stream直接流式传输给MPU。MPU的NPU也支持流式输入,不需要整帧缓存。这样,整个数据流是流水线的,延迟极低。

我曾经在一个项目里,把数据流从「帧级缓存」改成「行级流水」,延迟从30ms降到了2ms。嗯,这个优化太值了。

避坑指南:我曾经犯过一个错误——在FPGA和MPU之间用了SPI接口传输图像数据。SPI速度撑死了几十Mbps,传一张1080p图像要好几秒。后来换成并行总线,速度直接提升100倍。记住:图像数据量巨大,接口带宽是瓶颈

最后,总结一下数据流设计的三个原则:

  • 原则一:能流式处理就别缓存。流水线架构比帧级处理快一个数量级。
  • 原则二:能片上处理就别去DDR。片上SRAM的功耗和延迟都比DDR低得多。
  • 原则三:能硬件加速就别用软件。FPGA做预处理,NPU做推理,MCU做控制,各司其职。

好,这一章就到这里。下一章我会聊聊摄像头选型——传感器、镜头、接口,这些坑我踩得更多。到时候再细聊。