3. 系统架构设计
系统架构设计,说白了就是给硬件画骨架。很多工程师一上来就画原理图,结果画到一半发现接口不够用,电源带不动,时钟抖得厉害。我见过太多这样的返工案例了。
我个人习惯,拿到需求后先花两天时间做架构设计。这步省了,后面全是坑。
硬件系统框图设计
框图是硬件的顶层视图。它不关心具体电阻电容,只关心模块间怎么连。
画框图时,我一般遵循三个原则:
- 从左到右的信号流向:输入在左,输出在右,控制在上,电源在下
- 模块粒度适中:一个芯片一个框,不要拆到寄存器级
- 接口标注清晰:总线类型、位宽、速率,能写就写
举个例子,一个典型的嵌入式系统框图:
核心思路:框图不是装饰品,它是团队沟通的通用语言。软件看它知道驱动写什么,结构看它知道板卡怎么摆,测试看它知道从哪里下手。
下面是我用 SVG 画的一个通用硬件系统框图,你可以参考这个结构去画自己的方案。
模块划分与接口定义
框图画完了,接下来就是切模块。模块划分的粗细,直接决定了后续工作量。
我习惯按功能域来切:
- 计算域:主控、协处理器、FPGA
- 存储域:DDR、Flash、SD卡
- 通信域:有线(ETH、CAN)、无线(WiFi、BLE)
- 感知域:传感器、ADC、摄像头
- 执行域:电机驱动、继电器、DAC
- 电源域:PMIC、LDO、DCDC、电池管理
每个域内部再细分到芯片级。接口定义要精确到引脚级。
我的习惯:接口定义表里至少包含信号名、方向、电平标准、最大速率、备注。这个表后面会直接用来画原理图符号和做 PCB 扇出。
接口定义表示例:
| 接口名称 | 信号 | 方向 | 电平 | 速率 | 备注 |
|---|---|---|---|---|---|
| SPI0 | SCLK/MOSI/MISO/CS | 主→从 | 3.3V | 10MHz | 接 Flash |
| I2C0 | SCL/SDA | 双向 | 3.3V | 400kHz | 接传感器 |
| UART0 | TX/RX | 双向 | 3.3V | 115200bps | 调试口 |
| USB_OTG | D+/D-/ID/VBUS | 双向 | 5V/3.3V | 480Mbps | Type-C |
注意:接口电平不匹配是硬件设计中最常见的低级错误。我曾经在一个项目里把 1.8V 的传感器直接连到 3.3V 的主控上,结果烧了三个样片才找到原因。接口定义表里一定要写清楚电平标准。
电源树规划
电源树是硬件的血管系统。规划不好,轻则系统不稳定,重则芯片冒烟。
我画电源树时,会按这个步骤来:
- 列出所有电压需求:每个芯片需要几路电,电压多少,电流多少
- 确定上电时序:谁先上电,谁后上电,间隔多少
- 选择电源方案:DCDC 效率高但纹波大,LDO 纹波小但效率低
- 计算总功耗:所有负载加起来,再留 30% 余量
- 画电源树图:从输入到输出,每一级标注电压和最大电流
电源树规划示例:
| 电源轨 | 电压 | 最大电流 | 来源 | 负载 |
|---|---|---|---|---|
| VIN | 12V | 3A | 外部适配器 | — |
| V5V | 5V | 2A | DCDC (12V→5V) | USB、电机 |
| V3V3 | 3.3V | 1.5A | DCDC (5V→3.3V) | 主控、Flash、传感器 |
| V1V8 | 1.8V | 500mA | LDO (3.3V→1.8V) | DDR、PLL |
| V1V2 | 1.2V | 300mA | LDO (1.8V→1.2V) | 内核电压 |
避坑指南:我曾经在一个项目里把 DCDC 的输出直接给模拟电路供电,结果 ADC 采样值跳得像心电图。后来换成 LDO 加 π 型滤波,问题才解决。数字电路用 DCDC,模拟电路用 LDO,这是铁律。
时钟树规划
时钟是系统的心跳。时钟树规划不好,时序收敛就是噩梦。
时钟树规划的核心要点:
- 时钟源选择:晶振、振荡器、PLL、外部时钟输入
- 时钟分配:一路时钟分给多个设备时,要考虑扇出和驱动能力
- 时钟抖动:高速接口对抖动敏感,要加时钟缓冲器
- 时钟域划分:不同频率的时钟域之间要做异步处理
时钟树规划示例:
| 时钟名 | 频率 | 来源 | 用途 | 抖动要求 |
|---|---|---|---|---|
| CLK_MAIN | 25MHz | 晶振 | 主控系统时钟 | <50ps |
| CLK_DDR | 400MHz | PLL (25MHz×16) | DDR 控制器 | <20ps |
| CLK_USB | 48MHz | PLL (25MHz×1.92) | USB PHY | <100ps |
| CLK_ETH | 125MHz | 独立振荡器 | 以太网 PHY | <50ps |
注意:时钟抖动是高速设计的隐形杀手。我记得有一次调试千兆以太网,死活不通,用示波器一看,时钟抖动 200ps,远超 PHY 芯片的容忍范围。换了个低抖动晶振,问题秒解。时钟源的钱不能省。
嗯,到这里系统架构设计的基本框架就搭完了。框图、模块划分、接口定义、电源树、时钟树,这五样东西齐了,原理图设计才能有条不紊地推进。你想想看,如果连系统有几个电源域、时钟从哪里来都没想清楚,就开始画原理图,那不是给自己挖坑吗?