1、SoC概述与架构基础:SoC定义、典型架构(ARM Cortex-M/A系列、RISC-V)、总线结构(AHB/APB/AXI)、常见外设IP
各位同学,咱们今天正式开课。聊SoC之前,我先问大家一个问题:你手里那台手机,或者你工位上的开发板,里面那颗黑乎乎的芯片,到底是怎么工作的?
嗯,这个问题其实挺大的。但别急,我们从最基础的概念开始,一步步拆解。
1.1 到底什么是SoC?
SoC,全称System on Chip,片上系统。说白了,就是把一台电脑(或者一个嵌入式系统)的所有核心部件,全部集成到一颗芯片上。
你想想看,传统的电脑有CPU、有内存控制器、有显卡、有硬盘控制器、有各种接口芯片,这些是分开的。但SoC不一样,它把CPU核心、内存控制器、GPU、各种外设控制器(比如USB、I2C、SPI、UART)、甚至Wi-Fi/蓝牙的基带,统统塞进一个Die里。
我个人习惯把SoC比作一个「微型城市」:CPU是市政府,负责决策和运算;总线是城市的主干道和支路,负责数据运输;外设IP是各种功能建筑(邮局、银行、港口),负责和外界打交道。
核心要点: SoC ≠ 单纯的CPU。CPU只是SoC里的一个「住户」。SoC的灵魂在于「集成」和「互联」。
我在项目中遇到过不少新手,拿到一个SoC的Datasheet,第一反应就是去找CPU的主频和架构,然后就开始写代码。结果呢?外设没配好,总线时钟没开,系统根本跑不起来。嗯,这就是典型的「只见树木,不见森林」。
1.2 典型架构:ARM Cortex-M/A系列与RISC-V
聊到SoC,绕不开处理器核心架构。目前市面上主流的,就是ARM和RISC-V这两大阵营。
1.2.1 ARM Cortex-M系列:微控制器的王者
Cortex-M系列,主打低功耗、实时性、低成本。你手里的智能手环、空调遥控器、TWS耳机,里面大概率是M0+、M3、M4或者M7核心。
- Cortex-M0+: 极致低功耗,面积小。我做过一个电池供电的传感器节点,用的就是M0+,整机功耗可以做到微安级别。
- Cortex-M3: 经典款,性能和功耗的平衡点。很多工业控制、物联网网关都在用。
- Cortex-M4/M7: 带FPU(浮点运算单元)和DSP指令集。适合做音频处理、电机控制、数字电源。
避坑指南: 我曾经在一个项目中,为了省成本选了M0+来做音频解码。结果发现M0+没有硬件乘法器,做FFT运算慢得离谱。后来老老实实换了M4。所以,选型时一定要看清楚你的算法需求,别只看价格。
1.2.2 ARM Cortex-A系列:应用处理器的担当
Cortex-A系列,主打高性能,跑Linux/Android。你的手机、平板、树莓派、路由器,里面都是A系列核心。
- Cortex-A5/A7: 低功耗应用处理器,适合入门级Linux设备。
- Cortex-A53/A55: 64位架构,能效比极高。现在很多中低端手机和IoT网关都在用。
- Cortex-A72/A76/A78/X1: 高性能大核,旗舰手机和服务器芯片的标配。
M系列和A系列最大的区别是什么?MMU(内存管理单元)。A系列有MMU,可以跑虚拟内存,支持Linux;M系列没有MMU,跑的是RTOS或者裸机。这一点,做固件开发的同学一定要刻在脑子里。
1.2.3 RISC-V:开源架构的新势力
RISC-V,这几年火得一塌糊涂。它最大的特点就是「开源」和「模块化」。你不需要向任何人交授权费,而且指令集可以自己裁剪。
我个人非常看好RISC-V在IoT和AI边缘计算领域的潜力。为什么?因为你可以自己加自定义指令。比如,你做一个神经网络加速器,可以直接在RISC-V核里加一条「卷积指令」,效率比通用CPU高得多。
不过,RISC-V的生态还在建设中。工具链、调试器、中间件,目前不如ARM成熟。我建议初学者可以先从ARM入手,等有了基础再玩RISC-V,会更容易理解。
| 特性 | ARM Cortex-M | ARM Cortex-A | RISC-V |
|---|---|---|---|
| 目标应用 | 实时控制、低功耗 | 高性能、操作系统 | 灵活定制、IoT |
| MMU | 无 | 有 | 可选 |
| 指令集 | ARMv7-M/v8-M | ARMv7-A/v8-A | RV32I/RV64I |
| 生态成熟度 | 非常成熟 | 非常成熟 | 发展中 |
| 典型功耗 | μW ~ mW | mW ~ W | μW ~ mW |
1.3 总线结构:AHB、APB、AXI
好,CPU核心有了,外设IP也有了,怎么把它们连起来?靠总线。ARM公司搞了一套AMBA(Advanced Microcontroller Bus Architecture)总线协议,目前最常用的就是AHB、APB和AXI。
1.3.1 AHB:高性能总线
AHB(Advanced High-performance Bus),顾名思义,用来连接高速设备。比如CPU和内存之间、DMA控制器和内存之间、以太网MAC和内存之间。
AHB的特点是:流水线操作、突发传输、多主设备支持。你想想看,CPU要读内存,DMA也要读内存,谁先谁后?AHB有仲裁器来决定。
关键点: AHB的地址总线和数据总线是分开的。一次传输分为地址阶段和数据阶段,可以流水起来,效率很高。
1.3.2 APB:低功耗外设总线
APB(Advanced Peripheral Bus),是给慢速外设准备的。比如UART、I2C、GPIO、定时器。这些设备对速度要求不高,但数量多。
APB的设计很简单:没有流水线,没有突发传输,一次只传一笔数据。而且APB的接口非常简洁,适合挂载大量低速外设。
我习惯把APB比作「小区里的支路」,车少、路窄,但连接着每家每户。AHB则是「城市主干道」,车多、路宽,但只有几个主要出入口。
1.3.3 AXI:高性能、高带宽的旗舰总线
AXI(Advanced eXtensible Interface),是AMBA家族里最强大的总线。它支持独立的地址/数据通道、乱序传输、多笔未完成事务。说白了,就是为高性能计算和DDR内存访问量身定做的。
AXI有五个独立的通道:读地址、读数据、写地址、写数据、写响应。每个通道都可以独立握手,互不干扰。这就意味着,CPU可以一边发写地址,一边收读数据,效率极高。
注意: AXI协议非常复杂。初学者不要一上来就啃AXI的协议文档,会劝退的。我建议你先理解AHB,再过渡到AXI,会平滑很多。我曾经带过一个新人,让他直接写AXI Slave的RTL代码,结果他看了两周协议,代码一行没写出来。
1.4 常见外设IP
一个SoC里,除了CPU和总线,剩下的就是各种外设IP。我列几个最常见的,也是咱们固件开发天天要打交道的:
- GPIO: 通用输入输出。最基础的外设,没有之一。可以控制LED、读取按键、模拟各种协议。
- UART: 异步串口。调试利器,很多SoC的BootROM就是通过UART下载固件的。
- I2C: 两线制同步串口。用来接传感器、EEPROM、RTC时钟。
- SPI: 四线制同步串口。速度比I2C快,用来接Flash、LCD、SD卡。
- Timer/PWM: 定时器和脉宽调制。做电机控制、呼吸灯、系统心跳。
- DMA: 直接存储器访问。让外设直接和内存交换数据,解放CPU。
- USB: 通用串行总线。设备端(Device)和主机端(Host)都有。
- Ethernet MAC: 以太网控制器。联网必备。
每个外设IP,在SoC内部都有一个固定的地址空间。CPU通过读写这些地址,来控制外设。这就是所谓的「内存映射I/O」(MMIO)。
举个例子,假设UART的发送寄存器地址是0x40001000,你往这个地址写一个字节,UART就会把这个字节发出去。简单吧?但实际项目中,你要配置波特率、数据位、停止位、校验位,还要处理中断和FIFO,就没那么简单了。
我的建议: 学习SoC,不要只盯着CPU。花时间把Datasheet里的「Memory Map」和「Peripheral Register Description」看透,比什么都强。我每次拿到一个新芯片,第一件事就是打印出Memory Map,贴在工位上。
好了,第一章的内容就到这里。我们讲了SoC的定义、三大处理器架构、AMBA总线家族,以及常见的外设IP。这些都是后续章节的基石。下一章,我们会深入BootROM,看看芯片上电后,第一条指令到底是怎么执行的。