免责声明:本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。
读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。
本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。
若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。
前言
本章继续介绍AXI DMA的Scatter/Gather Mode的使用。
一、Typical System Interconnect
1. AXI DMA 核心的连接
- AXI DMA 核心 通过 AXI Interconnect 连接到用户系统的其他模块。这意味着 AXI DMA 是通过 AXI 总线与系统中的其他硬件组件(如处理器、内存等)进行通信的。
- 典型的 MicroBlaze™ 处理器配置:该配置展示了一个典型的嵌入式处理器(MicroBlaze)与 AXI DMA 核心如何连接。MicroBlaze 是 Xilinx 的一种软处理器,通常用于 FPGA 中的系统中。
2. AXI DMA 与处理器的通信
- AXI4-Lite 接口:MicroBlaze 通过 AXI4-Lite 接口访问 AXI DMA 核心。AXI4-Lite 是一种简化版的 AXI 协议,用于低带宽、简单控制的应用。在这里,AXI4-Lite 接口主要用于控制和配置 DMA 操作(如启动 DMA、设置传输长度等)。
3. Scatter/Gather 引擎
- Scatter/Gather 引擎 是一个集成的功能模块,负责从系统内存中获取 Buffer Descriptors(缓冲区描述符)。这些描述符定义了数据传输的目标地址、传输长度等信息。
- Buffer Descriptors 是一组数据结构,用于描述 DMA 传输的块,指示如何进行数据传输。
- 引擎根据这些描述符来协调数据从 AXI 接口传输到 DDR 内存或从 DDR 内存传输到其他外设。
4. 主数据传输
- 引擎将缓冲区描述符传递给 DMA 核心后,DMA 核心执行 主数据传输,即将数据从 AXI IP(如 Ethernet、存储器等)传输到 DDR(动态随机访问存储器),或者从 DDR 中读取数据并传输到其他硬件。
5. 可选的控制和状态流
- 控制和状态流 是可选的功能模块,用于与与数据传输相关的其他信息(例如校验和卸载控制/状态)进行通信。
- 这些流提供了数据包相关的信息,通常在 Ethernet 等协议栈中使用。例如,校验和卸载(checksum offload)可以通过控制流来指示是否进行校验和计算。
- 这些控制和状态流允许 DMA 在与 IP(如 Ethernet)进行数据传输时,也能传递和接收一些元数据或控制信息。
6. 中断系统
- 双中断输出:AXI DMA 核心具有两个中断输出,这些中断可以用来通知系统不同的事件,如数据传输完成、传输错误等。
- 这些中断信号会路由到 系统中断控制器,从而触发相应的中断处理程序进行响应。中断可以用来实现高效的事件驱动机制,不必不断轮询 DMA 状态寄存器。
二、Scatter/Gather Mode
1. 描述符链(Descriptor Chain)
- 描述符链 是 AXI DMA 操作所需的内存数据结构,它包含了一系列的 DMA 操作。每个描述符包含一个指向下一个描述符的指针,形成一个链式结构。
- 描述符链中的 最后一个描述符 会指向链中的 第一个描述符,从而形成一个环形结构,确保 DMA 能够持续进行数据传输。
- 描述符的每个条目(descriptor)可能包含关于数据块传输的关键信息,如数据源地址、目标地址、传输长度、控制信息等。
2. Scatter Gather 操作
- Scatter Gather 操作允许一个数据包由多个描述符来描述。例如,数据包的头部(header)可以存储在内存中的一个位置,而有效负载(payload)可以存储在另一个位置。这使得软件能够灵活地管理内存中分散的数据块,提高吞吐量。
- 这种方式的一个典型用法是,存储数据包的不同部分(如头部和负载)时,通过不同的描述符分别访问不同的内存位置。
3. TXSOF 和 TXEOF
- TXSOF(Start of Frame)和 TXEOF(End of Frame)是描述符链中用于标识数据包开始和结束的标志位。
- 当 DMA 从描述符链中获取一个描述符,并且该描述符的 TXSOF 位被设置时,DMA 就会触发一个数据包的开始。
- 接下来,DMA 会依次处理链中的下一个描述符,直到找到一个 TXEOF 位被设置的描述符,此时数据包传输完成。
4. RXSOF 和 RXEOF(接收通道)
- 在 S2MM(接收通道) 中,数据包的接收过程也通过描述符链进行标识。
- 当数据包开始接收时,AXI DMA 会将描述符的 RXSOF 位设置为 1,表示该描述符关联的缓冲区包含数据包的开始部分。
- 如果接收到的数据包比当前描述符所指定的字节数更多,DMA 会继续使用下一个描述符中的缓冲区来存储接收数据包的其余部分,直到整个数据包接收完毕。
- 当接收到的数据包的 最后一部分 被存储完后,DMA 会在处理的描述符中设置 RXEOF=1,这表示该描述符关联的缓冲区包含数据包的结束部分。
5. 字节传输统计
- 每个描述符的状态字段会记录实际传输的字节数。软件可以通过遍历从 RXSOF 到 RXEOF 的描述符链来计算整个接收包的总字节数。
- 这意味着软件需要根据从 RXSOF 开始的描述符链,逐个检查描述符中的字节数,直到到达 RXEOF 描述符为止,从而得出整个数据包的总传输字节数。
6. 性能优化
- Scatter Gather 操作通过 连续获取下一个描述符 和 存储剩余数据 的方式来优化 DMA 性能。DMA 通过这种机制高效地处理多个数据块的传输,减少了中间缓冲和延迟,提升了吞吐量。
7. 操作启动
- Scatter Gather 操作的启动需要配置 控制寄存器 和 描述符指针,确保 DMA 可以从正确的地址和长度开始处理数据。
三、A DMA operation for the MM2S channel is set up and started by using the following sequence:
-
启动描述符:
- 向当前描述符寄存器写入起始描述符的指针。
- 如果AXI DMA的地址空间大于32位(即支持大于4GB的地址空间),还需要编程当前描述符的高32位地址。
-
启动MM2S通道:
- 通过设置
MM2S_DMACR.RS = 1
来启动MM2S(Memory to Stream)通道。 - 此时Halted bit(
DMASR.Halted
)应解除,表示MM2S通道已开始运行。
- 通过设置
-
启用中断(可选):
- 如果需要中断处理,设置
MM2S_DMACR.IOC_IrqEn
和MM2S_DMACR.Err_IrqEn
为1,启用中断。 IOC_IrqEn
为完成中断,Err_IrqEn
为错误中断。
- 如果需要中断处理,设置
-
设置尾描述符:
- 向尾描述符寄存器写入有效指针。
- 如果AXI DMA的地址空间大于32位,同样需要编程尾描述符的高32位。
-
启动DMA:
- 写入尾描述符寄存器后,DMA开始从内存中获取描述符。
- 如果配置了多通道,描述符的获取在S2MM(Stream to Memory)通道接收到数据包后开始。
-
数据处理:
- 获取到描述符后,DMA将从内存中读取数据,并将数据输出到MM2S流通道。
四、示例仿真
1.打开Scatter Gather模式并打开示例工程
2.通过AXI-LITE进行配置
往0x08寄存器中写入0x00向当前描述符寄存器写入起始描述符指针;
往0x00寄存器中写入0x00027001启动MM2S通道,启用中断(传输2次后产生中断);
往0x10寄存器中写入0x0040向尾描述符寄存器写入有效指针。
3.AXI SG接口获取描述符信息(1)
8个基本描述符,0x00000040该值提供指向描述符链中下一个描述符的指针;
缓冲地址为0x00000000;
0x0c000080传输128byte,这个描述符的TXSOF=1
和TXEOF=1
都可以同时设置,表示该描述符既是数据包的开始也是结束.
3.AXI SG接口获取描述符信息(2)
0x00000080该值提供指向描述符链中下一个描述符的指针;
BUFFER_ADDRESS:0x00000080该值提供了指向要从系统内存传输到流的数据缓冲区
0x0c000080传输128byte
4.从AXI MM2S接口取数据
从缓冲区域中取数据,INRC模式,突发长度被限制到15+1,每次传输32bit,因此128byte被拆分成2次突发。
1.
2.