我目前正在编写AXI4主机,它也应该支持AXI4 Lite(AXI4L)。
我的AXI4主机正在从16位接口接收数据。这是在Xilinx Spartan 6 FPGA上,我计划使用EDK AXI4互连IP,其最小WDATA宽度为32位。
起初我想使用窄突发,即AWSIZE = x“01”(传输中的2个字节)。但是,我发现Xilinx的“AXI Reference Guide UG761状态”支持了狭窄的爆发,但不建议这样做。“应该支持未对齐的交易。
这让我思考。假设我开始一个未对齐的爆发:
并执行以下操作:
AX (32-bit word #0: send hi16)
XB (32-bit word #1: send lo16)
其中A,B是我的16位字,以未对齐(2字节对齐)地址开始。 X表示WSTRB对指示的16位置为无效。
现在,如果这只是针对AXI4,我可能不会太在意这个用例,因为AXI4外设需要使用WSTRB信号。但是,AXI参考指南UG761规定“[AXI4L] Slaves接口可以选择忽略WSTRB(假设所有字节都有效)。”
我读了here很多(但不是全部;而且没有列表?)Xilinx AXI4L外设确实选择忽略WSTRB。
答案 0 :(得分:2)
你的例子不是一个狭窄的爆发,应该有效。
不建议使用窄脉冲的原因是它会产生次优性能。窄突发和数据实现都在区域内成本,并且不推荐恕我直言。然而,DRE具有最小的带宽成本,而窄突发则具有。如果您的AXI端口是100MHz 32位,那么如果在50%的时间内使用16位的窄突发,则最大吞吐量为3.2GB,而最大吞吐量则减少到2.4GB(32位X 50MHz + 16位X 50Mhz)。此外,我不确定AXI-Lite是否支持窄突发或数据实现。
你的例子有两个主要缺陷。首先,它需要3个数据节拍才能传输32位,这比窄突发更糟糕(我不认为AXI足够聪明,可以取消WSTRB为0的最后一次突发)。其次,一次不能突发超过2个16位,如果要传输大量数据,这将会影响AXI基础设施的性能。
处理此问题的最佳方法是将16位连接在一起,在块中形成32位。然后你缓冲这32位并在你有足够的时候将它们爆发。这是AXI高性能的方法。
但是,如果您接收16位数据,那么使用AXI-Stream似乎会更好,它支持16位但没有地址概念。您可以使用Xilinx的IP内核将AXI-Stream映射到AXI-4。 AXI-Datamover或AXI-DMA都可以做到这一点。两者都做同样的事实(实际上,AXI-DMA包括数据转换器),但AXI-DMA通过AXI-Lite接口控制,而Datamover则通过附加AXI-Streams控制。
最后需要注意的是,Xilinx内核从不需要窄突发或DRE。如果你需要AXI-DMA中的DRE,它是由AXI-DMA内核而不是AXI互连完成的。此外,这些内核是清晰的源代码,因此您可以轻松查看它们的运行方式。