1. DMA Controller Core
具有 Avalon 接口的DMA Control Core执行批量数据传输,从源地址范围读取数据并将数据写入不同的地址范围。 Avalon 内存映射 (Avalon-MM) 主机外设(如 CPU)可以将内存传输任务交给DMA控制器。 当DMA控制器执行内存传输时,主机可以自由地并行执行其他任务。
典型的 DMA 事务处理如下:
- CPU通过写入控制端口来为DMA控制器准备事务。
- CPU启用DMA控制器,然后DMA控制器开始传输数据,无需CPU的额外干预。 DMA的主机读端口从读地址读取数据,该地址可以是存储器或外设。 主机写端口将数据写入目标地址,该地址也可以是存储器或外设。 浅FIFO在读端口和写端口之间缓冲数据,默认深度为2。
- 当传输指定数量的字节(固定长度事务)或发送方或接收方发出数据包结束信号(可变长度事务)时,DMA 事务结束。 在事务结束时,DMA 控制器会生成中断请求 (IRQ)。
- 在事务期间或之后,CPU 可以通过检查 DMA 控制器的状态寄存器来确定事务是否正在进行,或者事务是否结束(以及如何结束)。
设置DMA事务:
Avalon-MM主机外设通过控制端口写入寄存器来设置和启动DMA事务:
- 读取(源)地址位置;
- 写入(目标)地址位置;
- 各个传输的大小:字节(8 位)、半字(16 位)、字(32 位)、双字(64 位)或四字(128 位);
- 事务结束时启用中断;
- 使源或目标能够通过数据包结束信号结束 DMA 事务;
- 指定源和目标是内存还是外设;
然后主机外设在控制寄存器中设置一个位以启动 DMA 事务。
1.1 DMA Controller Intel FPGA IP
1.1.1 DMA Parameters
Transfer size
Width of the DMA length register(1-32)(bits)指定DMA事务长度寄存器的最小宽度,该宽度可以在1到32之间。DMA length register决定DMA事务中可能的最大传输次数。
Burst transactions
当Enable burst transfers(启用突发传输)打开时,DMA控制器在其主机读取和写入端口上执行突发事务。 参数maxinum burst size(最大突发大小)确定事务中允许的最大突发大小。
在突发模式下,事务的长度不得长于配置的最大突发大小。 否则,该事务必须作为多个事务来执行。
FIFO Depth
参数Data transfer FIFO depth(数据传输FIFO深度)指定用于数据传输的FIFO缓冲区的深度。建议将FIFO缓冲区的深度设置为至少是连接到读取主机端口的代理接口最大读取延迟的两倍。 深度太低会降低传输吞吐量。
FIFO implementation
该选项决定主机读端口和写端口之间 FIFO 缓冲区的实现。 选择从寄存器构建 FIFO 以使用每个存储位使用一个寄存器来实现 FIFO。 当 DMA 控制器的数据宽度很大时,此选项对逻辑利用率有很大影响。 请参阅高级选项部分。 默认情况下,FIFO 实现使用嵌入式内存块。默认情况下,FIFO实施使用嵌入式内存块。
1.1.2 Advanced
选择DMA控制器硬件支持的传输数据宽度,禁用不必要的传输宽度可减少DMA控制器内核消耗的片上逻辑资源数量:byte、halfword(2 bytes)、word(4 bytes)、doubleword(8 bytes)、quadword(16 bytes)
1.2 DMAC寄存器表
status register
状态寄存器由指示 DMA 控制器内部状况的各个位组成。 状态寄存器可以随时读取。 读取状态寄存器不会改变其值。
readaddress Register
读地址寄存器指定 DMA 事务中要读取的第一个位置。 读地址寄存器宽度在系统生成时确定,可以寻址读取端口的全部范围。
writeaddress Register
写地址寄存器指定 DMA 事务中要写入的第一个位置。 写地址寄存器宽度在系统生成时确定,可以寻址读取端口的全部范围。
length Register
长度寄存器指定从读端口传输到写端口的字节数。 长度寄存器以字节为单位指定。 例如,对于字传输,该值必须是4的倍数;对于半字传输,该值必须是 2 的倍数。
当每个数据值被写主机端口写入时,长度寄存器递减。 当长度达到 0 时,LEN 位被置位。 长度寄存器不会递减到 0 以下。
control Register
控制寄存器由控制 DMA 内部操作的各个位组成。 控制寄存器的值可以随时读取。 控制寄存器位确定 DMA 事务的哪些条件(如果有)导致事务结束和中断请求。
DMA 事务的数据宽度由 BYTE、HW、WORD、DOUBLEWORD 和 QUADWORD 位指定。 一次只能设置这些位中的一位。 如果设置了多个位,则 DMA 控制器行为未定义。 传输的宽度由读取和写入的两个代理中较窄的一个决定。 例如,从 16 位闪存读取并写入 32 位片上存储器的 DMA 事务需要半字传输。 在这种情况下,HW 必须设置为 1,BYTE、WORD、DOUBLEWORD 和 QUADWORD 必须设置为 0。
1.3 中断行为
DMA 控制器有一个 IRQ 输出,当状态寄存器的 DONE 位等于 1 并且控制寄存器的 I_EN 位等于 1 时,该输出被置位。写入状态寄存器会清除 DONE 位并确认 IRQ。 主机外设可以读取状态寄存器并通过检查 LEN、REOP 和 WEOP 位来确定 DMA 事务如何完成。
2.Scatter-Gather DMA core
SG-DMA 控制器内核将非连续内存传输并合并到连续地址空间,反之亦然。SGDMA Controller Core实现两个组件(内存到内存、数据流到内存、内存到数据流)之间的高速数据传输,如下图中FPGA的SG-DMA Core从流组件(Streaming Component)读取数据并将数据写入外部存储器。
2.1 SCATTER-Gather DMA Controller Intel FPGA IP
2.2 SGDMAC寄存器表
SG-DMA控制器内核有三个寄存器可从Avalon-MM接口访问:status、control和next_descriptor_pointer。
control/status寄存器有一个32位接口,不能被数据宽度比其本身更窄的主机访问,因此始终使用至少32位宽的主机访问寄存器。
control register
建议仅在控制寄存器中的RUN位被清除后才读取状态寄存器。
status寄存器表
DMA描述符结构
2.3 与DMAC对比
DMA控制器一次只能对一项传输进行排队,使用DMA控制器内核时,CPU必须等待传输完成才能将新描述符写入DMA代理端口,并且无法链接到非连续内存的传输,对于小型传输来说CPU开销很大,从而降低了整体系统性能。 SG-DMA 控制器内核从内存中读取一系列描述所需事务的描述符,并执行所有传输,而无需CPU的额外干预。
还没有评论,来说两句吧...