axi-dma的使用方式

xilinx官网axi-dma介绍
一、认识axi-dma的接口
在这里插入图片描述
先来认识下 AXI DMA 模块
此模块用到了三种总线,

AXI4-Lite 用于对寄存器进行配置,

AXI4 Memory Map 用于与内存交互,在此模块中又分立出了 AXI4 Memory Map Read 和 AXI4 Memory Map Write 两个接口,又分别叫做 M_AXI_MM2S 和 M_AXI_S2MM,一个是读一个是写,这里要搞清楚,不能混淆。

AXI4 Stream 接口用于对外设的读写,其中 AXI4 Stream Master(MM2S)用于对外设写, AXI4-Stream Slave(S2MM)用于对外设读。

另外还支持Scatter/Gather 功能,但本实验不再讲述,留待用户研究。(MM2S 表示 Memory Map to Stream, S2MM 表示 Stream to Memory Map)。
AXI Memory Map 数据宽度支持 32, 64, 128, 256, 512, 1024bits
AXI Stream 数据宽度支持 8, 16, 32, 64, 128, 256, 512, 1024bits

在vivado中视图
在这里插入图片描述
接口的分类
S_AXI_LITE是ARM配置DMA寄存器的接口;
S2MM和MM2S表示数据的方向,
MM2S :memory map to stream,用于对外设写;
S2MM:stream to memory map ,用于对外设读;
AXI存储器一侧的接口,AXIS是FPGA一侧的接口;

在这里插入图片描述
在这里插入图片描述

a.不使能scatter gather和miro DMA,使用简单模式,前者可以配置多个地址,一次开启多次传输。width of buffer length register这个是指接收或发送的最长长度,14位最大就是16384,实际上在函数中判断是16383,该参数设置过长, XAxiDma_SimpleTransfer函数就会返回一个错误。

b.address width是32位,就是对应到DDR3上,一次操作是32bit。read channel 和write channel很不好记,要理解DMA工作时是独立于CPU的,DMA读写都是指对DDR3的操作,由于我的应用是从底层产生数据存到FIFO中,等DMA来读取,因此只需要开启写DDR3通道即可。

c.max burst size,突发传输长度。突发的意思,就是传送一次地址,取多个数据的长度。这一点不好理解:当CPU通过AXI lite写DMA寄存器开启DMA接收后,DMA的tready拉高,开始传输数据,每接收到突发长度后,拉低一次tready,把数据写到DDR3中,写完之后再拉高再接收数据。

d.allow unaligned transfers。地址对齐,这个很重要,发送和接收通道都有,不开启,你发送和接收都必须要从4byte对齐的位置开始,必须从0x00,0x04,0x08等位置发送或接收,否则DMA不会正常工作。

读写通道的判断标准:一切读写操作都是指针对于DDR的操作,所以
写通道:S_AXI_S2MM、 M_AXIS_S2MM
读通道:M_AXI_M2SS 、M_AXIS_M2SS

mm表示memory mapped,即内存映射,代表AXI_FULL协议,对应PS端的AXI接口

s表示stream,代码AXI_STREAM协议

AXIS中的S表示Stream

1、接口分析:
(1)、M_AXI_MM2S:DMA的读通道,从DDR中读取数据。受Enable Read Channel控制,表现为M_AXI_MM2S。

(2)、M_AXI_S2MM:DMA的写通道,将数据写入DDR中。受Enable Write Channel控制,表现为M_AXI_S2MM。

(3)、M_AXIS_MM2S:DMA将数据发送到具有stream接口IP。

(4)、S_AXIS_S2MM:DMA将数据从具有Stream接口的IP中将数据读入。

(5)、mm2s_introut:DMA将数据从DDR的映射单元中读出,然后将数据发送到具有Stream接口的IP完成信号。

(6)、s2mm_introut:DMA将数据从具有stream接口的IP中读入,并写入到内存映射单元的完成中断信号。

说明:第一个字母(M S )代表主从关系,这里是对axi-dma进行配置,所以主从关系也是针对于axi-dma来说的。而dma只会有以下操作
fifo 往dma写数据 S_AXIS-S2MM
dma往fifo 写数据 M_AXIS_MM2S
dma从ddr读数据 M_AXI_MM2S
dma往ddr写数据 M_AXI_S2MM

AXI 和AXIS标示 是axi-full协议,还是axi-stream协议

S2MM表示是stream类型转为memory map
MM2S表示是memory 类型转为stream

参考链接
参考

Xilinx的Zynq平台中,AXI-DMA(Advanced eXtensible Interface Direct Memory Access)用于实现高效的数据传输,特别是在FPGA可编程逻辑(PL)与处理系统(PS)之间。它允许外设直接访问内存,而无需CPU介入,从而显著提升数据吞吐量和系统性能。以下是关于AXI-DMA使用方法及配置指南。 ### 配置硬件设计 1. **在Vivado中配置AXI-DMA IP核** -Xilinx Vivado工具中添加AXI-DMA IP核,并根据应用需求配置其参数,例如: - 数据宽度(Data Width) - 支持的通道数量(S2MM/MM2S通道) - 中断支持 -AXI-DMA连接到PS端的HP接口或ACE接口,确保其能够访问DDR内存。 2. **生成比特流并导出到SDK/Petalinux** - 完成硬件设计后,生成比特流并导出到Xilinx SDK或Petalinux环境,以便进行软件驱动开发和系统集成。 ### 在Petalinux中加载AXI-DMA驱动 1. **确认内核是否支持AXI-DMA** - Linux内核提供了对Xilinx AXI-DMA的支持,通常包含在`xilinx_dma.c`驱动中。 - 在Petalinux工程中,可以通过`petalinux-config`启用相关驱动选项: ``` Device Drivers ---> [*] Staging drivers ---> <*> Xilinx DMA Engine support ``` 2. **编译并部署内核模块** - 使用`petalinux-build`命令重新构建镜像,确保AXI-DMA驱动被正确编译进内核或作为模块加载。 - 部署生成的镜像到目标设备,并启动系统。 3. **加载驱动模块** - 如果AXI-DMA驱动被编译为模块,使用以下命令加载驱动: ```bash modprobe xilinx_dma ``` - 系统会自动识别硬件中的AXI-DMA实例,并注册对应的DMA通道[^1]。 ### 用户空间程序与AXX-DMA交互 1. **使用Xilinx提供的用户空间库** - Xilinx AXI-DMA项目提供了一个用户空间接口库,允许应用程序通过标准文件操作(如`open()`, `read()`, `write()`)与DMA设备通信。 - 可通过以下方式打开DMA设备节点: ```c int fd = open("/dev/xdma0_c2h_0", O_RDWR); if (fd < 0) { perror("Failed to open device"); return -1; } ``` 2. **执行零拷贝数据传输** - 利用`mmap()`将DMA缓冲区映射到用户空间,避免额外的数据复制开销: ```c void *buf = mmap(NULL, buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (buf == MAP_FAILED) { perror("mmap failed"); close(fd); return -1; } ``` - 读写操作可以直接作用于映射后的内存地址,实现高速数据传输[^2]。 3. **中断处理与同步机制** - AXI-DMA支持中断通知机制,用户程序可通过`poll()`或`select()`等待DMA传输完成事件。 - 示例代码如下: ```c struct pollfd fds = { .fd = fd, .events = POLLIN }; int ret = poll(&fds, 1, -1); // Wait indefinitely for an event if (ret > 0 && (fds.revents & POLLIN)) { printf("DMA transfer completed\n"); } ``` ### 调试与验证 - 使用`dmesg`命令查看内核日志,确认DMA驱动是否成功加载并检测到硬件: ``` [ 5.123456] xilinx-dma fe003000.dma: Xilinx AXI DMA Engine Driver Probed ``` - 使用`ls /dev/xdma*`列出所有可用的DMA设备节点,确保设备树描述符已正确配置。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值