针对您在使用FX3 GPIF DMA时遇到的水印标志延迟和重复计数问题,以下分步骤分析并提供优化建议:
DECIDE_0状态判断水印时,可能已进入下一个数据传输周期,导致额外写入状态。Burst Size * Watermark ≤ 缓冲区总大小。// 修改后的状态跳转逻辑
WRITE_0:
Drive Data + Increment Address
IF (FIFO未满)
GOTO WRITE_0;
ELSE
GOTO DECIDE_0;
DECIDE_0:
IF (WATERMARK_FLAG == 1)
GOTO STOP;
ELSE
GOTO WRITE_0;WRITE_0末尾主动检查FIFO状态,提前预判是否需要停止,减少延迟影响。// 将水印值增大至3-4,补偿延迟
CyU3PGpifSocketConfigure(
CY_FX_VID_THREAD_0, // Socket ID
CY_U3P_PIB_SOCKET_0, // Socket 0
CyFalse, // 非生产者(Consumer)
3, // Watermark = 3 Bursts
...);Burst Size * (Watermark + 1)的整数倍,避免边界问题。CyU3PGpifClockConfig()的同步模式,降低时钟域切换延迟。CyU3PGpifSMStateConfig(CY_FX_VID_WRITE_0_STATE,
CY_U3P_GPIF_ACTION_STATE,
16, // Repeat Count = 16 Bursts
...);FLAG信号(如DMA_READY),由FX3主动通知FPGA停止发送。CyU3PGpifRegistersRead()实时读取CY_U3P_PIB_GPIF_STATUS寄存器,观察水印标志的实际触发时机。GPIF_DATA[31:0]、GPIF_CTRL[7:0]和WATERMARK_FLAG的时序关系,确认延迟周期数。通过增大水印值补偿延迟、优化状态机跳转逻辑、校准Repeat Count与FPGA突发传输长度,可有效消除额外写入周期。建议将水印值设为3-4,并在GPIF状态机的DECIDE_0状态前增加预判逻辑,确保FPGA及时停止数据传输。
举报
更多回帖