Verilog实现对采样信号有效值(RMS)的计算

有效值(RMS)的计算原理

有效值的数学定义是:对于连续信号,有效值是信号瞬时值的平方在一个周期内的平均值的平方根;对于离散采样信号,计算公式为:
RMS=1N∑i=0N−1xi2RMS = \sqrt{\frac{1}{N} \sum_{i=0}^{N-1} x_i^2}RMS=N1i=0∑N−1xi2

其中:

  • NNN 是一个周期内的采样点数
  • xix_ixi 是第 iii 个采样点的数值

在FPGA/Verilog实现中,通常分三步:

  1. 对采样值进行平方运算
  2. 对平方结果进行累加并求平均
  3. 对平均值进行开方运算

Verilog实现代码

以下是一个可综合的有效值计算模块,包含平方、累加平均、开方核心逻辑,适合FPGA实现:

verilog 复制代码
module rms_calculator #(
    parameter DATA_WIDTH = 16,    // 采样数据位宽
    parameter N = 1024            // 一个周期内的采样点数(2的幂次便于除法)
)(
    input clk,                    // 系统时钟
    input rst_n,                  // 低电平复位
    input [DATA_WIDTH-1:0] din,   // 输入采样数据(有符号)
    input din_valid,              // 输入数据有效标志
    output reg [DATA_WIDTH-1:0] rms_out, // 有效值输出
    output reg rms_valid          // 输出有效标志
);

// 步骤1:对输入数据进行平方运算(有符号数处理)
reg signed [2*DATA_WIDTH-1:0] din_square;
reg signed [DATA_WIDTH-1:0] din_signed;

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        din_signed <= 'd0;
        din_square <= 'd0;
    end else if(din_valid) begin
        din_signed <= din;
        // 有符号数平方:先取绝对值再相乘,避免负数平方溢出
        din_square <= (din_signed >= 0) ? (din_signed * din_signed) : ((-din_signed) * (-din_signed));
    end
end

// 步骤2:累加平方值并求平均(N为2的幂次,用移位代替除法)
localparam ACC_WIDTH = 2*DATA_WIDTH + $clog2(N); // 累加器位宽,避免溢出
reg [ACC_WIDTH-1:0] acc;
reg [$clog2(N)-1:0] cnt; // 采样点数计数器

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        acc <= 'd0;
        cnt <= 'd0;
        rms_valid <= 1'b0;
    end else if(din_valid) begin
        acc <= acc + din_square;
        cnt <= cnt + 1'b1;
        rms_valid <= 1'b0;
        
        // 累计N个点后,求平均值(移位)并准备开方
        if(cnt == N-1) begin
            acc <= acc >> $clog2(N); // 除以N,等价于右移log2(N)位
            cnt <= 'd0;
            rms_valid <= 1'b1; // 平均值计算完成,触发开方
        end
    end
end

// 步骤3:开方运算(牛顿迭代法,适合硬件实现)
reg [DATA_WIDTH-1:0] sqrt_result;
reg [ACC_WIDTH-1:0] sqrt_temp;
reg [3:0] sqrt_state; // 迭代状态机

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        sqrt_result <= 'd0;
        sqrt_temp <= 'd0;
        sqrt_state <= 'd0;
        rms_out <= 'd0;
    end else if(rms_valid) begin
        case(sqrt_state)
            0: begin
                sqrt_temp <= acc; // 加载平均值
                sqrt_result <= 'd0;
                sqrt_state <= sqrt_state + 1'b1;
            end
            1,2,3,4,5,6,7,8: begin // 8次迭代(足够收敛)
                sqrt_result <= (sqrt_result + sqrt_temp / sqrt_result) >> 1;
                sqrt_temp <= sqrt_result;
                sqrt_state <= sqrt_state + 1'b1;
            end
            9: begin
                rms_out <= sqrt_result; // 迭代完成,输出有效值
                sqrt_state <= 'd0;
            end
        endcase
    end
end

endmodule

代码关键部分解释

  1. 有符号数平方处理

    • 先将输入的有符号采样值取绝对值,再进行平方运算,避免负数平方导致的溢出问题。
    • 平方后的位宽扩展为 2*DATA_WIDTH,保证数据不丢失。
  2. 累加与平均

    • 累加器位宽设计为 2*DATA_WIDTH + $clog2(N),避免累加N个平方值时溢出。
    • 利用"移位代替除法"(仅当N为2的幂次时适用),提升硬件运算效率。
  3. 开方运算

    • 采用牛顿迭代法实现开方,这是硬件中最常用的开方算法,收敛速度快、资源占用少。
    • 通过8次迭代即可达到足够的精度(可根据实际需求调整迭代次数)。

模块使用说明

  1. 参数配置

    • DATA_WIDTH:根据你的采样精度设置(如12/16位)。
    • N:设置为一个周期内的采样点数,建议为2的幂次(如256、512、1024),简化除法运算。
  2. 输入输出

    • 输入:clk(系统时钟)、rst_n(复位)、din(采样数据)、din_valid(数据有效标志)。
    • 输出:rms_out(计算得到的有效值)、rms_valid(输出有效标志)。
  3. 前置条件

    • 确保采样时钟与系统时钟同步,采样率满足奈奎斯特采样定理。
    • 采样点数N需覆盖完整的信号周期,否则计算结果会有误差。

总结

  1. Verilog实现有效值计算的核心步骤是:平方运算 → 累加平均 → 开方运算,其中累加平均优先用移位代替除法以提升硬件效率。
  2. 有符号采样值需先取绝对值再平方,避免溢出;开方采用牛顿迭代法,通过多次迭代保证精度。
  3. 采样点数N建议设为2的幂次,且需覆盖完整信号周期,才能得到准确的有效值结果。
相关推荐
Riwuarua3 小时前
从近似0基础开始FPGA开发 -- part.14 JESD204协议、IP核与嵌入式初始化
fpga开发·jesd
第二层皮-合肥18 小时前
Vivado 自动生成的 AXI‑Lite 从机 IP 的操作步骤
fpga开发
blue_ice .20 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
薛定谔的bug~1 天前
【vivado】10G ibert 工程
fpga开发
博览鸿蒙1 天前
新手怎么挑一块靠谱的FPGA开发板?
fpga开发·fpga·fpga开发板
威嵌神州1 天前
VxWorks6.9 BSP 适配:飞腾 D2000/FT2000/4 平台、驱动开发
驱动开发·嵌入式硬件·fpga开发·系统架构
FPGA小迷弟2 天前
【无标题】
fpga开发·dsp开发·fpga·sdr·无线电
szxinmai主板定制专家2 天前
【工控实战】RK3568/RK3588 8路隔离CAN/CANFD完整解决方案|多路总线并行通信、车载/工控量产落地
人工智能·fpga开发·zynq·mpsoc·半导体设备
郝旭帅电子设计团队2 天前
Xilinx FPGA的BANK标号命令规则
fpga开发·郝旭帅电子设计团队·郝旭帅
威嵌神州2 天前
天脉 3 开发环境与 BSP 适配:IDE license、驱动开发、飞腾平台
ide·驱动开发·嵌入式硬件·fpga开发