大家好、
我使用 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);