You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现正弦波正负边沿(符号变化)触发电路?

正弦波过零触发电路的修正方案

原代码核心问题

  • 在always @(*)组合逻辑块中用非阻塞赋值更新prev_value,会导致prev_value与当前输入Interf_cut_scaled完全同步,无法保存上一个时钟周期的输入值,根本检测不到符号变化。
  • prev_value未声明为signed类型,与有符号输入比较时会出现逻辑错误。
  • 零值场景的分支处理冗余,可合并到条件判断中。

修正后的代码

采用时序逻辑寄存历史值+组合逻辑检测变化的标准方案,确保正确捕捉信号的符号跳变:

`timescale 1ns / 1ps

module trigger(
    input clk,                  // 添加时钟信号,用于寄存历史状态
    input signed [15:0] Interf_cut_scaled,
    output reg trigger
);

reg signed [15:0] prev_value;  // 声明为有符号类型,保证符号位正确参与比较

// 时序逻辑:每个时钟周期寄存当前输入,保存上一拍的值
always @(posedge clk) begin
    prev_value <= Interf_cut_scaled;
end

// 组合逻辑:检测符号变化,生成触发信号
always @(*) begin
    // 匹配上升沿过零(当前正,之前非正)或下降沿过零(当前负,之前非负)
    if ((Interf_cut_scaled > 0 && prev_value <= 0) || (Interf_cut_scaled < 0 && prev_value >= 0)) begin
        trigger = 1'b1;
    end else begin
        trigger = 1'b0;
    end
end

endmodule

关键优化点

  1. 时钟依赖:必须用时钟触发的时序逻辑寄存历史值,这是数字电路中保存状态的标准方式。
  2. 类型匹配:prev_value与输入信号同类型(signed),避免无符号/有符号比较的逻辑错误。
  3. 逻辑简化:零值场景已包含在prev_value <=0或prev_value >=0的条件中,无需额外分支。

可选优化:消除毛刺

如果需要触发信号仅保持一个时钟周期,可将触发逻辑移至时序块,避免组合逻辑毛刺:

// 时序逻辑生成触发信号,消除毛刺
always @(posedge clk) begin
    if ((Interf_cut_scaled > 0 && prev_value <= 0) || (Interf_cut_scaled < 0 && prev_value >= 0)) begin
        trigger <= 1'b1;
    end else begin
        trigger <= 1'b0;
    end
end

内容的提问来源于stack exchange,提问作者Parsa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 12:10:01