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
相关产品推荐
相关产品推荐

