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.

如何实现 C6748 EMIF 异步 + EDMA 的组合

大家好,我需要用C6748 EMIF 16bit宽度 从FPGA拿数据,需要40MB/S 带宽

CS用4 BANK

以下是我配置代码

void PSCInit(void)
{
    // 使能 GPIO 模块
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);

    // 使能 EMIFA 模块
    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_EMIFA, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
}

void EMIFAInit(void)
{
    // 配置 EMIFA 相关复用引脚
    //AD7606PinMuxSetup();

    // 配置数据总线 16bit
    EMIFAAsyncDevDataBusWidthSelect(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_4, EMIFA_DATA_BUSWITTH_16BIT);

    // 选择 Normal 模式
    EMIFAAsyncDevOpModeSelect(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_4, EMIFA_ASYNC_INTERFACE_NORMAL_MODE);

    // 禁止WAIT引脚
    EMIFAExtendedWaitConfig(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_4, EMIFA_EXTENDED_WAIT_DISABLE);

    // 配置 W_SETUP/R_SETUP W_STROBE/R_STROBE W_HOLD/R_HOLD   TA 等参数
    EMIFAWaitTimingConfig(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_4, EMIFA_ASYNC_WAITTIME_CONFIG(1, 2 , 1, 1, 2, 1, 0 ));
}

main

{    PSCInit();
    EMIFAInit();

while(1)

{emif_rbuffer[0] = ((short *)SOC_EMIFA_CS4_ADDR)[0];

}

}

通过逻辑分析仪看 RD 和CS4的波形,如下:

RD和CS 频率是3.2MHz, x 16bit = 6.4MB/s,不足以满足要求

我看到可以使用 EDMA的方式来对EMIF进行操作,总带宽可以到40MB/S

请问有相关的例程可以参考吗?谢谢

  • 我这里有个EMIFA的性能总结对比,你写的B是bit还是byte? 如果是bit还是可以达到的。

  • 大 B , byte
    不知 C6748 用EDMA EMIF可以跑到 40MByte/s 吗?
  • 基于性能考虑,使用EDMA搬移并将异步时延全配置为最低是可以达到的,但是太不划算了,EDMA搬移EMIF数据就将你的互联交换总线带宽占用了将近50%,会严重影响你的其他子系统性能的.
    建议upp,甚至同步EMIF将时延调为最低的方式都能好很多.
  • 你好, 嗯嗯,谢谢你的建议。我这个板子上 EMIF的CLK 没有引出,所以只能选用异步模式。

    我想请教一下, EMIF无论是 同步还是异步,加上EDMA,总带宽也就40MB/S, 与DDR内存的带宽相比,这个带宽应该占用的比较少吧,不知你说的 50% 是怎么引起的呢?

    因为在我的理解里,如果用DMA方式传输,EMIF 以最高40MB/S速率 访问总线,而总线带宽怎么也有几百MB/S吧, 假设EMIF不停的往DDR内存里传输数据,内存带宽裕量还有很多吧?

  • user5233520 说:
    我这个板子上 EMIF的CLK 没有引出,所以只能选用异步模式。

    你都已经有板子了,直接测一下速度不是更好?

  • 没找到TI关于647x的Switched Central Resource (SCR)的数据位宽和频率的具体描述,我们以32bit位宽(DDR都是16位的,除了向外设搬移数据要用32位,其他场景32位貌似没用武之地)和CPU同频速率来估算,总带宽确实很高.能达到456M * 4 == 1824 MBps;

    但是,上面的假设仅基于CPU或EDMA能以那么高的频率和数据位宽访问,实际上是达不到的,就EMIF的异步模式来说,肯定是达不到的:
    你的EMIF异步最大工作在16bit的1-1-1异步时序,这个时序相对CPU来说实际上是3-3-3,而EDMA工作在1/3 CPU频率,我们统一考虑其时延为3,即EDMA一次访问最少占用3个总线时钟,而对访问你的EMIF异步FPGA来说,至少要9个时钟,这样效率就只有1/9了,在加上位宽之用了1/2,效率再折半即1/18,但是总线你是完整占用了的;
    亦即:假设你将EDMA优先级设置为最高不不加流控,使用EDMA各种高技术手段去搬EMIF的异步FPGA口,最大能达到1824/18MBps,大概就是100MBps,扣除实际上你应该有读写转换等其额外的等待,我估算的是80MBps,你用到40MBps可不就把总线一半的带宽给用了嘛.

    以上的理解基于在一次总线访问中,master对SCR的占用时间为整个访问时间段,没考虑TI可能用了更高级的总线技术,比如可以请求和数据回复完全是分开并异步的.好像C66的TeraNet上就用到了这样的技术,所以C66核的外部存储空间管理上除了EMC还多了个XMC,但是在某篇介绍总线结构的文章上看到有提CFG的总线任然是32位的简单总线.
  • 十分感谢你的回答,说的十分详细具体。
    考虑性能带宽的占用,可能用UPP会好很多,或者使用更高级的DSP。
  • SCR不是点对点的总线。只是slave端口不冲突,可以同时并发。
  • Shine Zhang给出的测试里面EDMA搬移DDR能达到EDMA理论带宽的90%,是因为DDR2的实际有效带宽可以达到那么大,我查了下EVM上的DDR是支持DDR2 - 800的,意味着其在800MTps的速率下,理论速率可以达到800M * 16/8 == 1600MBps, 实际测试使用的时候应该是降频了的. 目测使用的133*2M,带宽能达到266 * 16/2 == 532,刚好和EDMA的最高速率匹配.
  • 考虑性能带宽的占用,可能用UPP会好很多,或者使用更高级的DSP

    如果说到占带宽,uPP就不占带宽了?

    前面的文档有看过了吗?下面的波形图理解了吗?

  • 意思是: EDMA把EMIF的数据搬到LL2,这个时候DSP还是可以访问DDR的吗? 因为EDMA搬移的时候使用的是DSP system的slave端口,而DSP访问DDR是DSP的master端口访问的DDR. 是这个意思吧.
    但是如果他是EDMA往DDR搬,同时DSP也访问DDR,或往LL2搬但是DSP也访问LL2,这样就会竞争了吧.

    @_@ C66的那个总线桥我看得一直是是而非的.
  • Bin Lee4 说:
    意思是: EDMA把EMIF的数据搬到LL2,这个时候DSP还是可以访问DDR的吗? 因为EDMA搬移的时候使用的是DSP system的slave端口,而DSP访问DDR是DSP的master端口访问的DDR. 是这个意思吧.

    是的。

    Bin Lee4 说:
    但是如果他是EDMA往DDR搬,同时DSP也访问DDR,或往LL2搬但是DSP也访问LL2,这样就会竞争了吧.

    是的,这时就要按优先级排队了。

  • 你好,我想参考一下Shine Zhang给的EDMA的搬移数据测试例程,可否分享一下,谢谢!