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

FSM中DAC_counter_2不递增?DAC寄存器代码无法实现预期延迟问题求助

问题根因

  • 计数器更新逻辑错误:DAC_counter_2属于寄存器变量,你仅在复位逻辑的时序块中对其赋值,正常工作时的累加操作全部放在组合逻辑块中实现,会生成非预期锁存,还会触发组合逻辑环路:单个时钟沿触发后,组合逻辑会在同一仿真时间步内反复触发累加,直接将DAC_counter_2从0加到10,波形上看不到中间计数过程,看起来就像没有递增。
  • 组合逻辑分支不全:状态8'd2的else分支没有指定nxt_state的取值,会导致nxt_state生成锁存,状态跳转逻辑异常。
  • 敏感列表缺失:第二个组合逻辑块用到了DAC_reg变量,但敏感列表未包含该变量,会导致仿真和实际综合结果不一致。

修复方案

把计数器更新、状态更新、DAC寄存器移位这些时序操作全部移到时序逻辑块中,组合逻辑只负责判断状态跳转条件、给出组合输出,修改后的参考代码如下:

module dac_card
(   output reg DAC_SCLK,
    output reg SYNC,
    output reg SDIN,
    input MHZ_50_CLK,
    input RST,
    output reg [7:0] DAC_counter_1,
    output reg [7:0] DAC_counter_2
    );
    
    reg [7:0] pst_state, nxt_state;
    reg [23:0] DAC_reg_shift;
    reg cnt2_en, cnt2_rst;

    // 时序逻辑:更新状态、计数器、移位寄存器
    always @(posedge MHZ_50_CLK)
    begin
        if (RST)
        begin
            SYNC <= 1'b1;
            DAC_SCLK <= 1'b0;
            SDIN <=1'b0;
            DAC_counter_1 <= 8'd0;
            DAC_counter_2 <= 8'd0;
            pst_state <= 8'd0;
            DAC_reg_shift <= 24'hEEEEEE;
        end
        else
        begin
            pst_state <= nxt_state;
            DAC_counter_1 <= DAC_counter_1 + 1'b1;
            // 更新DAC_counter_2
            if (cnt2_rst) begin
                DAC_counter_2 <= 8'd0;
            end else if (cnt2_en) begin
                DAC_counter_2 <= DAC_counter_2 + 1'b1;
            end
            // 更新移位寄存器
            if (pst_state == 8'd0 && DAC_counter_2 != 8'd24) begin
                SDIN <= DAC_reg_shift[23];
                DAC_reg_shift <= DAC_reg_shift << 1;
            end
        end
    end
    
    // 组合逻辑:状态跳转、输出控制
    always @(*)
    begin
        // 默认值避免生成锁存
        nxt_state = pst_state;
        cnt2_en = 1'b0;
        cnt2_rst = 1'b0;
        SYNC = 1'b1;
        DAC_SCLK = 1'b0;

        case (pst_state)
            8'd0: begin
                SYNC = 1'b0;
                if (DAC_counter_2 == 8'd24) begin
                    cnt2_rst = 1'b1;
                    nxt_state = 8'd2;
                end else begin
                    cnt2_en = 1'b1;
                    DAC_SCLK = 1'b1;
                    nxt_state = 8'd1;
                end
            end
            8'd1: begin
                DAC_SCLK = 1'b0;
                nxt_state = 8'd0;
            end
            8'd2: begin
                SYNC = 1'b0;
                if (DAC_counter_2 == 8'd10) begin
                    cnt2_rst = 1'b1;
                    nxt_state = 8'd3;
                end else begin
                    cnt2_en = 1'b1;
                end                                   
            end
            8'd3: begin
                nxt_state = 8'd0;
            end
            default: begin
                nxt_state = 8'd0;
            end
        endcase
    end
endmodule

测试bench代码无需修改,重新仿真即可看到DAC_counter_2在状态2时正常累加10个周期,实现预期延迟。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:18:00