7

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

open(/dev/axistream);
send_data(data);

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

4

3 回答 3

6

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

  1. 通用 AXI 端口:2 个主端口(从 CPU 到 FPGA)和 2 个从端口(从 FPGA 到 CPU)。这些端口连接到处理系统的中央互连,可用于向/从 DDR 存储器或片上存储器 (OCM) 传输数据。
  2. 高性能 AXI 端口:4 个从端口(从 FPGA 到 CPU)提供对 DDR 或 OCM 的高带宽访问
  3. ACP(加速器一致性端口):从端口(从 FPGA 到 CPU)高吞吐量端口,直接连接到探听控制单元 (SCU)。SCU 保持缓存一致性(无需缓存刷新/无效)。

根据您的问题,我可以理解,在您的情况下,CPU 是通信的主人。您将需要使用通用 axi 主端口。您不能将 AXI4 流接口连接到 AXI 互连。您需要将 AXI4 Streaming 转换为 AXI。根据您的性能需求,AXI DMA ip core ( AXI DMA IP core ) 可能是一个很好的解决方案。

如果您想从软件的角度使用“open(/dev/)”进行通信,您将需要一个 Linux 设备驱动程序。如果您使用 DMA 内核,您的通信通常如下所示:

  1. 您将配置 DMA 内核以从某个内存地址获取数据
  2. 启动 DMA 内核
  3. DMA 内核将获取数据并将其馈送到 IP 块的 AXI4 流接口
  4. 您的 IP 块将对数据执行一些操作并发送回内存(使用 DMA)或执行其他操作(发送到外部接口,...)

您的 DMA 内核的寄存器集将通过您自己的 linux 设备驱动程序进行内存映射和访问。出于调试目的,我建议使用mmap访问寄存器并快速验证硬件的操作。一旦你选择了 linux 内核设备驱动程序,我建议你阅读这本书: Linux Device Drivers 3the edition

于 2015-06-24T19:20:46.467 回答
1

高效数据传输的最佳选择是使用支持 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 并连接

于 2017-01-26T11:35:58.747 回答
0

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

那是你要找的吗?

于 2016-07-19T18:32:28.227 回答