This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320C6678:EMIF16连接 FPGA -速度非常慢

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/571581/tms320c6678-emif16-to-connect-fpga---very-slow

器件型号:TMS320C6678

大家好、

我使用 EMIF16端口连接到包含16位宽 FIFO 和一些寄存器的 FPGA。 但我无法达到我为此设计的数据吞吐量、实际上、我的速度比我在配置寄存器中设置的速度慢4到5倍:

我将 EMIF16_ASINNC4_CONFIG_REG 设置为0x00000181 -> R_SETUP = 1、R_STROBE = 4、R_HOLD = 1、TA = 1 -> 7 EMIF 周期= 42个 CPU 周期。

现在、如果我测量访问 FIFO 所需的时间、则为~170个周期。 反复多次执行并不起作用、持续时间始终相同(完全相同、169个周期)。

我甚至使用了在旧论坛主题中找到的加速设置: *(uint32*) 0x20C00008 |= 0x8000000; //禁用未使用的内部 EMIF 功能

这将读取持续时间从~185个周期降低到169个周期-这不是我希望的改进。

如果我将 R_strobe 增加到5、则从该地址读取需要175个周期、因此如果"死区时间"是累加的、则需要6个周期。

提前感谢所有回复! 大家好、Stefan

我的测试代码:

#define EMIF16_CS5_STARTADESS    0x7C000000
#define EMIF16_CTRL_REG           0x7C000000
#define EMIF16_FIFO               0x7C000004
#define EMIF16_ASINNC4_CONFIG_REG  0x20C0001C

//                                 31 29 26    20 17  13      7 4 3 0
//                                  |  ||     |  |    |      | || ||
//                                  0000 0000 0000 0000 0000 0001 1000 0001

#define EMIF16_ASYNC_CONFIG_VALUE 0x00000181

[..]

   volatile uint16 * fifo_data;
   uint32 newvalue;

uint32_t t0、t1、t2、t3、tt;

 

   T0 = Timestamp_get32 ();
   newValue =* fifo_data;
   T1 = Timestamp_get32();
   newValue <<= 16;
   newValue |=* fifo_data;
   T2 = Timestamp_get32();
   T3 = Timestamp_get32();
   

   printf ("Emif16读取持续时间16/32位:%d/%d (tt=%d)"、t1-t0-tt、t2-t0-tt-tt、tt);



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已通知设计团队。 在平均时间内、您能否检查以下主题以了解想法:
    e2e.ti.com/.../569698

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stefan、
    您是说 CS 和 WE/RE 时序与编程到配置寄存器中的值不匹配、还是说两次访问之间的时间比您预期的要长? 您在 POST 开始时提到了 EMIF 周期和 CPU 周期、但未指定 POST 中后面使用的标准。 访问169个 EMIF 周期还是 CPU 周期?
    虽然 EMIF 为控制信号的持续时间编程提供了很大的灵活性、但它不提供对两次访问之间的持续时间的任何控制。 这是存储器与 EMIF IP 之间在 TeraNet 上的内部传输的函数。 EMIF 未被设想为流数据接口、因此在芯片设计过程中不会优化传输时间。 您可以通过使用 EDMA 来缩短传输时间、但 EMIF 接口上的每次访问之间都会有一些不受控制的延迟。
    此致、
    Bill
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bill、您好、感谢您的回复!

    我说、两次访问之间的时间比我预期的要长。 或者更准确地说、DSP 在 emif16上完成读取(和写入)所需的时间比预期的要长。

    我在 POST 中稍后使用的"周期"的标准是 CPU 周期、因此完成读取操作需要 DSP 169个周期(而不是在给定控制寄存器设置的情况下需要36个周期)
    newValue =* fifo_data;
    测试代码。 因此、t1 - t0 = 169。

    这意味着、即使是单个16位读取也需要很长时间、而无需在循环中尝试执行此操作(但如果我执行此操作、结果是相同的)。
    大家好、Stefan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stefan、
    EMIF 访问之间的时间不是 EMIF 设置的函数。 它是数据从 CPU 移动到 EMIF 所需的时间、EMIF 启动传输的时间以及 EMIF 在访问完成后声明它已为下一个传输做好准备的时间的总和。 每次访问都会出现其中一些延迟。 其中一些取决于数据如何传输到 EMIF。 例如、如果您向 EMIF 写入32位值、它将转换为两个16位写入、并且它们之间的延迟很小。 如果您的程序对 EMIF 执行两次16位写入、它将在两次访问之间增加额外的延迟。 EDMA 还可以减少系统内部增加的延迟。 无论使用哪种方法、延迟都取决于 TeraNet 上正在移动的其他数据以及这些访问的优先级。 这些延迟无法轻松控制。 这就是为什么我们不将 EMIF 定义为一种在很短的时间内传输大型数据块的方法。
    此致、
    Bill