

























DMA(Direct memory access,内存直接存取),属于 Vectored I/O 方式,也是下沉运算的一种实现。
Scatter-gather DMA 与 Block DMA(即普通DMA) 方式不同,
Block DMA: 一次只传输一块物理上连续的数据,完成后中断,主机收到中断后再行下一块物理上连续的数据传输。
Scatter-gather DMA: 使用一个链表描述物理上不连续的存储空间,然后把链表首地址告诉DMA master。DMA master在传输完一块物理连续的数据后,会直接根据链表继续传输下一块物理上连续的数据,直到传输完毕后才发起中断。
很显然,scatter-gather DMA方式比block DMA方式效率高,但需要硬件软件都实现。
下图是某IP厂商的SG-DMA IP

应用层的写法,代码来自Vectored_I/O-wikipedia:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/uio.h>
int main(int argc, char *argv[])
{
const char buf1[] = "Hello, ";
const char buf2[] = "Wikipedia ";
const char buf3[] = "Community!\n";
struct iovec bufs[] = {
{ .iov_base = (void *)buf1, .iov_len = strlen(buf1) },
{ .iov_base = (void *)buf2, .iov_len = strlen(buf2) },
{ .iov_base = (void *)buf3, .iov_len = strlen(buf3) },
};
if (writev(STDOUT_FILENO, bufs, sizeof(bufs) / sizeof(bufs[0])) == -1)
{
perror("writev()");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
支持 内存到内存,外设到内存,内存到外设 四种。
框图

STM32上的DMA矩阵。

内存到外设模式的内部工作图

需要配置的参数有:
AN4031 手册有更多的说明。
Block DMA 支持传输物理地址连续的内存,只需要告诉DMA控制器三元参数描述符(数据长度,源地址,目的地址)

FPGA IP 设计和造芯片有一些相同的步骤。我们拿拥有居多开源资源的FPGA资料来看再好不过了。
https://docs.amd.com/r/en-US/pg034-axi-cdma/Overview

像赛灵思的IP,控制器支持普通DMA和SGDMA两种,可以非常清晰地看到,SGDMA不同于普通DMA的接口。
该IP对于SGDMA的描述:
The AXI CDMA can optionally include Scatter/Gather (SG) functionality for off-loading CPU management tasks to hardware automation. The Scatter/Gather Engine fetches and updates CDMA control transfer descriptors from system memory through the dedicated AXI4 Scatter Gather Master interface. The SG engine provides internal descriptor queuing, which allows descriptor prefetch and processing in parallel with ongoing CDMA data transfer operations.
可以看到关键字样是off-loading卸载CPU的运算压力。SGDMA引擎提供了内部描述符队列。支持预读取和并行处理。
像在赛灵思的FPGA设计中,SGDMA会比普通DMA多了一个M_AXI_SG总线,用于读取SGDMA的描述符。

我们可以看一下世界两大FPGA巨头的描述符
赛灵思FPGA的寄存器

英特尔旗下FPGA的寄存器
https://www.intel.com/content/www/us/en/docs/programmable/683130/24-1/dma-descriptors-06781.html

需要DMA控制器四元参数描述符(大小,源地址,目的地址,下一链的地址)
如果您需要设计FPGA程序,可以参考这篇:https://www.cnblogs.com/ruidongwu/p/15046127.html
--------蓝天上的云_转载请注明出处.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。