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的幂次,且需覆盖完整信号周期,才能得到准确的有效值结果。
相关推荐
简简单单做算法3 小时前
基于FPGA的图像形态学腐蚀处理Verilog开发与开发板硬件测试
fpga开发·腐蚀·形态学处理·硬件调试
hong_fpgaer5 小时前
XILINX ZYNQ FPGA PS端DMA握手流程
fpga开发·vivado
北城笑笑5 小时前
FPGA 50 ,Xilinx Vivado 2020 版本安装流程,以及常见问题解析,附中文翻译( Vivado 2020 版本安装教程 )
fpga开发·fpga
GateWorld20 小时前
主流FPGA厂商对SystemVerilog的支持现状
fpga开发·system verilog
Smart-佀2 天前
FPGA入门:CAN总线原理与Verilog代码详解
单片机·嵌入式硬件·物联网·算法·fpga开发
丁劲犇2 天前
B205mini FPGA工程粗浅解析:从架构到Trae开发介绍
ai·fpga开发·架构·ise·trae·b210·b205mini
应用市场2 天前
无线充电器原理与电路设计详解——从电磁感应到完整实现
3d·fpga开发
ALINX技术博客2 天前
【ALINX选型】AMD Kintex UltraScale+ 系列 FPGA 开发板速选
fpga开发
碎碎思2 天前
从 HLS 到 RTL:高层次综合在 FPGA 设计中的价值与局限
fpga开发