提到 ESP32,玩嵌入式的朋友基本都不陌生;但说到 ESP-Mosaico,很多人还处于“听过名字、没搞清楚它到底能干嘛”的状态。这是乐鑫在异构计算方向上放出的一个平台:把一颗 ESP32-S3 MCU 和一颗 Gowin 的 FPGA 封装在同一个方案里,做成 SoC FPGA 形态的模组与开发板。简单说,MCU 帮你搞定 Wi-Fi、蓝牙、协议栈、上层应用,FPGA 负责那些对时序敏感、需要并行处理的高速逻辑。适合谁?一是做视觉、显示、电机控制、工业采集,觉得普通 MCU 算力不够但上 Linux 板又太重的开发者;二是玩 FPGA 但不太想啃 Linux、想找个好用好上手的 MCU 当“大脑”的硬件工程师。这篇文章我就从硬件架构、软件栈、典型场景到实操踩坑,把整个 ESP-Mosaico 平台完整拆一遍。
1. ESP-Mosaico 到底是什么,为什么要这么设计
1.1 先从名字说起
“Mosaico”是意大利语里的“马赛克”,引申意思就是把多块小东西拼成一个大整体。用在乐鑫这个项目上非常贴切:它本质上是把两颗不同工艺、不同功能的 die 放进同一个封装/同一个板级方案里,一颗是成熟的 ESP32-S3,另一颗是 Gowin 的小规模 FPGA。这种“多 die 合封”的思路在手机 AP 上很常见,但在面向创客和嵌入式工程师的生态里,真正把 MCU + FPGA 做成一个开箱即用开发平台的,ESP-Mosaico 算是比较早的一批。
名字里还有个细节值得注意:它不叫“ESP32-FPGA”,而是单独给了个新系列名。这说明乐鑫不是简单地把两颗芯片焊在一块板上,而是从软件栈到通信协议都做了统一封装。你不需要自己操心 MCU 和 FPGA 之间怎么握手、怎么传输数据,框架层面已经把这层东西做好了。
1.2 为什么要在 MCU 旁边塞一块 FPGA
这得从嵌入式开发的现实痛点说起。MCU 处理串行任务很强,但遇到“同时要盯很多路信号”的场景就难受。比如你要驱动一块 RGB LCD,像素时钟十几兆甚至几十兆,每个像素还要做颜色格式转换;又比如四路编码器同时解码,每路信号抖动在微秒级。这些事如果用 CPU 去做,要么得开定时器中断在里面逐条处理,把主频吃得干干净净;要么延迟抖动大得没法看。
FPGA 的强项恰恰是并行和确定性的时序。所有逻辑都是硬件电路,多个模块同时跑,延迟是纳秒级且可预测的。但 FPGA 也有劣势:跑网络协议、跑复杂算法库、跑 AI 模型,开发效率远不如 MCU。ESP-Mosaico 的思路就是让两者各干各擅长的活:ESP32-S3 负责连接、控制、上层应用,FPGA 负责高速 IO、并行计算、自定义时序接口。两者之间有一条高速通道,数据搬运的瓶颈被尽量抹平。
和“自己买一块 FPGA 开发板 + 一块 ESP32 再飞线连接”相比,这套方案最大的优势是省掉了接口设计这一大坨脏活。离散方案里,你要自己定义并口或 SPI 协议、自己解决电平匹配、自己处理跨时钟域,通信带宽通常也就几十 Mbps。而 ESP-Mosaico 的双芯通道是专门设计过的,带宽高一个数量级,而且 MCU 侧读 FPGA 里的寄存器或 BRAM,就跟读自己的内存一样,不需要在每次传输前做一大堆协议打包。
2. 硬件架构拆解:MCU 和 FPGA 是怎么分工协作的
2.1 两颗芯片的“人设”完全不同
先看规格。ESP32-S3 这颗 MCU 大家很熟悉:双核 Xtensa LX7,主频最高 240 MHz,带 Wi-Fi 和蓝牙,支持外部 PSRAM 和较大容量的 Flash,USB 口可以直接当串口和 JTAG 用。它天生适合跑 ESP-IDF 生态里的各种组件,LVGL、ESP-DL 神经网络推理、MQTT、蓝牙 Mesh,这些库都是现成的。
FPGA 那边用的是 Gowin 小规模 FPGA 家族的产品,从资源量看属于面向低成本、低功耗场景的 4K 级逻辑器件。逻辑单元按 LUT4 计算在几千级别,内部集成了一定容量的块式 SRAM、硬件乘法器/DSP 单元和锁相环 PLL。这个规模不算大,没法跟动不动几十万 LUT 的中高端 FPGA 比,但它特别适合做“接口胶水逻辑 + 少量实时处理”,比如 LCD 时序生成、摄像头数据拼接、编码器解码、PWM 波形发生。两块芯片放在一起,典型的“大管家 + 车间主任”组合。
| 维度 | ESP32-S3(MCU 侧) | Gowin FPGA(FPGA 侧) |
|---|---|---|
| 擅长 | 协议栈、网络、AI 推理、上层逻辑 | 并行计算、精密时序、自定义接口 |
| 开发方式 | C/C++,ESP-IDF,调试方便 | Verilog/VHDL,RTL 级设计 |
| 典型负载 | 状态机、事件处理、UI | 像素搬运、信号同步、波形生成 |
| 资源瓶颈 | 主频和 RAM 带宽 | LUT 和 BRAM 数量 |
2.2 双芯之间的高速通道是核心
如果 MCU 和 FPGA 之间只是用普通 SPI 连接,那这个平台也就是个“方便点的开发板”,谈不上架构创新。ESP-Mosaico 的关键在于双芯间的高速互联通道。FPGA 侧会把一部分逻辑资源实现为总线从设备,MCU 侧则通过内存映射方式直接访问。换句话说,MCU 写一个 32 位数据到某个地址,这个数据就直接出现在 FPGA 的寄存器里;FPGA 把采集到的数据放进自己的 BRAM,MCU 也能像读内存一样把它读出来。
这种方式的好处是开发心智负担小。你不需要定义一套“发送长度 + 校验 + 应答”的应用层协议,通信行为被抽象成了寄存器读写。框架会在底层做好时序转换,实际带宽根据官方资料给出的量级,比普通 SPI 高出不止一个数量级。不过要提醒一点:内存映射方式虽然好用,但“单个地址反复读写”和“批量突发传输”的吞吐差距非常大,这个坑后面我会专门展开。
2.3 开发板上还有什么可以玩的
ESP-Mosaico-1 这块官方开发板,外围配置基本是照着“显示 + 视觉 + 工业控制”这三个方向来做的。USB-C 口负责供电、下载和调试,板上一般会带 SPI Flash 和 PSRAM,保证 ESP-IDF 应用和 FPGA bitstream 都有地方存。屏幕方面留了并行 RGB LCD 接口,接一颗带电容触摸的屏幕就能跑 LVGL;图像采集端有摄像头接口,适合做视觉类原型。SD 卡槽在需要存大量数据时很有用。FPGA 的普通 IO 也会引到排针上,方便你把自己的自定义外设接进 FPGA 逻辑。对于早期学习来说,这块板不需要再添太多东西,一根 Type-C 线就能开始。