我写了这段代码,但第一个触发是正确的,但我不知道为什么第二个和第三个触发出现在第二个以及最后一个峰值之前,最后一个触发(也作为第二个最大值)不做!
`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
问题在于他的声明
derivative <= envelope - prev_envelope;
从 16 位数字减去 16 位数字,然后将结果存储在 16 位数字中。
结果(导数)需要是 17 位才能支持被减变量的完整域。
这里有位增长的参考:FPGA算术中的位增长
没有测试平台无法确定是否存在其他问题。