如何从软件工具向Zynq的AXI-Stream发送数据?

时间:2015-06-02 13:25:42

标签: linux arm fpga xilinx zynq

我正在寻找一种方法,将我用C编写的软件应用程序中的一些数据发送到Zynq的AXI-Stream接口。像

这样的东西
open(/dev/axistream);
send_data(data);

我在Arm部分运行Linux,现在我想将它连接到可编程逻辑部分。

3 个答案:

答案 0 :(得分:6)

在zynq设备上,Cortex-A9处理器和FPGA之间的通信使用AXI协议完成。有三种类型的端口可用于FPGA和CPU之间的通信(Zynq TRM):

  1. 通用AXI端口:2x Master(从CPU到FPGA)和2x Slave端口(从FPGA到CPU)。这些端口连接到处理系统的中央互连,可用于向/从DDR存储器或片上存储器(OCM)传输数据。
  2. 高性能AXI端口:4x从端口(从FPGA到CPU)提供对DDR或OCM的高带宽访问
  3. ACP(加速器一致性端口):从端口(从FPGA到CPU)高端输出端口直接连接到监听控制单元(SCU)。 SCU维护缓存一致性(省略缓存刷新/无效的需要)。
  4. 从您的问题中,我会理解,在您的情况下,CPU是通信的主人。您将需要使用通用axi主端口。您无法将AXI4流接口连接到AXI互连。您需要将AXI4 Streaming转换为AXI。根据您的性能需求,AXI DMA ip核心(AXI DMA IP core)可能是一个很好的解决方案。

    如果您想使用"从软件的角度进行通信,请打开(/ dev /)"你需要一个Linux设备驱动程序。如果您使用DMA核心,您的通信通常如下所示:

    1. 您将配置DMA内核以从某个内存地址获取数据
    2. 启动DMA核心
    3. DMA内核将获取数据并将其提供给IP块的AXI4流接口
    4. 您的IP块将对数据执行某些操作并发送回内存(使用DMA)或执行其他操作(发送到外部接口,......)
    5. 您的DMA内核的寄存器集将被内存映射,并可通过您自己的Linux设备驱动程序访问。出于调试目的,我建议使用mmap来访问寄存器并快速验证硬件的操作。一旦你去了linux内核设备驱动程序,我建议你阅读这本书:Linux Device Drivers 3the edition

答案 1 :(得分:1)

高效数据传输的最佳选择是使用支持DMA的PS-PL通信。在PL内部实现DMA控制器(例如AXI CDMA)后,您可以将其连接到AXI4-Stream IP,然后连接到所需的IP内核。 如果您不打算设置通用框架,则可以使用mmap()系统调用访问支持DMA的DDR内存部分。 这是一个将数据从用户空间传输到IP核的模板,其中实现了环回。 https://github.com/h-nasiri/Zynq-Linux-DMA Zynq AXI CDMA

AXI CDMA使用处理系统HP从端口来获得DDR系统内存的读/写访问权限。还有一个基于Linux OS的应用软件,它使用mmap()初始化DMA内核,然后进行数据传输。 您可以轻松地将AXI4-Stream互连添加到AXI CDMA并连接

答案 2 :(得分:0)

如果我理解正确,您希望使用DMA引擎将数据从PS传输到PL。在这种情况下,您需要在Linux中编写一个驱动程序,它将使用AXI DMA引擎驱动程序,或者从用户空间配置DMA引擎。

这就是你要找的东西吗?