BLE低功耗蓝牙芯片设计思路(后续计划用SDR模拟蓝牙芯片)

抛出来一个问题,如果我们想用FPGA + SDR模拟一个BLE的芯片,那么我们首先遇到的第一个问题是,BLE有那么多功能,哪些应该放在FPGA中处理,哪些应该放在MCU中处理呢?

在FPGA + MCU的架构下进行软硬件划分是芯片原型验证和特定高性能应用中的常见做法。这里的FPGA充当了可编程的硬件加速器,而MCU则作为灵活的控制核心。

核心划分原则:

  • FPGA: 实现时序要求极端苛刻、高度并行、位操作密集、需要绝对确定性延迟 的功能。目标是减轻MCU的实时负担
  • MCU: 实现复杂的决策逻辑、状态机、协议栈高层、配置管理 等功能。目标是利用C语言的灵活性和可维护性

下面我们针对BLE LL层,进行详细的划分。


应该在FPGA中实现的功能

这些部分是协议的"肌肉",负责精确执行。

  1. 射频接口与时序控制
    • 内容:实现与外部射频芯片的接口。例如,控制SPI/I2C去配置射频芯片,并生成精确的时序信号来控制TX/RX开关。在SoC FPGA(集成射频的FPGA)中,这部分是直接控制射频模拟前端。
    • 原因:TX/RX切换的时序在微秒甚至纳秒级别,任何MCU的中断延迟和指令执行时间都会导致时序错误。
  1. 物理层数据处理
    • GFSK调制器:将输入的比特流通过查找表或数字滤波器转换为GFSK波形。
    • GFSK解调器:对ADC采样进来的数字信号进行解调,恢复出'0'和'1'。这可能涉及数字下变频、滤波和鉴频算法。
    • 原因:这是信号处理的核心,计算量大,非常适合FPGA的并行流水线架构。用MCU实现实时GFSK解调会消耗大量资源且难以保证性能。
  1. 位级处理单元
    • CRC计算与校验:为每个发送包实时计算CRC,并为每个接收包校验CRC。
    • 数据白化与解白化:使用线性反馈移位寄存器在发送端进行白化,在接收端进行解白化。
    • 原因:这些是流式的、按位进行的操作。FPGA可以轻松地以线速处理这些流,而MCU需要逐位或逐字节处理,效率低下。
  1. 高精度定时与调度器
    • 内容:实现一个或多个高精度定时器(精度在1微秒以内),用于控制连接间隔、发射窗口、ACK响应窗口等。
    • 原因:BLE协议要求设备在精确的时刻唤醒、监听或发送。FPGA定时器可以产生绝对准时的触发信号来驱动其他模块,而MCU的定时器可能会受到其他中断的干扰。
  1. 数据包装配与拆解
    • 内容:将LL Firmware准备好的包头和载荷数据,加上前导码、CRC等,组装成完整的比特流送给调制器。反过来,从解调器输出的比特流中,剥离前导码,提取出有效数据。
    • 原因:这是与物理层紧密相关的位操作,在FPGA中实现最自然。

应该在MCU中实现的功能(用C语言编码)

这些部分是协议的"大脑",负责决策和管理。

  1. 完整的链路层状态机
    • 内容:管理广告、扫描、发起、连接、待机等五大状态及其转换。这是LL层最复杂的逻辑。
    • 原因:用C语言实现复杂的状态机远比用HDL简单、清晰、易于调试和修改。协议更新时,也只需要更新固件。
  1. 信道管理(这个我认为有争议,放FPGA测也可以)
    • 内容:执行自适应跳频算法,管理信道映射。
    • 原因:算法逻辑复杂,但计算不密集,在毫秒级的时间内完成即可。MCU完全能够胜任。
  1. 连接管理
    • 内容:维护连接句柄、连接参数、监控连接超时、处理连接更新请求等。
    • 原因:这是控制层面的核心,需要与上层协议栈频繁交互,适合在MCU中处理。
  1. 过滤策略与白名单
    • 内容:根据设备的过滤策略,判断是否响应某个广告包或连接请求。
    • 原因:策略多样,可由应用层配置,软件实现更灵活。
  1. HCI接口驱动与协议
    • 内容:解析来自主机的HCI命令,并生成HCI事件发送给主机。
    • 原因:这是一个标准的、基于数据包的命令接口,非常适合用MCU的软件来处理。
  1. 与FPGA的驱动接口
    • 内容:通过内存映射寄存器、FIFO或DMA与FPGA中的硬件加速模块进行通信。
    • 原因:MCU需要配置FPGA中的寄存器,从FPGA读取接收到的数据,向FPGA写入要发送的数据。

典型的FPGA+MCU协同工作流程(以接收数据包为例)

  1. FPGA(自动):射频芯片接收到信号,ADC采样后送入FPGA。
  2. FPGA(自动):FPGA中的解调器、解白化、CRC模块自动工作,将解调出的比特流组装成字节,并校验CRC。
  3. FPGA -> MCU :当一个完整的数据包接收并校验成功后,FPGA会将该数据包通过一个FIFO或共享内存存入缓冲区,并向MCU产生一个中断信号
  4. MCU(C代码):MCU响应中断,执行中断服务程序,从缓冲区中读取数据包。
  5. MCU(C代码):MCU中的LL Firmware解析数据包头部:
    • 检查目标地址是否匹配。
    • 判断数据包类型。
    • 如果是数据信道PDU,且需要回复ACK,则MCU会立即准备一个ACK数据包。
  1. MCU -> FPGA:MCU将ACK数据包写入FPGA的发送缓冲区,并设置一个"发送请求"标志位。
  2. FPGA(自动) :FPGA的精确定时器在正确的ACK时间窗口到期后,自动 从发送缓冲区取出ACK数据,经过白化、CRC、调制后,通过射频接口发送出去。整个过程无需MCU干预
  3. MCU(C代码):MCU继续处理这个有效数据包,并将其通过HCI接口上传给主机。

总结与对比

|--------------|-------------|-------------------------|
| 功能模块 | 推荐实现方式 | 关键原因 |
| 射频时序控制 | FPGA | 微秒/纳秒级精度,规避MCU中断延迟 |
| GFSK调制解调 | FPGA | 计算密集型信号处理,FPGA并行流水线优势巨大 |
| CRC/白化 | FPGA | 流式位操作,硬件实现效率远超软件循环 |
| 高精度定时/调度 | FPGA | 提供确定性延迟,保证协议时序 |
| 包装配/拆解 | FPGA | 与物理层紧密耦合的位操作 |
| 链路层状态机 | MCU (C) | 逻辑极其复杂,C语言实现更灵活、易维护 |
| 信道跳频算法 | MCU (C) | 控制逻辑复杂,实时性要求不高 |
| 连接/安全管理 | MCU (C) | 决策和管理功能,需与上层交互 |
| HCI接口 | MCU (C) | 标准命令解析,纯软件任务 |
| FPGA驱动 | MCU (C) | 配置和控制硬件加速器 |

最终建议:

在您的项目中,优先将物理层和精确时序逻辑在FPGA中实现 。这能确保协议的根本稳定性。然后,将复杂的控制状态机在MCU中用C语言实现,这将大幅提高开发效率和代码的可维护性。这种架构在性能、功耗和开发周期上取得了很好的平衡,也是许多商业芯片内部架构的体现。