我正在寻找一种将一些数据从我用 C 语言编写的软件应用程序发送到 Zynq 的 AXI-Stream 接口的方法。就像是
open(/dev/axistream);
send_data(data);
我在 Arm 部分上运行 Linux,现在我想将它连接到可编程逻辑部分。
在 zynq 设备上,Cortex-A9 处理器和 FPGA 之间的通信是使用 AXI 协议完成的。FPGA 和 CPU ( Zynq TRM )之间可以使用三种类型的端口进行通信:
根据您的问题,我可以理解,在您的情况下,CPU 是通信的主人。您将需要使用通用 axi 主端口。您不能将 AXI4 流接口连接到 AXI 互连。您需要将 AXI4 Streaming 转换为 AXI。根据您的性能需求,AXI DMA ip core ( AXI DMA IP core ) 可能是一个很好的解决方案。
如果您想从软件的角度使用“open(/dev/)”进行通信,您将需要一个 Linux 设备驱动程序。如果您使用 DMA 内核,您的通信通常如下所示:
您的 DMA 内核的寄存器集将通过您自己的 linux 设备驱动程序进行内存映射和访问。出于调试目的,我建议使用mmap访问寄存器并快速验证硬件的操作。一旦你选择了 linux 内核设备驱动程序,我建议你阅读这本书: Linux Device Drivers 3the edition
高效数据传输的最佳选择是使用支持 DMA 的 PS-PL 通信。在 PL 中实现 DMA 控制器(例如 AXI CDMA)后,您可以将其连接到 AXI4-Stream IP,然后连接到所需的 IP 内核。如果您不打算建立一个通用框架,您可以使用 mmap() 系统调用访问 DDR 内存中启用 DMA 的部分。这是一个将数据从用户空间传输到实现环回的 IP 核的模板。 https://github.com/h-nasiri/Zynq-Linux-DMA Zynq AXI CDMA
AXI CDMA 使用处理系统 HP 从端口来获得对 DDR 系统内存的读/写访问。还有一个基于 Linux 操作系统的应用软件,它使用 mmap() 来初始化 DMA 内核,然后进行数据传输。您可以轻松地将 AXI4-Stream 互连添加到 AXI CDMA 并连接
如果我理解正确,您想使用 DMA 引擎将来自 PS 的数据 DMA 到 PL。在这种情况下,您需要在 Linux 中编写一个驱动程序,该驱动程序将使用 AXI DMA 引擎驱动程序,或者从用户空间配置 DMA 引擎。
那是你要找的吗?