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的幂次,且需覆盖完整信号周期,才能得到准确的有效值结果。
相关推荐
ZPC82109 天前
docker 镜像备份
人工智能·算法·fpga开发·机器人
ZPC82109 天前
docker 使用GUI ROS2
人工智能·算法·fpga开发·机器人
tiantianuser9 天前
RDMA设计53:构建RoCE v2 高速数据传输系统板级测试平台2
fpga开发·rdma·高速传输·cmac·roce v2
博览鸿蒙9 天前
FPGA 和 IC,哪个前景更好?怎么选?
fpga开发
FPGA_小田老师10 天前
xilinx原语:ISERDESE2原语详解(串并转换器)
fpga开发·iserdese2·原语·串并转换
tiantianuser10 天前
RDMA设计50: 如何验证网络嗅探功能?
网络·fpga开发·rdma·高速传输·cmac·roce v2
Lzy金壳bing10 天前
基于Vivado平台对Xilinx-7K325t FPGA芯片进行程序在线更新升级
fpga开发·vivado·xilinx
unicrom_深圳市由你创科技10 天前
医疗设备专用图像处理板卡定制
图像处理·人工智能·fpga开发
tiantianuser10 天前
RDMA设计52:构建RoCE v2 高速数据传输系统板级测试平台
fpga开发·rdma·高速传输·cmac·roce v2
luoganttcc10 天前
Taalas 将人工智能模型蚀刻到晶体管上,以提升推理能力
人工智能·fpga开发