在BLE协议单元的基带架构中,PMU(电源管理单元,Power Management Unit)负责管理系统的电源,确保各个模块根据需要进入不同的功耗模式,以延长电池寿命,并提供必要的电力以维持系统稳定工作。PMU模块通过动态调整功耗管理,来控制BLE的各个模块在不同的工作状态下的电源供给。
PMU的工作原理
-
功率模式控制: BLE设备通常有多个功耗模式,如待机、低功耗、活动模式等。PMU会根据BLE协议栈的需求,控制系统进入不同的功耗模式。例如,在数据传输时,PMU会保持BLE无线电模块工作,而在闲置时,它可能会将无线电模块和其他模块进入低功耗状态。
-
电源切换: PMU通过动态控制电源切换来优化功耗。例如,当系统进入低功耗状态时,PMU会关闭不需要的模块(如某些传感器模块或无线电模块),只保留最必要的部分工作。
-
电池监控与电源稳定: PMU还会监控电池电量,确保电池电量不足时系统进入低功耗模式或休眠模式。同时,PMU还会提供电源稳定性,防止电压波动影响系统的工作稳定性。
PMU如何控制BLE各个模块
PMU在BLE系统中通过与各个模块的交互来控制它们的工作模式。典型的控制方式如下:
-
控制无线电模块(Radio):
BLE的无线电模块通常有不同的工作模式,如接收(RX)、发送(TX)和空闲(IDLE)。在数据传输时,PMU保证无线电模块处于活动状态;而在空闲时,则将其切换到低功耗模式。 -
控制微控制器(MCU):
MCU通常在BLE设备中负责处理数据、协议栈的执行以及与外部设备的通信。PMU可以通过控制MCU的工作模式,例如在不需要进行数据处理时将其置于休眠或低功耗模式。 -
控制传感器模块:
传感器模块通常在数据采集过程中工作,PMU可以根据采集频率和数据处理需求动态调整其工作状态,避免不必要的能量消耗。
面向BLE无源通信系统的标签芯片基带设计,张旭,西安电子科技大学
各个模块功能:
-
PMU(Power Management Unit):位于图的顶部,控制各个模块的电源。它负责管理整个系统的功耗,确保系统在不同的工作模式下达到低功耗目标。PMU在图中起到协调作用,向下控制其他模块的电源或工作状态。
-
FRM(Frame):这个模块通常负责生成和处理数据帧。BLE通信中,数据传输是基于数据帧的,因此FRM模块可能涉及到帧的构建、拆解或格式化。
-
WHITEN(Whitening):Whitening模块用于对数据进行 whitening 操作,防止数据模式对无线电信号造成干扰。数据whitening常用于减少数据流中可能出现的长时间相同的比特模式,这样可以提高传输的可靠性和效率。
-
CRC(Cyclic Redundancy Check):CRC模块负责数据的错误检测。通过计算数据的CRC校验值,CRC模块可以检测到传输过程中是否发生了数据损坏。
图中的箭头:
- 从PMU到其他模块:PMU模块控制这些模块的启用与关闭,可能是电源管理的指示,或者是指示这些模块是否需要工作。
- 从其他模块回到PMU:这些箭头可能表示数据或状态反馈给PMU,用于调整功耗模式或管理系统的工作状态。
控制流程
- PMU控制FRM模块:在数据传输时,FRM模块需要处于工作状态,它负责数据帧的生成和处理。PMU根据系统的工作模式,决定是否激活该模块。
- PMU控制WHITEN模块:WHITEN模块用于数据 whitening,通常是在数据发送前启用。当数据传输需要 whitening 时,PMU会激活此模块。否则,它可能会进入低功耗模式。
- PMU控制CRC模块:CRC模块用于数据的错误检测,它通常在数据传输过程中被启用。PMU会根据数据传输的需要激活或关闭该模块。
module PMU_Control( input wire clk, // 系统时钟 input wire reset, // 系统复位 input wire start_tx, // 开始数据传输信号 input wire enable_whiten, // whitening启用信号 input wire enable_crc, // CRC启用信号 output reg enable_frm, // FRM启用信号 output reg enable_whiten_out,// WHITEN启用信号 output reg enable_crc_out // CRC启用信号 ); // 初始化模块状态 always @(posedge clk or posedge reset) begin if (reset) begin enable_frm <= 0; enable_whiten_out <= 0; enable_crc_out <= 0; end else begin if (start_tx) begin // 启用FRM模块,开始数据传输 enable_frm <= 1; // 控制WHITEN模块,根据enable_whiten信号决定是否启用 if (enable_whiten) begin enable_whiten_out <= 1; // 启动whitening end else begin enable_whiten_out <= 0; // 关闭whitening end // 控制CRC模块,根据enable_crc信号决定是否启用 if (enable_crc) begin enable_crc_out <= 1; // 启动CRC end else begin enable_crc_out <= 0; // 关闭CRC end end else begin // 在非传输状态下禁用所有模块 enable_frm <= 0; enable_whiten_out <= 0; enable_crc_out <= 0; end end end endmodule
`timescale 1ns / 1ps module tb_PMU_Control; // 输入信号 reg clk; // 系统时钟 reg reset; // 系统复位 reg start_tx; // 开始数据传输信号 reg enable_whiten; // whitening启用信号 reg enable_crc; // CRC启用信号 // 输出信号 wire enable_frm; // FRM启用信号 wire enable_whiten_out; // WHITEN启用信号 wire enable_crc_out; // CRC启用信号 // 实例化PMU_Control模块 PMU_Control uut ( .clk(clk), .reset(reset), .start_tx(start_tx), .enable_whiten(enable_whiten), .enable_crc(enable_crc), .enable_frm(enable_frm), .enable_whiten_out(enable_whiten_out), .enable_crc_out(enable_crc_out) ); // 生成时钟信号 always begin #5 clk = ~clk; // 每5ns反转一次时钟 end // 初始化信号 initial begin // 初始化所有信号 clk = 0; reset = 0; start_tx = 0; enable_whiten = 0; enable_crc = 0; // 复位过程 reset = 1; // 给定复位信号 #20; // 增加复位时间,确保系统完全复位 reset = 0; // 取消复位信号 #10; // 稍作等待 // 启动数据传输测试 start_tx = 1; // 激活start_tx信号 enable_whiten = 1; // 启用whitening enable_crc = 1; // 启用CRC #40; // 增加足够的时间以观察信号变化 // 禁用whitening并发送数据 enable_whiten = 0; #20; // 稍作等待 // 禁用所有模块 start_tx = 0; #20; // 稍作等待 // 结束仿真 $stop; end // 打印波形 initial begin $dumpfile("testbench.vcd"); // 设置波形输出文件 $dumpvars(0, tb_PMU_Control); // 输出所有变量的波形 end endmodule
RTL图

但是我不知道为什么这个行为仿真是正确的,但是功能仿真和时序仿真却是错误的。