USB论坛
直播中

fansz

9年用户 1315经验值
擅长:制造/封装
私信 关注
[问答]

请问如何处理GPIF DMA标志延迟和“重复计数”值?

我正在开发一个 UVC 应用程序,它使用 32 位总线 GPIF 状态机来管理从 FPGA 向 USB 主机发送数据。 我们目前已将其设置为 FPGA 将向 FX3 写入与精确缓冲区大小相等的字节数。 我们希望更新这一点,以便 FPGA 一直写入直到它看到 WATERMARK DMA 标志置位,然后它停止发送数据。
目前FX3 FW设置插槽水印如下。 我们发现,如果值为 2,则在主写入状态 (WRITE_0) 之后需要 1 个额外的写入状态 (图中的 DECIDE_0)。
CyU3PGpifSocketConfigure(    CY_FX_VID_THREAD_0,         /* Thread to configure */    CY_FX_VIDEO_PROD_SOCKET_0,  /* Socket to associate with this thread */    2                          ,/* Watermark value in 4-byte words. */    CyFalse,                    /* Whether watermark set */    1                           /* Burst size (X * 2 words). Affects how often flags are updated */);为了更新 FX3 并允许 FPGA 在看到 WATERMARK 标志置位时停止,我们需要考虑 2 个因素:
(1)写入操作使缓冲区内容达到设定的水印级别和 WATERMARK 标志外部置位之间存在延迟。 由于上述值为 2,并且需要 GPIF 中 1 个额外的写入状态,我认为这个值是 1,但我不确定。
(2) FPGA 需要 WATERMARK 标志来提前声明一定数量的周期,以便 FX3 缓冲区有足够的空间容纳所有正在传输的数据。 该值取决于 FX3 和 FPGA 之间的步骤。
为了确定上面(1)的值,我们查看了 AN65974 表 4,其中列出了达到水印级别时以及实际外部断言时的延迟。 我们正在查看“Thread_n_DMA_Watermark”,当我们查看跨越水印级别的写入需要多长时间才能导致外部 WATERMARK 标志发生变化时,它显示“取决于水印级别”。 我们如何确定这个值? 缓冲区写入超过水印级别和 WATERMARK 标志置位之间的周期延迟是多少?
为了解释上述(1)和(2),我们还需要将这些状态纳入我们的状态机,以便仍然捕获所有飞行中数据。 我们可以将 GPIF 状态的“重复计数”用于此目的吗? 我的理解是,这个值要求状态重复一定次数,直到评估任何退出转换。 这样,如果我们确定 (1) 是 X 且 (2) 是 Y,则重复计数将为 X + Y?我附上了一张如何定义写入状态的图片。

回帖(1)

陈韵瑄

2025-5-26 18:22:35

针对您在使用FX3 GPIF DMA时遇到的水印标志延迟和重复计数问题,以下分步骤分析并提供优化建议:




1. 水印标志(WATERMARK)延迟的根本原因



  • GPIF与DMA的异步性:DMA水印标志的更新需要经过内部总线同步到GPIF接口,通常存在2-3个GPIF时钟周期的延迟。

  • 状态机设计缺陷:在DECIDE_0状态判断水印时,可能已进入下一个数据传输周期,导致额外写入状态。




2. 关键参数解析



  • Socket Watermark值

    水印值 = 2 表示当DMA缓冲区剩余空间 ≤ 2个Burst时触发标志。需确保Burst Size * Watermark ≤ 缓冲区总大小。

  • Repeat Count

    该值决定状态机循环次数,需与FPGA数据突发传输长度对齐。例如,若每次突发传输16个32-bit字,则Repeat Count设为16。




3. 优化水印检测逻辑


状态机优化(伪代码)


// 修改后的状态跳转逻辑
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
    ...);



4. DMA和GPIF配置建议



  • DMA缓冲区大小

    确保缓冲区大小是Burst Size * (Watermark + 1)的整数倍,避免边界问题。

  • GPIF时钟同步

    在GPIF配置中启用CyU3PGpifClockConfig()的同步模式,降低时钟域切换延迟。

  • Repeat Count校准

    根据FPGA实际突发传输长度设置Repeat Count,例如:
    CyU3PGpifSMStateConfig(CY_FX_VID_WRITE_0_STATE, 
    CY_U3P_GPIF_ACTION_STATE,
    16,    // Repeat Count = 16 Bursts
    ...);




5. FPGA端逻辑调整



  • 提前检测水印:在FPGA发送最后一个有效数据包后,预留1-2个时钟周期等待水印置位。

  • 握手信号增强:在GPIF接口添加FLAG信号(如DMA_READY),由FX3主动通知FPGA停止发送。




6. 调试与验证



  • 使用GPIIF Registers监控状态

    通过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及时停止数据传输。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分