如何在包络信号的最大点(第一个和最后一个)触发?

问题描述 投票:0回答:1

我写了这段代码,但第一个触发是正确的,但我不知道为什么第二个和第三个触发出现在第二个以及最后一个峰值之前,最后一个触发(也作为第二个最大值)不做!

`timescale 1ns / 1ps

module peak (
    input clk,
    input signed [15:0] envelope,
    output reg trigger
    );

reg signed [15:0] prev_envelope;
reg signed [15:0] derivative;
reg peak_detected = 0;
parameter signed [15:0] threshold = 3000;

always @(clk) begin
    derivative <= envelope - prev_envelope;

    if (derivative < 0 && envelope > threshold && !peak_detected) begin
        trigger <= 1;
        peak_detected <= 1;
    end else begin
        trigger <= 0;
        if (envelope < threshold) begin
            peak_detected <= 0; // Reset peak_detected when envelope drops below threshold
        end
    end

    prev_envelope <= envelope;
end

endmodule

image

verilog
1个回答
0
投票

问题在于他的声明

derivative <= envelope - prev_envelope;

从 16 位数字减去 16 位数字,然后将结果存储在 16 位数字中。
结果(导数)需要是 17 位才能支持被减变量的完整域。

这里有位增长的参考:FPGA算术中的位增长

没有测试平台无法确定是否存在其他问题。

© www.soinside.com 2019 - 2024. All rights reserved.