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

Spartan 6 FPGA与FT601 USB3.0 FIFO接口FSM状态更新异常排查

Spartan 6 XC6SLX FPGA 对接FT601 USB3.0 FIFO FSM状态更新异常排查与解决

核心问题定位

在FT601多通道协议的DATA TRANSFER阶段,仅当FT6_RXF_N=1(缓冲区满)时能正常切换到BUS TURN(type2)状态;但本地无数据(DataAvailable=0)时,RequestData已拉低(示波器可观测),但NextState未更新为STATE_BUS_TURN_AROUND_TWO,FT6_WR_N也未拉高。设计采用FT6_Clk上升沿计算NextState,下降沿更新CurrentState的双沿触发结构。

可能原因与排查步骤

1. 异步信号未同步导致采样错误

如果DataAvailable来自FPGA内部其他时钟域,未进行同步处理会导致亚稳态,使得FT6_Clk上升沿采样时信号不稳定,无法触发状态转移条件。

  • 排查:检查DataAvailable的来源时钟域,对比FT6_Clk的时钟频率与相位关系。
  • 解决:对DataAvailable做两级寄存器同步到FT6_Clk域:
    reg DataAvailable_sync1, DataAvailable_sync2;
    always @(posedge FT6_Clk or negedge rst_n) begin
        if(!rst_n) begin
            DataAvailable_sync1 <= 1'b0;
            DataAvailable_sync2 <= 1'b0;
        end else begin
            DataAvailable_sync1 <= DataAvailable;
            DataAvailable_sync2 <= DataAvailable_sync1;
        end
    end
    // 状态机中使用同步后的DataAvailable_sync2替代原信号
    

2. 状态转移条件逻辑漏洞

检查STATE_DATA_OUTPUT下的转移逻辑,是否存在优先级覆盖或逻辑表达式错误:

  • 常见问题:
    • 用&&替代||,导致两个触发条件需同时满足才会转移;
    • DataAvailable的判断被FT6_RXF_N的条件覆盖(比如用if-else if结构时,FT6_RXF_N的优先级过高,而DataAvailable=0时FT6_RXF_N仍为0,导致分支不执行)。
  • 排查:单独提取状态转移逻辑,用仿真验证DataAvailable=0时NextState的赋值结果。
  • 解决:合并触发条件,确保两种场景都能触发状态转移:
    STATE_DATA_OUTPUT: begin
        if(FT6_RXF_N == 1'b1 || DataAvailable_sync2 == 1'b0) begin
            NextState <= STATE_BUS_TURN_AROUND_TWO;
            RequestData <= 1'b0;
        end else begin
            // 持续数据传输逻辑
            NextState <= STATE_DATA_OUTPUT;
            RequestData <= 1'b1;
        end
    end
    

3. 双沿触发的时序约束问题

设计采用上升沿计算NextState、下降沿更新CurrentState的结构,若NextState的组合逻辑延迟过大,会导致FT6_Clk下降沿时NextState未稳定,CurrentState无法正确更新。

  • 排查:使用Xilinx ISE的Timing Analyzer分析DataAvailable_sync2到NextState寄存器的建立/保持时间是否违例。
  • 解决:
    • 给FT6_Clk添加明确的时序约束:
      create_clock -name FT6_Clk -period 10 [get_ports FT6_Clk]
      
    • 优化组合逻辑路径,比如将复杂判断拆分为多级寄存器或调整逻辑顺序。

4. FT6_WR_N控制逻辑与状态机的联动问题

若FT6_WR_N直接由CurrentState控制,当CurrentState未更新时,FT6_WR_N自然不会变化。需确认:

  • FT6_WR_N的赋值是否与状态转移同步;
  • 是否存在隐含条件(比如最后一组数据的传输完成标志未被正确识别)导致状态转移被阻塞。

验证建议

  1. 仿真验证:搭建Testbench,单独模拟DataAvailable=0的场景,观察NextState、CurrentState及FT6_WR_N的波形变化,定位逻辑错误点。
  2. 硬件调试:在FPGA中添加ILA逻辑分析仪,抓取FT6_Clk、CurrentState、NextState、DataAvailable_sync2、FT6_RXF_N的实时波形,对比触发条件与状态转移的时序关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:33:32