AXI DMA
1.AXI DMA 介绍
一般来说,计算机对内存数据进行处理的时候,需要从内存把数据读进寄存器,然后进行进一步的操作(比如运算处理)。但是有些数据并不需要运算处理这一类型的操作,只是单纯的移动数据,而把数据读进寄存器,然后再把数据从寄存器写进内存会消耗cpu资源,当需要读写大量数据的时候更是如此,DMA技术就很好地解决了这一问题。DMA,顾名思义,不占用cpu资源,从一个硬件存储区域把一部分连续的数据复制到另一个硬件存储区域。其中硬件包括系统总线上的硬件(内存),和外部总线上的硬件(磁盘,iis外设等)。
DMA硬件可以说是一个单纯为了进行数据移动而设计的处理器,传输模式跟cpu一样:
SIZE = TC * DSZ * TSZ
SIZE :传输的总数据量
TC :数据传输次数
DSZ :一个数据有多少个原子传输
TSZ :一个原子传输有多少字节
DMA的原子传输会占用系统总线资源:DMA虽然不会占用cpu资源,但是如果DMA的源跟目的都为内存的时候,由于内存位于系统总线上,DMA会占用总线资源,此时由于系统总线忙,cpu会由于得不到总线资源而无法进行跟外部的交流操作。如果DMA的源或目的为内存的时候,我们需要为其分配一块在物理上连续的内存。而不止是在虚拟地址看起来是连续的。平时cpu使用的时候,寻址会经过mmu(内存管理单元)进行虚拟地址到物理地址的转换,由虚拟地址到物理地址的转换后,对应的物理地址可能是不连续的,也可能是连续的。而DMA是不经过mmu直接对内存进行读写的,直接对物理地址进行操作。
使用DMA:当我们要使用到DMA的时候,需要把传输的源(物理地址)、目的(物理地址)、大小告诉DMA,然后启动DMA,就能进行数据移动了。那么什么时候DMA会结束呢,当DMA传输结束的时候会发出一个中断,我们可以在该中断处理程序内部做进一步的操作(如打印消息等)。
DW_axi_dmac 是一个高度可配置、高度可编程、高性能的多主控多通道 DMA 控制器,以 AXI 作为总线接口进行数据传输,支持 64 位宽地址空间。
2. DMA 架构
AHB/APB从机总线接口模块:通过外部 AHB/APB4 主机访问 DW_axi_dmac 的内部寄存器的读写控制逻辑。从机总线接口可以通过 DMAX_SLVIF_MODE 参数进行配置。
DMAX_SLVIF_MODE:用于从机接口的协议。AHB (0),APB4 (2)
- 根据子系统要求,可以选择AHB/APB4 从机接口。这些模块仅支持用于数据传输的 little-endian 方案。
- 从机总线接口可以配置为在与 DW_axi_dmac 内核时钟(dmac_core_cllock) 不同的时钟上运行,可以使用DMAX_SLVIF_CLOCK_MODE 参数进行配置。
- 如果 DMAX_SLVIF_CLOCK_MODE 参数设置为 1,则从机总线接口模块根据用于该接口的协议在 hclk/pclk 上运行,可以与DW_axi_dmac 内核时钟不同。DW_axi_dmac 设计中的Handshake Interface synchronization module负责这种情况下的时钟域交叉。
- 如果 DMAX_SLVIF_CLOCK_MODE 参数设置为 0,则从机总线接口模块在DW_axi_dmac 内核时钟上运行。
- DMAX_SLVIF_CLOCK_MODE:选择从接口时钟(AHB/APB4)和dma核时钟之间的关系。0:从机接口时钟与dma核时钟同步。1:从接口时钟与dma核时钟异步。
支持特性
- 独立的核、从机接口和主机接口时钟;
- 支持32个信道,最多32个通道,每个源和目标对一个通道,可在core Consultant中配置;
- 数据仅在一个方向上传输(每个信道是单向的);
- 最多两个AXI主机接口,可在core Consultant中配置;
- 用于多层支持的两个主机接口
- 多个AXI主机通过允许不同AXI互连上的外设直接连接来提高总线性能
- 支持不同AMBA layers上的不同ACLK
- 内存到内存、内存到外设、外设到内存,以及外设到外设DMA传输
- 单独的外部存储器接口(每个信道)将SRAM或基于寄存器文件的存储器连接到信道FIFO
- AMBA 3 AXI/AMBA 4 AXI兼容机主机接口
- AHB/APB4从机接口,用于对DMA控制器进行编程。
- AHB从机接口仅支持单次传输(hburst = 3’b000)
- AXI主机接口数据总线宽度高达512位(两个AXI主机接口均是),可在core Consultant中配置
- 可以静态或动态地为AXI主机接口选择Endian模式,可在core Consultant中配置
- Input pin可动态地选择endianness
- 独立控制主机接口上的链表访问的Endianness,可在core Consultant中配置
- 可选的标识寄存器,可在core Consultant中配置
- 通道锁定支持:支持在不同的传输层次上锁定主机总线接口的内部通道仲裁。
- DMA状态指示输出:idle/busy指示
- DMA保持功能
- 输出引脚指示DMA传输层次上的最后一次写入传输
- 多个级别上的DMA传输层次:DMA 传输分为事务、块和完整 DMA 传输级别
- 支持AXI未对齐传输
- 支持Context敏感的低功耗选项.
- 支持唯一ID特性,在具有唯一ID的AXI读/写通道上生成AXI读/写传输
通道BUFFER
- 每个通道对应一个FIFO.
- FIFO深度,可在 coreConsultant中配置.
- 自动packing/unpacking数据,以适应FIFO的宽度
通道控制
- 每个通道的传输类型可编程(内存到内存,内存到外设,外设到内存和外设到外设)
- 单个或多个DMA传输
- 每个通道可编程的多个传输大小
- 每个通道可编程的最大AMBA突发传输大小,可在 coreConsultant中配置
- 通道禁用而不丢失数据
- 通道暂停和恢复
- 可编程通道优先级
- 在不同的传输层次上锁定主机总线接口的内部通道仲裁
- 使用链表,连续地址,自动重新加载和影子寄存器方法的可编程多块传输,
- 链表的动态扩展
- 独立配置SRC/DST多块传输类型
- 多个状态机,每个通道SRC和DST都有一个
- 用于数据和LLI访问的分离状态机
- •控制信号,如缓存和保护,每个DMA块可编程:可编程传输长度(块长度)
- 错误状态寄存器,以便在错误事件期间进行调试
流控制:
- 在DMA传输级别的可编程流量控制
- 如果在DMA初始化之前就知道块传输的大小,那么DMA控制器就是DMA块传输级别的流控制器。
- 如果在DMA初始化之前不知道DMA块传输的大小,那么对于未定义长度(需求模式)的DMA块传输,源外设或目标外设都是流控制器。
握手接口
- 非内存外设的可编程软件和硬件握手接口
- 多达64个硬件握手接口/外设,可在coreConsultant中配置,
- 启用/禁用单个握手接口.
- 外设和通道之间的可编程映射;一次只激活一个外设的多外设到一个channel的映射
- 在软件握手模式的内存映射寄存器控制DMA传输
中断输出
- 组合和分离的中断输出
- 以下条件时的中断生成: DMA传输完成,块传输完成,单个或多个传输完成,错误条件,通道暂停或禁用,中断启用和屏蔽
总线接口
- 主机接口采用AMBA 3 AXI和AMBA 4 AXI协议,从机接口采用AHB、AXI4-Lite和APB3协议.
- 主机接口的数据总线宽度可达512位,可在coreConsultant中配置.主机接口上的Outstanding传输
- 在主机接口上设置每个通道的outstanding传输限制
- 可配置的AXI传输宽度
- 在同一主机接口上连接的不同通道的乱序传输
- 支持特定通道的传输总是按顺序启动。
- 主机接口上的增量和固定地址传输
- 源和目的数据传输地址,必须对齐到各自的传输宽度
- 从机接口的数据总线宽度为32/64位,可在coreConsultant中配置
- 从机接口的传输大小(宽度);必须与数据总线宽度相同
保护特性
- 所有通用寄存器的奇偶校验保护功能,以及接口级别的通道特定寄存器,通过奇偶校验执行数据完整性检查
- 纠错码(ECC)保护功能纠正单比特错误并检测双比特错误以防止数据损坏
- FIFO 存储器接口的ECC 保护功能
- UID内存接口的ECC保护特性
- AXI Master接口的ECC保护特性
- 适用于安全关键型应用的锁步功能,可在单粒子翻转 (SEU) 和极端 EMI/EMC 等不利工作条件下提高安全性和可靠性
-
不支持AXI3锁定传输(总线锁定),不支持AXI3模式下主机接口总线锁定,不支持wrap地址传输
术语
- 源外设–位于AXI 层上的设备,DW_axi_dmac 从中读取数据。然后 DW_axi_dmac 将数据存储在通道 FIFO 中。源外设与目标外设组合形成通道。
- 目标外设——DW_axi_dmac 将存储的数据从 FIFO 写入到的设备(数据之前是从源外设读取的)。
- 内存——总是为DMA传输做好准备的源或目标,不需要握手接口来与DW_axi_dmac交互。
- 通道——在一个配置的AXI层上的源外设和通过通道FIFO发生的同一或不同AXI层上的目标外设之间的读/写数据路径。如果源外设不是内存,则将源握手接口分配给通道。如果目标外设不是内存,则给通道分配一个目标握手接口。源和目标握手接口可以通过编程通道寄存器动态分配。
- 主机接口——DW_axi_dmac是AXI总线上的主机接口,它从源读取数据,并通过AXI总线将数据写入目标。可以有最多两个主机接口,这样最多两个独立的源和目标通道可以同时操作。每个通道都必须为主机接口进行仲裁。如果源外设和目标外设驻留在不同的AXI层上,则必须有多个主机接口。
- 从机接口——用于编写DW_axi_dmac的AHB/AXI4-Lite/APB3接口。从机接口可以与任何主机接口位于同一层,也可以位于单独的一层。
- 握手接口——一组符合协议的信号或软件寄存器,用于在DW_axi_dmac和源或目标外设之间执行握手。握手有助于控制在DW_axi_dmac和外设之间的单个传输或突发传输。该接口用于请求、确认和控制DW_axi_dmac传输。通道可以通过两种类型的握手接口之一接收请求:硬件或软件。
- 硬件握手接口——使用硬件信号来控制DW_axi_dmac和源或目标外设之间的单个传输或突发传输。硬件握手接口的简单用法是,当来自外设的中断线被绑定到硬件握手接口的“dma_req”输入时;忽略其他接口信号。
- 软件握手接口——使用软件寄存器来控制在DW_axi_dmac和源或目标外设之间的单个传输或突发传输。在这种模式下,外设的I/O上不需要特殊的DW_axi_dmac握手信号。这种模式对于将现有的外设连接到DW_axi_dmac而不修改它非常有用。
- 流量控制器—— (DW_axi_dmac或源或目标外设),决定DMA块传输的长度并终止传输的设备。如果在启用通道之前知道块的长度,那么应该将DW_axi_dmac编程为流控制器。如果在启用通道之前不知道块的长度,源或目标外设应该终止块传输,在这种模式下,外设(源/目标)是流控制器。
- 传输层次结构——传输最多分为四个级别:DMA传输级别、块传输级别、传输级别和AXI传输级别(DMA transfer level, block transfer level, transaction level, and AXI transfer level)。这样做是为了最小化下面几种情况的影响,即通道被授予一组特定的外设,但外设没有足够的数据持续传输,但是在这种情况下,通道也不能提供给任何其他外设,这降低了性能。
图 1-3说明了非内存外设的 DMA 传输、块传输、传输(单次或突发)和 AMBA AXI 传输(单次或突发)之间的层次结构。
一个DMA传输可以分为多个block传输,一个DMA传输=多个block 传输
而一个block 传输又可以包含多个DMA突发传输,也可以有单个传输,即一个block传输=DMA突发传输+DMAsingle传输。
一个DMA 突发传输可以包含多个AMBA突发传输,即一个DMA 突发传输=多个AMBA突发传输。
图 1-4说明了内存外设的 DMA 传输、块传输和 AMBA AXI 传输(单次或突发)之间的层次结构
内存外设没有transaction级别,因为假定内存始终准备好进行数据传输。
- Transaction – DW_axi_dmac 传输的基本单元,由硬件或软件握手接口决定。如果外设是非内存设备,则传输仅与 DW_axi_dmac 和源或目标外设之间的传输相关。有两种类型的传输:
- 单个传输– 单个传输的长度始终为 1,它被转换为突发长度为 1 的 INCR AXI 传输。
- 突发传输——突发传输的长度被编程到 DW_axi_dmac 中。一个突发传输被转换为AXI 突发传输序列。突发传输长度受程序控制,通常与 DW_axi_dmac 以及源和目标外设中的 FIFO 大小有某种关系。
- Block– DW_axi_dmac 数据块,其数量是块长度,由流控制器确定。对于 DW_axi_dmac 和内存之间的传输,一个块直接分成突发传输序列。对于 DW_axi_dmac 和非内存外设之间的传输,一个块被分解为 DW_axi_dmac 传输序列。这些又被分解为 AXI 传输序列。
- DMA 传输——软件控制 DW_axi_dmac 传输中的块数。DMA 传输完成后,DW_axi_dmac 中的硬件会禁用通道,并可以生成中断以指示 DMA 传输完成。然后可以对通道重新编程以进行新的 DMA 传输。
- Single DMA 传输——由一个Block 传输组成。
- Mult-Block DMA 传输——一个 DMA 传输可能包含多个 DMA Block 传输。多块 DMA 传输通过块链接(链表指针)、通道寄存器、影子寄存器和连续块的自动重新加载来支持。源和目标可以独立选择使用哪种方法。
-
-
- 链表(块链) ——链表指针 (linked list pointer,LLP) 指向系统内存中下一个链表项 (linked list item,LLI)所在的位置。LLI 是描述下一个块(块描述符)和一个 LLP 寄存器的一组寄存器。当启用块链接时,DW_axi_dmac 在每个块的开头获取 LLI。LLI 访问始终使用与数据总线宽度相同的突发大小(arsize/awsize),并且不能更改或编程为除此之外的任何内容。突发长度 (awlen/arlen) 是根据数据总线宽度选择的,以便访问不会跨越一个完整的 64 字节 LLI 结构。如果突发长度不受其他设置限制,则 DW_axi_dmac 在一个 AXI 突发中获取整个 LLI(40 字节)。
- 自动重新加载– DW_axi_dmac 自动在每个块末尾将通道寄存器的值重新加载为首次启用通道时设置的值。
- 连续块- 连续块之间的地址被选择为从前一个块的末尾继续。
- 影子寄存器- DW_axi_dmac 自动在每个块末尾从设置的影子寄存器的内容中加载通道寄存器。当当前块传输正在进行时,软件可以用对应于下一个块传输的值对影子寄存器进行编程。
-
- 通道锁定——软件可以通过在 DMA 传输、块传输或传输(单次或突发)期间锁定主机总线接口的仲裁来对通道进行编程以保持 AXI 主机接口。
数据流
图2-1显示了源外设和目的外设在同一AXI层时DW_axi_dmac中的数据流,图2-2显示了源外设和目的外设在不同AXI层时的数据流。在这两种场景中,源外设使用硬件握手接口,而目标外设使用软件握手接口。如果这些外设是内存,则不使用握手接口。
源和目标外设在同一 AXI 层时的 DW_axi_dmac 流程图
源外设都使用硬件握手接口,而目标外设使用软件握手接口。如果这些外设是内存,则不使用握手接口。
2-1 DW_axi_dmac流当源和目的地的外设在同一个AXI层
源和目标外设在不同 AXI 层时的 DW_axi_dmac 流程图
源外设都使用硬件握手接口,而目标外设使用软件握手接口。如果这些外设是内存,则不使用握手接口。
2-2 DW_axi_dmac流在不同的AXI层上时的Diagram
时钟和复位
DW_axi_dmac设计根据DMAX_SLVIF_CLOCK_MODE、DMAX_MSTIF1_CLOCK_MODE和DMAX_MSTIF2_CLOCK_MODE参数值支持不同的时钟模式。在设计中最多可以有四个时钟;DW_axi_dmac在内部负责时钟域交叉需求。
DW_axi_dmac可以有一个到四个复位输入:
- 从机接口-一个复位
- 主控1和2接口-每个一个复位
- 一个基于以下参数值的core复位输入:DMAX_SLVIF_CLOCK_MODE, DMAX_MSTIF1_CLOCK_MODE, DMAX_MSTIF2_CLOCK_MODE
假定所有复位输入同时断言和撤销断言,撤销断言与相应时钟同步。撤销断言可能不会完全同时进行,因为可能存在与每个时钟域的同步相关的延迟。所有复位都可以从一个复位输入派生。
注意,DW_axi_dmac不支持只断言少数复位(不是所有复位),也不支持在不同时间断言复位(每次复位之间有延迟);这样做会导致不可预测的行为。
DW_axi_dmac支持软复位,这是使用DMAC_ResetReg寄存器中的DMAC_RST字段设置的。软复位步骤如下:
- 软件将1写入DMAC_ResetReg.DMAC_RST位复位DW_axi_dmac,软件轮询DMAC_ResetReg.DMAC_RST位,直到它被视为0,这确认复位。
- DW_axi_dmac复位不同时钟域中的所有模块,从总线接口模块除外。从总线接口模块没有复位,因为软件正在轮询DMAC_ResetReg DMAC_RST字段。
- DW_axi_dmac将DMAC_ResetReg DMAC_RST位清除为0。
注意:软件不允许写0到DMAC_ResetReg.DMAC_RST字段。复位不能保证正在进行或已发布请求的数据传输完成。如果在传输之间断言复位,则可能导致违反AXI协议。
从机总线接口
从总线接口概述
从总线接口模块实现了通过外部AHB/APB4 Master访问DW_axi_dmac内部寄存器的逻辑。从总线接口可以通过DMAX_SLVIF_MODE参数配置。根据子系统的需求,可以选择AHB/ APB4接口。这些模块只支持数据传输的小端方案。从总线接口可以配置为在与DW_axi_dmac核心时钟(dmac_core_clock)不同的时钟上运行,可以使用coreconstant中的DMAX_SLVIF_CLOCK_MODE参数进行配置。如果DMAX_SLVIF_CLOCK_MODE参数设置为1,则从总线接口模块根据该接口使用的协议对hclk/pclk进行操作。DW_axi_dmac设计在这种情况下负责时钟域交叉。AHB或APB4从总线接口可用于执行对公共寄存器和通道寄存器空间的读或写操作。在执行读写传输时,从机总线接口可能会提供从接口访问错误,读写传输可能会失败,原因如下:
解码访问错误,写入只读寄存器访问错误,读到只写寄存器错误,Write-on-Hold错误,未定义地址访问错误。当从总线接口配置为AHB时,通过驱动error (2'h01)在HRESP信号上提供错误响应。当从总线接口配置为APB4时,通过断言PSLVERR信号提供错误响应。
// -- Declare APB SBIU FSM parameters
//---------------------------------------------------------
localparam SETUP_ST = 2'b00;
localparam ACCESS_ST = 2'b01;
localparam APB_SBIU_FSMW = 2;
// --- APB SBIU FSM sequential process
//---------------------------------------------------------
always @(posedge pclk or negedge presetn) begin : S_APB_FSM_PROC
if (!presetn) begin
apb_sbiu_st_r <= SETUP_ST;
end
else begin
apb_sbiu_st_r <= apb_sbiu_st_nxt_w;
end
end
APB4协议状态机:
SETUP_ST:它是APB4状态机的默认状态。没有正在进行的APB transfer。如果APB传输通过(psel==1'bl) (penable==1'b0)开始指示,则状态机转换到ACCESS_ST状态。如果APB传输开始,它只停留在SETUP阶段一个周期。
ACCESS_ST:数据访问始于APB4 ACCESS状态。在ACCESS阶段,penable必须断言为1'b1。然而,如果没有,违反APB协议,状态机传输回SETUP ST。在penable == 1'b1后,如果同时pready == 1'b1则完成APB传输,状态机过渡到SETUP_ST状态。当penable == 1'b1,但pready == 1'b0时,延迟APB传输,状态机处于ACCESS状态,等待pready断言完成APB传输。
always @( * ) begin : C_APB_FSM_PROC
case (apb_sbiu_st_r)
SETUP_ST: begin // SETUP_ST state
casez ({psel,penable,pready})
3'b0?? : begin
apb_sbiu_st_nxt_w = apb_sbiu_st_r;//APB Slave not-selected and idle : stay SETUP_ST
end
3'b10? : begin
apb_sbiu_st_nxt_w = ACCESS_ST; // APB SETUP_ST state with transfer
end
default : begin
apb_sbiu_st_nxt_w = SETUP_ST; // other error cases go back to SETUP_ST to wait next transfer
end
endcase
end
ACCESS_ST: begin // ACCESS_ST state
casez ({psel,penable,pready})
3'b110 : begin
apb_sbiu_st_nxt_w = ACCESS_ST; // APB Wait state, extended by pready
end
3'b111 : begin
apb_sbiu_st_nxt_w = SETUP_ST; // APB transfer completed by assert pready
end
default : begin
apb_sbiu_st_nxt_w = SETUP_ST; // other cases go back idle to SETUP_ST and wait next transfer
end
endcase
end
//VCS coverage off
default: begin
apb_sbiu_st_nxt_w = SETUP_ST;
end
//VCS coverage on
endcase
end
APB地址更新:pready延迟了地址和控制信号,生成地址的pready延迟版本,用于当存在等待状态时的写和读访问,以及等待状态的地址保持.
always @(posedge pclk or negedge presetn) begin : S_ADDR_CTRL_PROC
if (!presetn) begin
apb_wr_addr_1d_r <= {`audss_DMAX_S_ADDR_WIDTH{1'b0}};
end
else if(psel & (~penable)) begin
apb_wr_addr_1d_r <= paddr;
end
end
APB接口信号译码
assign apb_sel_c = psel;
assign apb_wr_req_c = apb_sel_c & pwrite & (~penable);
assign apb_rd_req_c = apb_sel_c & (~pwrite) & (~penable);
assign apb_ack_c = reg_wr_ack_i || reg_rd_ack_i;
assign apb_pslverr_c = (reg_wr_ack_i == 1'b1)? |reg_wr_err_type_i : (reg_rd_ack_i == 1'b1) ? |reg_rd_err_type_i : 1'b0 ;
assign apb_rd_en_c = ((apb_sbiu_st_nxt_w == ACCESS_ST) && apb_ack_c && (~pwrite) && (~apb_pslverr_c)) ? 1'b1 : 1'b0;
assign apb_wr_addr_c = apb_wr_req_c ? paddr : apb_wr_addr_1d_r;
assign apb_wr_addr_slice_c = apb_wr_addr_c[`audss_REG_SLICE_LHS:`audss_REG_SLICE_RHS];
assign apb_rd_addr_c = apb_rd_req_c ? paddr : apb_wr_addr_1d_r;
assign apb_rd_addr_slice_c = apb_rd_addr_c[`audss_REG_SLICE_LHS:`audss_REG_SLICE_RHS];
AHB从机总线交互
从机总线接口可以配置为具有AHB接口,以对DW_axi_dmac的内部特定于公共和通道的寄存器进行编程。AHB从机总线接口支持32位和64位数据总线宽度。这个从机总线接口只支持单个AHB传输。AHB从机总线接口可以使用DMAX_SLVIF_CLOCK_MODE coreConsultant参数配置为具有与dmac_core_clock不同的时钟。可以通过将DMAX_SLVIF_MODE参数设置为0来配置这个AHB从总线接口。
APB4从机总线接口
从机总线接口可以配置为APB4接口来访问DW_axi_dmac的内部特定于公共和通道的寄存器。APB4从总线接口支持32位数据总线宽度(DMAX_S_DATA_WIDTH总是固定为32)。APB4从总线接口可以通过使用coreConsultant参数DMAX_SLVIF_CLOCK_MODE配置为具有不同于dmac_core_clock的时钟。这个APB4从总线接口可以通过将DMAX_SLVIF_MODE参数设置为2来配置。APB4接口支持增强了IP的可配置性,以及在子系统中集成的便利性。
主机接口
主机接口实现AXI总线上的数据传输。AXI协议可以是AXI3或AXI4,这可以在coreConsultant中进行配置。DW_axi_dmac最多支持两个主机接口,它们独立操作,在外设和内存之间传输数据。两个主机接口必须使用相同的AXI协议。主机接口的地址和数据总线宽度可以在coreConsultant中进行配置,但是两个主机接口使用相同的配置。主机接口实现了AXI协议中指定的所有五个通道:
写地址,写数据,写响应,读地址,读数据
主机接口实现了不同的fifo,用于通过DW_axi_dmac中的不同通道在外部内存或外设之间传输数据的临时存储。可以将主机接口配置为在与DW_axi_dmac核时钟(dmac_core_clock)不同的时钟上运行,这可以通过在coreConsultant中设置DMAX_MSTIFN_CLOCK_MODE参数来配置。当“DMAX_MSTIFN_CLOCK_MODE”设置为1时,表示主机接口模块在aclk_mN进行操作。DW_axi_dmac设计负责时钟域交叉。
主机接口实现了在大端和小端格式之间进行转换的逻辑。用于大端式格式的端式方案是字节不变(Byte Invariant, BE-S)方法,这是AXI协议支持的大端式格式。DW_axi_dmac能够使用小端方案进行LLI获取和LLI回写,而不管在特定的主机接口上用于数据传输的端序格式是什么。有关配置或编程主机接口的更多信息,请参见第4章“参数描述”、第5章“信号描述”和第6章“寄存器描述”。
DW_axi_dmac支持最多8个通道,可以根据用于访问主机接口的定义良好的可编程仲裁方案将通道分配给任意一个主机接口。除了通道源和目标外设,LLI获取和LLI回写操作也需要访问主机接口。DW_axi_dmac实现了一个可编程仲裁方案,下面一节将对此进行解释。
仲裁方案
DMA 传输可以分为以下传输层次结构级别:
- 传输级别(仅适用于非内存外设)
- 块级
- 完整的 DMA 传输级别
- AXI 传输电平
DW_axi_dmac 实现了一个动态优先级和公平的仲裁方案,在不同的 DMA 传输层次结构级别具有通道锁定选项。
可用的优先级数量与启用通道的数量相同,并且优先级值可在通道配置寄存器 CHx_CFG 中为每个通道编程。在一些优先级未被使用的情况下,多个通道可以被赋予相同的优先级。(DMAX_NUM_CHANNELS-1) 的优先级是最高优先级,0 是最低优先级。
动态优先级和公平平等仲裁是一种两层仲裁方案,其工作原理如下:
- 第一层仲裁使用请求的优先级输入,并决定向哪个请求客户端发出授权信号。具有最高优先级的请求被授予访问主机接口上的 AXI 通道的权限。
- 如果对仲裁器的两个或多个请求具有相同的编程优先级值,则使用基于公平之间平等方案的第二层仲裁。在该方案中,授权在具有相同优先级的主动请求客户端之间公平地发布。
单一仲裁器方案
在 Single Arbiter 方案中,来自源、目标和 LLI 状态机的读取请求的仲裁是通过使用 Single Arbiter 执行的。从通道到仲裁器的读取请求包括以下请求:
- 源数据和 SSTAT 读取请求
- 目标 DSTAT 读取请求
- LLI 描述符读取请求(可选,仅在 (DMAX_HAS_LLI_PARAM=1) 时可用)
Single arbiter 方案基于“仲裁方案”中描述的 Dynamic priority(第一层仲裁)和 fair-among-equals(第二层仲裁)方案在来自所有通道的这些读取请求之间执行仲裁。授予的读取请求可以访问 AXI 主机接口。Single Arbiter Scheme-Read Arbiter的框图如图2-3所示。
图 2‑3 单仲裁器方案 - 读取仲裁器
其中,x = DMAX_NUM_CHANNELS 即配置的通道数。
类似地,来自目标和 LLI 状态机的写请求的仲裁是使用单仲裁器执行的。从通道到仲裁器的写请求包括以下内容:
- 目标数据写入请求
- LLI 描述符回写请求(可选,仅在 (DMAX_HAS_LLI_PARAM=1) 和 (DMAX_CHx_LLI_WB_EN=1) 时可用)
Single arbiter 方案基于 Dynamic priority(第一层仲裁)和 fair-among-equals(第二层仲裁)方案在来自所有通道的这些写请求之间执行仲裁。授予的写入请求可以访问 AXI 主机接口。Single Arbiter Scheme-Write Arbiter的框图如图2-4所示。
图 2‑4 单仲裁器方案 - 写入仲裁器
其中,x = DMAX_NUM_CHANNELS 即配置的通道数。
如果 DMAX_NUM_CHANNELS 的通道数小于或等于 8,则 DW_axi_dmac 配置为 Single Arbiter Scheme,DMAX_MULT_ARB_EN 始终硬编码为 0。如果通道数大于 8,则 DW_axi_dmac 可以配置为 Single Arbiter方案 (DMAX_MULT_ARB_EN = 0) 或多仲裁器方案 (DMAX_MULT_ARB_EN = 1)。
Multi-Arbiter方案
当通道数量大于8个时,为了满足更高的QoR(时序)要求(如果需要),引入了多仲裁方案,这是通过DMAX_MULT_ARB_EN参数可配置的特性。这个multi - arbitrer方案使用两阶段仲裁架构。第一阶段有多个仲裁者,每个仲裁者有多达8个通道,与已寄存的授权grant输出的读或写请求相关。有关通道读或写请求的定义,请参阅第34页的“单一仲裁方案”。第二阶段具有单个仲裁者,其每个第一阶段仲裁者的授权输出作为第二阶段仲裁者的请求输入。第二阶段仲裁者的授权输出未寄存。multi - arbitrer方案将单个仲裁者拆分为多个更小的仲裁者,如图2-5和图2-6所示。这有助于改进DW_axi_dmac的总体QoR。
多仲裁器方案-读仲裁器的框图如图2-5所示。每个读仲裁者在单个仲裁者级别使用动态优先级(第一级仲裁)和对等公平(第二级仲裁)方案进行仲裁。
多仲裁器方案-写仲裁原理框图如图2-6所示。每个写仲裁都在单个仲裁级别使用动态优先级(第一级仲裁)和对等公平(第二级仲裁)方案进行仲裁。
Figure 2-5 Multi-Arbiter Scheme - Read Arbiter
NUM_OF_APB=DMAX_NUM_CHANNELS/8+DMAX_NUM_CHANNELS%8
Multi-Arbiter Scheme-Write Arbiter 的框图如图 2-6 所示。 每个写仲裁器在单个仲裁器级别使用动态优先级(第一层仲裁)和公平平等(第二层仲裁)方案进行仲裁。
其中NUM_OF_ARB = DMAX_NUM_CHANNELS/8 + DMAX_NUM_CHANNELS%8
下表展示了配置了不同数量通道的多仲裁器方案组织的几个例子。
表2 - 1多仲裁器方案-仲裁组织
通道数量 DMAX_NUM_CHANNELS |
第一阶仲裁器数量(NUM_OF_ARB) |
第一阶仲裁器的读/写数量 |
第一阶仲裁器请求数量 |
32 |
4 |
所有4个仲裁者接收来自8个通道的请求 |
4 |
27 |
4 |
前三个仲裁者从八个通道接收请求,最后一个仲裁者从三个通道接收请求 |
4 |
21 |
3 |
前两个仲裁者从八个通道接收请求,最后一个仲裁者从五个通道接收请求 |
3 |
12 |
2 |
第一个仲裁者从八个通道接收请求。第二个或最后一个仲裁者从四个通道接收请求 |
2 |
锁定和授权
仲裁程序的锁定输入允许在相应的锁定输入期间为一个请求(尽管有其他请求)提供独占授予。客户端收到授权后,它可以通过设置相应的锁定输入将其他客户端从仲裁过程中锁出去。DW_axi_dmac设计允许将通道锁定到传输(仅适用于非内存外设)、块或完全DMA传输级别的仲裁者。默认情况下,DW_axi_dmac锁定一个完整的AXI传输的仲裁者。如果在更高的级别上启用了通道锁定(用于传输、块或完全DMA传输),锁定仲裁者的通道将获得对主机接口的访问权,直到锁定期结束,而在此期间来自其他通道的请求将被忽略。
不同接入优先级
如果具有相同优先级值的不同通道的源、目的、链表外设连接在同一个主机接口上,则不同访问的优先级为:
AXI读取通道:Linked List fetch >源数据传输/源状态fetch/目的状态fetch
AXI写通道:目标数据传输>链表回写(CHx_LLP_STATUS,源和目标状态)
相同的通道传输,获取和访问
对于特定通道,源数据传输、目标数据传输、链表获取和链表状态回写访问通常按以下顺序进行。链表取>源数据传输和目的数据传输>源状态取和目的状态取>链表回写
通道锁定
DMA传输可以分为以下传输层次结构级别:完全传输级别,块级别传输级(仅适用于非内存外设),AXI传输级别
DW_axi_dmac允许在块和完全DMA传输级别的内存到内存传输期间将通道锁定到仲裁者。如果在块上或在完全的DMA传输级别上启用了通道锁定,锁定仲裁者的通道将获得对主机接口的访问权,直到锁定周期结束,而在此期间来自其他通道的请求将被忽略。
使能通道锁定
通道锁定可以在以下场景中实现。如果在特定的传输层次结构中启用了通道锁定,并且这是一个内存到内存的传输,则会建立对主机接口的AXI通道的相应通道的锁定。传输是一种内存到内存的传输。请注意硬件不会检查通道锁定设置的有效性,因此,软件必须只在块或DMA传输级别的内存到内存传输时启用通道锁定。非法编程通道锁定可能导致不可预知的行为。
清除通道锁定
当DW_axi_dmac根据软件的请求挂起、禁用或中止通道,或者DW_axi_dmac在主机接口上接收到错误响应时禁用通道时,通道锁定将被清除。
如果DW_axi_dmac由于在主机接口上接收到的错误响应而清除通道锁定,或者如果软件挂起、禁用或中止通道,则CHx_IntStatusReg寄存器中的ChLock_Cleared_IntStat位设置为1。此外,如果通道锁定分别在DMA块级别或传输级别启用,则在每个块或DMA传输结束时清除ChLock_Cleared_IntStat。
可能的死锁条件
当主机接口上同时启用多个通道,其中一个通道在主机接口上获得读锁定,其余通道被锁定,无法进行DMA传输时,就会发生死锁情况。在编程时,必须确保不发生死锁。只有当主节点的数量等于2 (DMAC_NUM_MASTER_IF = 2)且通道的数量大于1 (DMAC_NUM_CHANNELS>1)时,才会发生死锁.
图 2-7 说明了一个场景,其中读取通道被锁定以用于后续读取请求。
图 2-7 场景 1:死锁情况
图 2-8 说明了另一种情况,其中读取通道被锁定以用于后续读取请求
图 2-8 场景 2:死锁情况
端方案
DW_axi_dmac支持在AXI主机接口上进行数据访问的小端和大端格式。用于大端序格式的端序是字节不变(BE-8)方法,这是AXI协议支持的格式。如果将AXI主机接口配置为大端格式,则对AXI读数据执行大端BE-8到小端BE-8转换,对AXI写数据执行小端BE-8到大端BE-8转换。
下图显示了在不同数据总线宽度和传输大小组合下,出现在AXI主总线上的大端BE-8数据和小端数据之间的转换过程。
图2 - 9使用BE-8(字节不变)方法实现32位数据总线(字节访问)的BE-LE转换
图2-10 32位数据总线使用BE-8(字节不变)方法进行BE-LE转换(半字访问)
图2-11 32位数据总线(Word访问)使用BE-8(字节不变)方法进行BE-LE转换
图2-12 64位数据总线使用BE-8(字节不变)方法进行BE-LE转换(字节访问)
图2-13 64位数据总线使用BE-8(字节不变)方法进行BE-LE转换(半字访问)
图2-14 64位数据总线使用BE-8(字节不变)方法进行BE-LE转换(字访问)
单个传输区域
在某些情况下,仅使用突发传输无法完成DMA块传输。
通常,当块大小不是突发传输长度的倍数时,就会发生这种情况。在这些情况下,块传输使用突发传输,直到完成块的剩余数据量小于突发传输中的数据量为止。此时,DW_axi_dmac对dma_single状态标志进行采样,并使用单个传输完成块传输。外设断言一个状态标志,向DW_axi_dmac表明有足够的数据或空间来完成来自源或目标外设的单个传输。对于硬件握手,单个状态标志是硬件握手接口上的一个信号。对于软件握手,单个状态标志是软件握手接口寄存器中的一位。单个传输区域是DW_axi_dmac使用单个传输完成块传输的时间间隔;突发传输仅在此区域之外使用。以下术语用于解释单个传输区域。
- 源单个传输大小(以字节为单位):src_single_size_bytes = CHx_CTL.SRC_TR_WIDTH / 8
- 源突发传输大小(以字节为单位):src_burst_size_bytes =CHx_CTL.SRC_MSIZE* src_single_size_bytes
- 目标单传输大小(以字节为单位):dst_single_size_bytes = CHx_CTL.DST_TR_WIDTH / 8
- 目标突发传输大小(以字节为单位):dst_burst_size_bytes = CHx_CTL.DST_MSIZE * dst_single_size_bytes
- 以字节为单位的块大小
- 如果DW_axi_dmac是流控制器—在DW_axi_dmac作为流控制器的情况下,处理器对DW_axi_dmac编写块大小(一个块内的数据个数),块大小被编程到CHx_BLOCK_TS.BLOCK_TS字段和源传输数据项的数据宽度,源传输数据宽度被编程到(CHx_CTL.SRC_TR_WIDTH)字段,以便在传输中由DW_axi_dmac控制块传输。因此,要在一个区块中传输的总字节数是:blk_size_bytes_dma = CHx_BLOCK_TS.BLOCK_TS * src_single_size_bytes
- 如果源外设是流量控制器: blk_size_bytes_src =(块中的源突发传输数* src_burst_size_bytes) +(块中的源单个传输数* src_single_size_bytes)
- 如果目标外设是块流控制器: blk_size_bytes_dst =(块中的目标突发传输数* dst_burst_size_bytes) +(块中的目标单个传输数量* dst_single_size_bytes)
单个传输区域仅应用于非流控制器的外设。何时进入该区域的精确定义取决于作为流控制器的是什么:
- 如果DW_axi_dmac是流控制器:
- 当源块传输中需要完成的字节数小于src_burst_size_bytes时,源外设进入单个传输区域。如果blk_size_bytes_dma/src_burst_size_bytes是一个整数,那么源外设永远不会进入这个区域,源块传输只使用突发传输。
- 当目标块传输中需要完成的字节数小于dst_burst_size_bytes时,目标外设将进入单个传输区域。如果blk_size_bytes_dma/dst_burst_size_bytes是一个整数,那么目标外设永远不会进入这个区域,目标块传输只使用突发传输。
- 如果源外设或目标外设中有一个是流量控制器:
- 单个传输区域不适用于流控制器外设。
- 如果源外设是流控制器,当流控制器外设(即源外设)发出块中最后一个传输的信号,并且当目标块中剩余要传输的数据量小于dst_burst_size_bytes指定的值时,目标外设就会进入单个传输区域。
- 如果目标外设是流控制器,当流控制器外设(即目的地)发出块中最后一个传输的信号,并且当源块中剩余要传输的数据量小于src_burst_size_bytes指定的值时,源外设就会进入单个传输区域。
- 如果外设不是流控制器,DW_axi_dmac将忽略单个传输区域外的dma_single输入。
握手接口
在传输级别使用握手接口来控制单个或突发传输的流。握手接口的操作取决于流控制器是外设还是DW_axi_dmac。外设使用握手接口向 DW_axi_dmac 指示它已准备好通过 AXI 总线传输或接受数据。
DW_axi_dmac 最多支持 16 个硬件握手接口,可在 coreConsultant 中配置。所使用的握手接口类型(软件或硬件)可在通道配置寄存器 CHx_CFG 中为每个通道源和目标独立编程。软件握手是通过内存映射寄存器完成的,而硬件握手是使用专用握手接口完成的。
硬件握手
以下一组 I/O 信号用于硬件握手。
- dma_req – 来自外设的突发传输请求输入。该信号的功能取决于外设是否是流量控制器。
- 如果外设不是流控制器——无论 dma_single 的电平如何,DW_axi_dmac 总是将 dma_req 信号解释为突发传输请求。一旦 dma_req 被断言,它必须保持断言直到 dma_ack 被断言。当驱动 dma_req 的外设确定 dma_ack 被断言时,它必须取消断言 dma_req。如果在单个传输区域中检测到 dma_req 上的有效电平,则使用提前终止的突发传输完成块传输。
- 如果外设是流控制器——dma_req 上的有效电平启动传输请求。传输的类型——无论是单一的还是突发的——由 dma_single 输入限定。一旦 dma_req 被断言,它必须保持断言直到 dma_ack 被断言。当驱动 dma_req 的外设确定“dma_ack”被断言时,它必须取消断言 dma_req。
- dma_single - 来自外设的单个传输请求输入。该信号的功能取决于外设是否是流量控制器。
- 如果外设不是流控制器- dma_single 信号是一个状态信号,当源或目标外设可以传输或接受至少一个源或目标数据项时,它会置位;否则将被清除。
- dma_single信号仅在块传输的单个传输区域中由 DW_axi_dmac 采样。在这个区域之外,dma_single 被忽略并且所有传输都是突发传输,这意味着 DW_axi_dmac 需要等待 dma_req 被断言。
- 一旦 dma_single 被断言,它必须保持断言直到 dma_ack 被断言。当驱动 dma_single 的外设确定 dma_ack 被断言时,它必须取消断言 dma_single。
- 如果外设是流控制器– dma_single 信号由源或目标外设断言以请求单个传输。
- 如果 dma_single 在与 dma_req 被断言相同的时钟周期内被断言,则外设请求单个传输。如果取消断言 dma_single,则外设正在请求突发传输。
- 一旦 dma_single 被断言,它必须保持断言直到 dma_ack 被断言。当驱动 dma_single 的外设确定 dma_ack 被断言时,它必须取消断言 dma_single。
- 如果外设不是流控制器- dma_single 信号是一个状态信号,当源或目标外设可以传输或接受至少一个源或目标数据项时,它会置位;否则将被清除。
- dma_last - 来自外设的块请求中的最后一个传输。该信号的功能取决于外设是否是流量控制器。
- 如果外设不是流控制器- dma_last 信号不相关并且被忽略。
- 如果外设是流控制器- 外设在 dma_req 被断言的同一周期内断言 dma_last 以表明此传输请求是块中的最后一个,并且在此传输完成后块传输完成。
- 如果 dma_single 在 dma_last(和 dma_req)被断言的同一周期内为高电平,则最后一个传输是单个传输。如果 dma_single 在 dma_last(和 dma_req)被断言的同一周期内为低电平,则最后一个传输是突发传输。
- 一旦 dma_last 被断言,它必须保持断言直到 dma_ack 被断言。当驱动 dma_last 的外设确定 dma_ack 被断言时,它必须取消断言 dma_last。
- dma_ack - DW_axi_dmac 确认信号输出到外设。该信号的功能取决于外设是否是流量控制器。
- 如果外设不是流控制器– dma_ack 信号在当前传输(单次或突发)到外设的最后一次 AXI 数据传输完成后置位。
- 对于单个传输,dma_ack 保持有效,直到外设取消断言 dma_single(即,在 dma_single 取消断言后一个 dmac_core_clock 周期取消断言 dma_ack)。
- 对于突发传输,dma_ack 保持有效,直到外设取消断言 dma_req(即,在取消声明 dma_req 后一个 dmac_core_clock 周期取消声明 dma_ack)。
- 如果外设是流控制器– dma_ack 信号在当前传输(单次或突发)到外设的最后一次 AXI 数据传输完成后置位。它与 dma_req 形成一个握手循环,并一直保持有效,直到外设取消断言 dma_req(即,在取消断言 dma_req 后一个 dmac_core_clock 周期取消断言 dma_ack)。
- 如果外设不是流控制器– dma_ack 信号在当前传输(单次或突发)到外设的最后一次 AXI 数据传输完成后置位。
- dma_finish - 这是 DW_axi_dmac 块传输完成指示信号输出到外设。dma_finish 信号被置位以表示块完成。这使用与 dma_ack 相同的时序,并与 dma_req 和/或 dma_single 形成握手循环。
图 2‑21显示了目标或源外设与 DW_axi_dmac 之间的硬件握手接口。
图 2‑21 硬件握手界面
- 一旦外设置位 dma_req、dma_single 或 dma_last,就不允许在 DW_axi_dmac 置位 dma_ack 之前取消置位信号。这样做可能会导致不可预知的行为。
- 无论谁是流控制器以及外设是否在单个传输区域中,一旦 DW_axi_dmac 断言 dma_ack,dma_req、dma_single 和 dma_last 信号必须被取消断言。建议遵循此要求,否则可能会出现不可预知的行为.
表2-3显示了所有可能的流量控制器和硬件握手接口信号的组合值。
突发传输
- 突发传输- DMA流控制器
- 突发传输的时序图如图2-22所示。因为外设在单个传输区域之外,DW_axi_dmac不采样dma_single[0]。握手环路如下:
- 外设断言dma_req,
- DW_axi_dmac断言dma_ack,
- 外设解除断言dma_req,
- DW_axi_dmac解除断言dma_ack
- 在断言dma_ack之后,dma_req可以在一个或多个时钟周期后解除断言。
突发传输
- 背靠背突发传输- DMA流控制器
- 背靠背突发传输的时序图如图2-23所示。因为外设在单个传输区域之外,DW_axi_dmac不采样dma_single[0]。第二次突发终止块,断言dma_finish[0]以指示块完成。
-
- 在设计硬件握手接口时,有两点需要注意:
- 一旦断言,dma_req突发请求信号必须保持断言,直到接收到相应的dma_ack信号,即使在外设中生成dma_req的条件为False。
- 当断言dma_ack时,dma_req信号必须解除断言,即使在外设中生成dma_req的条件为真。
- 在设计硬件握手接口时,有两点需要注意:
单个传输
- 单个传输- DMA流控制器:
- 图2-24显示了发生在单个传输区域中的单个传输。握手环路如下:
- 外设断言dma_single,
- DW_axi_dmac断言dma_ack,
- 外设解除断言dma_single,
- DW_axi_dmac解除断言dma_ack
- 突发后的背靠背单个传输-DMA流控制器:
- 在第一个突发传输之后,外设进入单个传输区域,DW_axi_dmac开始对dma_single采样。第二个传输终止块传输;断言dma_finish[0]表示块完成。该场景如图2-25所示。
- 提前终止突发传输- DMA流控制器
- 在单个传输区域中,如果dma_req上的活动电平和dma_single上的活动电平发生在同一个周期中,或者dma_single上的活动电平与dma_req上的活动电平发生在同一个周期中,则突发传输优先于单个传输,块将使用提前终止的突发传输完成。
- 在图2-26中,在第一次突发,DW_axi_dmac进入单传输区域后,在T1处对dma_single[0]采样。当单个传输完成时,在时间T2 dma_req[0]被断言,这导致一个提前终止的burst,因此块完成由dma finish[0]指示。
- 有效单个传输时忽略突发传输- DMA流控制器
- 如图2-27所示,在第一个突发传输完成后,外设位于单个传输区域(Single transaction Region)中,DW_axi_dmac样本在T1处断言dma_single[0]。dma_req[0]信号在这个单一传输的中间时刻T2被触发。此突发传输请求将被忽略,并且不提供服务。dma_req[0]上的活动边沿在T3时刻由DW_axi_dmac重新生成并采样。该突发传输使用“提前终止突发传输”完成块传输。
- 突发传输紧接着是单个传输-外设流控制器
-
- 图2-28显示了一个突发传输之后是一个单个传输,其中单个传输在块中是最后一个。在时钟边沿T1上,DW_axi_dmac采样dma_req[0]被断言,dma_single[0]和dma_last[0]被解除断言。这是对突发传输的请求,它不是块中的最后一个传输。
- 在时钟边沿T2上,DW_axi_dmac采样的dma_req[0]、dma_single[0]和dma_last[0]的样本均被断言。这是对单个传输的请求,它是块中的最后一个传输。握手环路如下:
- 外设断言dma_req以及dma_single和dma_last
- DW_axi_dmac断言dma_ack以及dma_finish
- 外设解除断言dma_req, dma_single和dma_last
- DW_axi_dmac解除断言dma_ack和dma_finish。
背靠背单个传输-外设流控制器
图2-29显示了一个背靠背的单个传输,其中最后一个单个传输是块中的最后一个传输。
外设中断请求接口
这是一个简化版的硬件握手接口。在这种模式下:来自外设的中断线被绑定到dma_req输入。dma_single输入被绑定在低电平。dma_last输入被绑定为低。dma_ack和dma_finish输出被忽略(未连接)。
这个接口可以在从机外设没有硬件握手信号时使用。对于DW_axi_dmac,当外设不是流量控制器时,这与硬件握手接口的情况相同。
外设永远不能成为流量控制器,因为它不能连接到dma_last信号。来自外设的中断线与dma_req线绑定,当外设不是流量控制器时,来自外设的中断线的时序必须与dma_req线相同。由于外设没有对dma_ack进行采样,握手环路如下:
- 外设生成一个断言“dma_req”的中断。
- 2. DW_axi_dmac完成突发传输并生成一个突发结束传输中断SRC_TransComp/DST_TransComp。全局中断必须在DMAC_CfgReg寄存器中启用,相应通道的传输完成指示中断必须在CHx_IntStatus_EnableReg和CHx_IntSignal_EnableReg寄存器中启用。
- 中断服务例程在外设中清除中断,以使“dma_req”被取消断言。
硬件异步握手支持
DW_axi_dmac支持硬件握手接口,它控制单个传输或突发传输的流。这个硬件握手接口可以配置为与dmac_core_clock相关的同步或异步。DW_axi_dmac提供了以下配置参数,允许您启用异步硬件握手接口。这些参数还允许您根据dmac_core_clock信号将每个硬件握手接口配置为同步或异步。
- DMAX_ASYNC_HS_EN -包含/不包含异步DMA握手支持
- DMAX_HS_SAME_ASYNC_CLK -所有DMA握手接口具有相同的异步时钟
- DMAX_HS(y)_ASYNC_CLK - DMA握手接口y有异步时钟,其中,y = 1...DMAX_NUM_HS_IF
- 与dma_req、dma_single和dma_last相关的所有断言和去断言需求仍然适用。参见第50页的“硬件握手”一节。
软件握手
当从外设要求DW_axi_dmac执行DMA传输时,它通过向CPU或中断控制器发送中断来通信此请求。中断服务例程然后使用软件握手寄存器来启动和控制DMA传输。采用一组软件寄存器实现软件握手接口。通道配置寄存器CHx_CFG中的HS_SEL_SRC/HS_SEL_DST位必须设置为启用软件握手。以下寄存器用于软件握手:
- CHx_SWHSSrcReg -通道x源端的软件握手寄存器
- CHx_SWHSDstReg—通道x目的端的软件握手寄存器
- 当相应的源传输完成时,DW_axi_dmac将SWHSSrcReg中的活动请求位清除为0。类似地,当目标传输完成时,SWHSDstReg中的活动请求位被清除为0。
- 注意:软件握手寄存器位的功能与相应的硬件握手信号的功能相同,只是没有dma_ack和dma_finish信号对应的寄存器字段。
- 在使用软件握手时暂停传输
- 如果对源和/或目标外设使用软件握手,那么在完成请求的源和/或目标传输后,DMA传输将自动停止。DW_axi_dmac不会继续传输,直到硬件检测到软件已经设置zaCHx_SWHSSrcReg.SWHS_SglReq_Src 和/或 CHx_SWHSDstReg.SWHS_SglReq_Dst 位到 1。
中断接口
DW_axi_dmac支持coreConsultant中可配置的组合和单独中断输出。中断的极性(Active High/Active Low)可以在coreConsultant中配置。默认情况下,中断输出是与核心时钟(dmac_core_clock)同步的,但是可以使用coreConsultant.中的DMAX_INTR_SYNC2SLVCLK参数将中断输出同步到从接口时钟。如果设置为1,则根据从接口使用的协议,中断输出与hclk/aclk/pclk同步。DW_axi_dmac管理此配置中的时钟域同步需求。DW_axi_dmac有不同的寄存器来支持中断接口。软件可以读取这些寄存器来了解中断的来源并采取适当的操作。请注意DW_axi_dmac支持将中断输出同步到从接口时钟域。图2-30中同步机制未被捕获。DW_axi_dmac的中断生成机制如图2-30所示。
流控制配置
传输类型和流量控制配置由CHx_CFG寄存器中的TT_FC字段的值决定,该字段是针对特定的DMA传输可编程的。
如图2-31所示为硬件握手接口的不同流量控制配置(如图2-31所示为简化版接口)。这些场景也可以用于软件握手,它使用软件寄存器而不是硬件信号。
Burst传输提前终止
当源或目标外设位于单个传输区域时,仍然可以请求突发传输。但是,在这种情况下,src_burst_size_bytes或dst_burst_size_bytes大于触发突发传输时完成源或目标块传输所需的剩余字节数。在这种情况下,突发传输在块完成时启动并“提前终止”,而不传输编程的数据量。只传输完成块传输所需的数据量。
- 只有当外设不是流控制器时,才会发生提前终止的突发传输。
- 如果源外设是流控制器,并且它没有足够的数据在传输结束时进行突发传输,它会断言dma_single,直到通过断言dma_last和dma_single来指示最后一个传输。(此时,目标外设可能进入单个传输区域)。
- 如果目标外设位于单个传输区域,并且目标外设仍然通过断言dma_req请求突发传输,那么DW_axi_dmac启动一个突发传输,并在块完成时提前终止它,而不传输已编程数量的数据(CHx_CTL.DST_MSIZE)。
- 如果目标外设是流控制器,并且在传输结束时没有足够的数据进行突发传输,它将断言dma_single,直到通过断言dma_last和dma_single来指示最后一个传输。(此时源外设可能进入单个传输区域) 。
- 如果源外设位于单个传输区域,并且源外设仍然通过断言dma_req请求突发传输,那么DW_axi_dmac启动一个突发传输,并在块完成时提前终止它,而不传输已编程数量的数据(CHx_CTL.SRC_MSIZE)。
Note:当目的外设为流控制器时,满足以下条件会导致数据丢失:
- CHx_CTL.SRC_TR_WIDTH > CHx_CTL.DST_TR_WIDTH
- blk_size_bytes_dst/src_single_size_bytes ! =整数
- 数据丢失量为:src_single_size_bytes-dst_single_size_bytes
传输控制
传输控制逻辑方便了数据从通道的源外设传输到目标外设。它与多个其他模块交互,如通道源和目标状态机、链表控制逻辑、通道寄存器、通道FIFO控制逻辑等。
来自源外设的数据在被发送到目标外设之前暂时存储在通道FIFO中。如果源和目标外设使用不同的传输大小(arsize、awsize)进行数据传输,DW_axi_dmac实现打包和解包数据所需的逻辑,以适应FIFO配置。
单块传输
如果一个DMA传输由单个块组成,该软件将CHx_CFG寄存器中的源和目标外设的多块类型位设置为2'b00。在这种情况下,一旦与CHx_BLOCK_TS寄存器中编程的块长度相对应的块传输完成,DW_axi_dmac将禁用通道。CHx_IntStatusReg寄存器被更新为与完成的块传输相对应的状态。CHx_IntStatusReg寄存器是根据CHx_IntMaskReg寄存器的设置更新的,中断是根据CHx_IntMaskReg、DMAC_IntMaskReg和DMAC_CfgReg寄存器的设置生成的。
多块传输
- 如果DW_axi_dmac被编程用于多块传输,则在多块传输的连续块上使用以下方法中的任何一种对CHx_SAR和CHx_DAR寄存器进行重编程: 连续的地址,自动重新加载,影子寄存器,链表,
- CHx_CTL和CHx_BLOCK_TS寄存器在多块传输的连续块上使用以下方法中的任意一种重新编程: 自动重新加载,影子寄存器,链表
- CHx_IntStatusReg寄存器被更新为与完成的块传输相对应的状态。CHx_IntStatusReg寄存器是根据CHx_IntMaskReg的设置更新的,中断是根据CHx_IntMaskReg、DMAC_IntMaskReg和DMAC_CfgReg寄存器的设置生成的。
- 多块传输的寄存器更新方法取决于CHx_CFG寄存器中多块类型位的值。下表中捕获了多块寄存器更新方法的所有可能组合。
连续地址
- 在这种情况下,连续块之间的地址将被选择作为前一个块结束的延续。使源地址或目的地址在块之间连续是CHx_CTL.SRC_MLTBLK_TYPE和CHx_CTL.DST_MLTBLK_TYPE寄存器字段的一个功能。CHx_SAR和CHx_DAR更新不能同时被选择为连续的。如果需要,可以通过使用链表间接实现此功能。为此,设置下一个块描述符的地址LLI.CHx_SAR要比前一个块的结束地址大1。类似地,设置下一个块描述符的地址LLI.CHx_DAR要比前一个块的结束地址大1。
- 如果启用了基于连续地址的多块传输,那么在完整的DMA传输中必须至少有两个块。否则,它将导致不可预测的行为。
自动重新加载
- 在这种情况下,通道传输控制寄存器在每个块完成时用它们的初始值重新加载,并将这些值用于新的块。部分或全部CHx_SAR、CHx_DAR、CHx_BLOCK_TS和CHx_CTL通道寄存器在新的块传输开始时从它们的初始值重新加载,这取决于为源和目标外设选择的多块传输类型。DW_axi_dmac不会继续进行下一个块传输,直到软件在DMAC_IntClear_Reg寄存器的相应位上写1来清除相应通道的块传输完成中断(如果这个中断没有被屏蔽掉)。
- 注意如果启用了基于自动重加载的多块传输,那么在完整的DMA传输中至少应该有两个块。否则,它将导致不可预测的行为。
影子寄存器
- 在这种情况下,通道传输控制寄存器在每个块完成时从它们对应的影子寄存器加载,这些值用于新块。部分或全部CHx_SAR、CHx_DAR、CHx_BLOCK_TS和CHx_CTL通道寄存器在新的块传输开始时从它们对应的影子寄存器加载,这取决于为源和目标外设选择的多块传输类型。
- 没有为影子寄存器访问定义单独的内存映射。软件总是写入CHx_SAR, CHx_DAR, CHx_BLOCK_TS和CHx_CTL寄存器,而不考虑使用的多块传输类型。如果源或目标传输使用基于影子寄存器的多块传输,DW_axi_dmac在内部将数据路由到相应的影子寄存器。DW_axi_dmac将影子寄存器内容复制到CHx_SAR、CHx_DAR、CHx_BLOCK_TS和CHx_CTL寄存器,然后再开始新的块传输。
- 对CHx_SAR、CHx_DAR、CHx_BLOCK_TS和CHx_CTL寄存器的读操作总是返回与当前块传输对应的数据,而不是影子寄存器内容(对应下一个块)。
- 对于基于影子寄存器的多块传输,CHx_CTL寄存器中的ShadowReg_Or_LLI_Valid位指示影子寄存器内容是否有效。0表示影子寄存器内容无效,1表示影子寄存器内容有效。如果在影子寄存器获取阶段此位读出为零,DW_axi_dmac将丢弃影子寄存器内容并生成ShadowReg_Or_LLI_Invalid_ERR中断。DW_axi_dmac等待软件将任何值写入CHx_BLK_TFR_ResumeReqReg寄存器以指示有效的影子寄存器可用性,然后再尝试另一个影子寄存器获取操作以继续下一个块传输。
- 请注意如果coreConsultant参数DMAX_CHx_SHADOW_REG_EN设置为0,则禁用基于阴影寄存器的多块传输,只允许其他多块传输方法。
链表
- 在这种情况下,DW_axi_dmac通过从系统存储器中获取该块的块描述符,在每个块开始之前重新编程通道传输控制寄存器。这被称为LLI更新。DDW_axi_dmac 块链接使用链表指针寄存器 (CHx_LLP) 来存储下一个链表项在内存中的地址。
- 每个 LLI 包含以下块描述符:CHx_SAR;CHx_DAR;CHx_BLOCK_TS;CHx_CTLECHx_LLP;
- 要建立块链,应该在内存中编写一个链表序列。DW_axi_dmac允许动态扩展链表,这样就不需要提前在系统内存中创建整个链表。CHx_CTL.ShadowReg_Or_LLI_Valid和CHx_CTL.LLI_LLI_Last字段用于实现此功能。
- 对于基于链表的多块传输,LLI.CHx_CTL寄存器的ShadowReg_Or_LLI_Valid位指示从内存中获取的链表项是否有效。如果该位设置为0,表示LLI无效;如果该位设置为1,表示LLI有效。如果LLI无效,DW_axi_dmac将丢弃LLI并生成LLI错误中断(如果相应的通道错误中断屏蔽0).此错误条件导致DW_axi_dmac优雅地停止相应的通道。DW_axi_dmac等待软件将任何值写入CHx_BLK_TFR_ResumeReqReg寄存器以指示有效LLI的可用性,然后再尝试另一个LLI读操作。
- 请注意在LLI预取的情况下,即使为预取的LLI将ShadowReg_Or_LLI_Invalid_ERR位设置为0也不会生成ShadowReg_Or_LLI_Invalid_ERR中断。在这种情况下,DW_axi_dmac在完成当前块传输后重新尝试LLI获取操作。只有当ShadowReg_Or_LLI_Valid位仍然设置为0时,DW_axi_dmac才会生成ShadowReg_Or_LLI_Invalid_ERR中断。
- LLI访问总是使用与数据总线宽度相同的突发大小(arsize或awsize),并且不能更改或编程为其他任何值。突发长度(awlen或arlen)是根据数据总线宽度选择的,这样访问就不会跨越一个64字节的完整LLI结构。DW_axi_dmac在一个AXI突发中获取LLI(40字节),如果突发长度不受其他设置的限制。
- 如果启用了状态回写选项,DW_axi_dmac将CHx_CTL、CHx_LLP_STATUS、CHx_SSTAT和CHx_DSTAT信息回写到为该字段定义的位置,即从地址[CHx_LLP] + 0x20到[CHx_LLP] + 0x34。CHx_SSTAT和CHx_DSTAT回写可以在coreConsultant中独立启用或禁用,并通过在CHx_CTL寄存器中编写相应的字段来实现。如果CHx_SSTAT和/或CHx_DSTAT回写未启用,DW_axi_dmac将取消与这些写操作对应的写数据相位的断言。
- CHx_LLP_STATUS[63]和CHx_LLP_STATUS[62]分别表示DMA_TFR_DONE和BLOCK_TFR_DONE状态,这是LLI回写过程中最后更新的字段。软件应该等到BLOCK_TFR_DONE位设置为1后再读取CHx_SSTAT和CHx_DSTAT信息。DMA_TFR_DONE位和BLOCK_TFR_DONE位在DMA传输中传输最后一个块后被设置为1。
- LLI.CHx_CTL.hadowReg_Or_LLI_Valid位在LLI回写操作后将为0。
块间传输暂停
在每个块传输结束时,如果满足以下条件,则断言块传输完成中断:
- 启用全局中断(DMAC_CfgReg.NT_EN = 1)
- 通道块传输完成中断已启用(CHx_InStatus_EnableReg.nable_BLOCK_TFR_DONE_IntStat = 1以及CHx_IntSignal_EnableReg. Enable_BLOCK_TFR_DONE_IntSignal = 1以及CHx_CTL.IOC_BLKTFR = 1)
- 对于连续地址和基于自动重加载的多块传输(源和目标外设都不使用影子寄存器或基于链表的多块传输),如果块传输已完成中断被使能和取消屏蔽,则DMA传输在断言块传输已完成中断后自动停止。DW_axi_dmac不会继续进行下一个块传输,直到硬件检测到对CHx_IntClearReg寄存器中适当字段的写入(由软件完成,以清除通道块传输完成中断)。
- 块之间的通道暂停用于确保在最后一个块开始之前,下一个块的块传输完成ISR(中断服务例程)得到服务。这确保ISR在完成最后一个块之前已经清除了CHx_CFG.SRC_MLTBLK_TYPE和/或CHx_CFG.DST_MLTBLK_TYPE位。
- CHx_CFG.SRC_MLTBLK_TYPE和/或CHx_CFGDST_MLTBLK_TYPE位应该在用于下一个块传输的块传输完成ISR之前清除。
多块传输结束
- 如果源外设或目标外设使用影子寄存器或基于链表的多块传输,则CHx_CTL_ShadowReg/ LLI.CHx_CTL寄存器中对应的最后块指示位ShadowReg_Or_LLI_Last指示当前块是否是传输中的最后一个块。如果将当前块的该位设置为1,DW_axi_dmac将理解当前块是传输中的最后一个块,并在当前块传输结束时完成DMA传输操作。
- 对于基于连续地址和自动重加载的多块传输(如果源端和目标外设都不使用影子寄存器或基于链表的多块传输),如果对应的多块类型选择位即CHx_CFG.SRC_MLTBLK_TYPE和/或CHx_CFG.DST_MLTBLK_TYPE位在块传输结束时为2'b00, DW_axi_dmac理解前一个块是传输中的最后一个块,并完成DMA传输操作。
外部内存接口
对外内存接口简介
每个通道都有专用的FIFO用于数据存储。FIFO内存的尺寸是可配置的,宽度最多支持512位,深度最多支持256位。DW_axi_dmac通道FIFO内存使用基于触发器的内存。如果在内存尺寸较大的情况下使用基于触发器的内存,那么它的面积和功耗都不高。外部存储器接口优化DMAC通道FIFO存储器与外部存储器如SRAM,寄存器文件等,以实现面积和功率的优化。
外部内存接口详细描述
DW_axi_dmac的QoR可以通过使用SRAM实现通道FIFO内存或基于寄存器文件的更大内存维度的内存来显著改进。该特性为每个通道提供单独的外部内存接口,将SRAM或基于寄存器文件的内存连接到通道FIFO。外部内存接口还允许您通过这个外部内存接口连接基于触发器的内存。当通道FIFO内存维度很小,基于触发器的内存比SRAM或基于寄存器文件的内存更有效时,这是有益的。
DMA通道从源读取数据,并将数据临时存储在通道FIFO中。然后,DMA通道从FIFO存储器中读取数据并写入目的地。这种读和写操作可以并行进行。根据QoR的要求,可以使用双端口Register文件、SRAM或触发器存储器。一般情况下,Register File或SRAM采用同步读定时,当read enable激活后,读数据在下一个周期有效。如前所述,可以使用不同的FIFO内存类型。例如,基于翻转软盘的内存可以用于更小的内存维度;寄存器文件或SRAM可用于更大的内存尺寸。但是,无论采用哪种类型,都应该使用同步读定时。增加参数DMAX_CH_MEM_EXT,选择内部通道FIFO内存接口方案或外部通道FIFO内存接口方案。此参数还支持顶层值,即通道FIFO内存在DW_axi_dmac的顶层实例化。考虑到时间,添加了DMAX_CH_MEM_REGOUT参数,所有通道都使用它。当DMAX_CH_MEM_REGOUT参数设置为1时,在内部FIFO控制逻辑对内存读取数据进行采样之前,会在内部添加一个管道寄存器。在这种情况下,读数据有两个时钟周期延迟。
注意:如果启用了Read Unique ID特性,则此特性也用于UID内存或重排序缓冲区。
使能外部内存接口
要启用DW_axi_dmac的外部内存接口,请为“使用外部通道内存”选择外部选项。
以下是与外部内存接口相关的信号:
dmac_chx_fifomem_clk
dmac_chx_fifomem_wcen
dmac_chx_fifomem_wen
dmac_chx_fifomem_waddrd
mac_chx_fifomem_wdata
dmac_chx_fifomem_rcen
dmac_chx_fifomem_ren
dmac_chx_fifomem_raddr
dmac_chx_fifomem_rdata
唯一ID特性
唯一ID特性简介
如果不支持AXI Unique ID, DW_axi_dmac核将为通道生成具有相同ID的AXI读/写传输。相同的ID生成确保数据按照其地址请求的顺序显示。虽然这种实现可以满足多个应用,但在某些情况下,需要为每个AXI读/写传输生成AXI Unique ID。这个特性是必需的,因为不同的bank/源/目标内存的不同部分具有不同的响应延迟。只有DW_axi_dmac支持接受乱序响应(可以通过AXI Unique ID特性实现),才能提高总体性能。
AXI Unique ID支持只需要编程CHx_CFG寄存器来为AXI读和写通道选择AXI Unique ID的数量。因此,唯一ID生成只需要最小的软件开销,支持乱序读数据或写响应处理。
ID唯一特性描述
AXI唯一ID特性允许DW_axi_dmac AXI Master接口在具有唯一ID的AXI读通道上生成AXI读传输。CHx_CFG寄存器设置的DMAX_CH(x)_RD_UID参数和RD_UID字段控制生成的唯一id的数量。该特性允许DW_axi_dmac接受来自源内存/外设的无序读取数据。然后,DW_axi_dmac执行数据的重排序,以便在数据移动到目标内存之前与发出的地址匹配。AXI唯一ID特性允许DW_axi_dmac AXI Master接口在AXI写通道上使用唯一ID生成AXI写传输。WR_UID寄存器设置的DMAX_CH(x)_WR_UID参数和CHx_CFG字段控制生成的惟一id的数量。该特性允许DW_axi_dmac接受来自目标内存/外设的乱序写响应。唯一ID特性可以通过配置参数DMAX_CH(x)_RD_UID_EN为AXI读通道启用;和DMAX_CH(x)_WR_UID_EN用于AXI写通道。可以通过以下配置参数配置支持的AXI唯一id的数量:
DMAX_CH(x)_RD_UID - AXI读通道支持的唯一id的数量
DMAX_CH(x)_WR_UID - AXI写通道支持的唯一id的数量
以下部分描述了在不同场景下生成AXI读和写通道ID的过程
AXI读取通道ID格式
AXI Read通道id包括以下信号:
- arid_mi信号被用作读地址通道信号的标识标记
- rid_mi信号被用作Read Data通道信号的标识标记
- AXI读通道ID格式取决于:
- 源数据传输或LLI获取访问
- 是否支持唯一ID
AXI读通道ID的上M位是基于: 当前访问主机接口的通道号;当前访问是Source data transfer或LLI fetch
AXI读通道ID的低N位是基于是否启用惟一ID特性派生的:
当“唯一ID”功能未启用时,低N位等于CHx_AXI_IDReg寄存器的AXI_Read_ID_Suffix字段中的编程值。启用“唯一ID”功能时,低N位用于以递增方式生成AXI Unique ID。生成的唯一ID的数量由DMAX_CH(x)_RD_UID参数和CHx_CFG寄存器的RD_UID字段限制。N位中的剩余位被驱动到0s。
AXI写通道ID格式
AXI写通道id包括awid_mi、wid_mi和bid_mi信号。
- awid_mi信号被用作写地址通道信号的标识标记
- wid_mi信号被用作写数据通道信号的标识标记
- bid_mi信号作为写响应通道信号的标识。
写通道ID的格式取决于:
- 目的数据传输或LLI回写访问
- 是否支持AXI唯一ID
AXI写通道ID的上M位是基于:
- 当前主机接口访问的通道的通道号
- 当前访问权限为“目标数据传输”或“LLI回写”
低N位是根据是否启用唯一ID特性派生的:
唯一ID”功能未启用时:这低N位等于AXI_Write_ID_Suffix寄存器的CHx_AXI_IDReg字段中的编程值。
启用“唯一ID”特性时:这低N位用于以增量方式生成AXI Unique ID。CHx_CFG寄存器的DMAX_CH(x)_WR_UID参数和WR_UID字段限制了生成的Unique id的数量。N位中的剩余位被驱动到0s。
其他注意事项
以下是限制可编程的读唯一ID(CHx_CFG.RD_UID)的最大数量的等式:
- 每个重排序缓冲位置的节拍数= N (beats_per_loc)=重新排序缓冲区宽度/源传输宽度= DMAX_CHx_FIFO_WIDTH/CHx_CTL.SRC_TR_WIDTH
- 每个ARLEN的位置数= N(locs_per_arlen)= AXI读传输长度/每个重排序缓冲区位置的节拍数=装Ceil[CHx_CTL.ARLEN/N(beats_per_loc)]
- 读取UID的最大数量或CHx_CFG.RD_UID的最大限制=重新排序缓冲区深度/每个ARLEN的位置个数=Floor[DMAX_CHx_REORDER_BUFF_DEPTH/N(locs_per_arlen)]
- 因此,重新排序缓冲区深度和突发长度限制了Read Unique id的最大数量的生成。
AXI未对齐传输支持
DW_axi_dmac支持在AXI主机接口上生成未对齐的DMA传输。该特性可以通过可配置参数DMAX_UNALIGNED_XFER_EN启用。DW_axi_dmac组件支持向后兼容性,即使不需要这个特性,旧的驱动程序和寄存器编程也可以正常工作,无需任何更改。
AXI未对齐传输描述
- 未对齐的内存访问在基于AXI的系统中很常见,其中内存访问地址与传输宽度的自然边界不对齐。DW_axi_dmac支持在AXI主机接口上生成未对齐的内存DMA传输。该特性支持消除了对内存访问的以下限制:
- 源AXI数据传输- SAR地址必须与源传输宽度CHx_CTL.SRC_TR_WIDTH (AXI总线大小)对齐。
- 目标AXI数据传输-DAR地址必须与目标传输宽度CHx_CTL.DST_TR_WIDTH (AXI总线awsize)对齐。
- 因此,您可以用任何地址对CHx_SAR和CHx_DAR寄存器进行编程,并且它可以与内存访问的源或目标传输宽度不对齐或对齐。涉及到内存访问的 CHx_CFG.TT_FC的组合支持未对齐访问(MEM_TO_PER_DMAC,PER_TO_MEM_DMAC,PER_TO_MEM_SRC,MEM_TO_PER_DST)。
- DW_axi_dmac处理数据的打包和解包,考虑源和目标传输时的未对齐偏移量。从未对齐源传输接收的数据被打包以与FIFO宽度对齐,然后存储在FIFO中。在目标端,根据CHx_DAR寄存器和目标传输宽度从FIFO读取数据并解包。目标传输的无效字节通过将各自的写strobe驱动到0。
DW_axi_dmac作为流控制器
CHx_BLOCK_TS寄存器的定义保持不变,即写入BLOCK_TS字段的数字表示在DMA块传输中要传输的数据宽度CHx_CTL.SRC_TR_WIDTH的总数。。如果源地址是未对齐的,则认为源中未对齐的字节是在DMA块传输中传输的总字节中派生的。计算一个未对齐传输块中传输的有效字节总数的公式如下:
blk_size_bytes_dma_u = (CHx_BLOCK_TS.BLOCK_TS * src_single_size_bytes) - Source Unaligned bytes
DW_axi_dmac从源获取blk_size_bytes_dma_u字节的数据,并基于CHx_DAR寄存器将所有字节传输到目标。目标未对齐字节不会增加或减少DMA块中传输的有效字节数。只有源未对齐的字节会影响DMA块中传输的字节总数。
当涉及到内存(MEM_TO_MEM_DMAC, MEM_TO_PER_DMAC, MEM_TO_PER_DMAC,PER_TO_MEM_DMAC),传输类型和流量控制器的组合支持未对齐传输。
当源或目标的多块类型是连续的时,后续块的初始地址计算如下(SAR/DAR的不对齐特性也导致后续块初始地址不对齐):
源连续:Next CHx_SAR = Current CHx_SAR + blk_size_bytes_dma_u
目标连续: Next CHx_DAR = Current CHx_DAR + blk_size_bytes_dma_u +目标未对齐字节
源为流量控制器
用于计算在未对齐的块传输中传输的有效字节总数的方程式方式如下:
- blk_size_bytes_src_u =(块中源突发传输数* src_burst_size_bytes) +(块中源单个传输的数量* src_single_size_bytes) -源未对齐字节数
- DW_axi_dmac从源获取blk_size_bytes_src_u字节的数据,并基于CHx_DAR寄存器将所有字节传输到目标。目标未对齐字节不会增加或减少DMA块中传输的有效字节数。只有源未对齐的字节会影响DMA块中传输的字节总数。对于传输类型和流控制器的组合,只要涉及到一个内存—PER_TO_MEM_SRC,当源是流控制器时,就支持不对齐传输。
- 当源或目标的多块类型为连续时,后续块的初始地址计算如下(SAR/DAR的不对齐特性也导致后续块的初始地址不对齐):
- 源连续:Next CHx_SAR = Current CHx_SAR + blk_size_bytes_src_u
- 目标连续: Next CHx_DAR = Current CHx_DAR + blk_size_bytes_src_u +未对齐字节
目的端为流量控制器
计算非对齐传输块传输中传输的有效字节总数的公式如下:
- blk_size_bytes_dst_u =(块中目标突发传输的数量* dst_burst_size_bytes) +(块中目标单个传输的数量* dst_single_size_bytes) -目标Unaligned bytes
- DW_axi_dmac总是向目标提供blk_size_bytes_dst_u字节的数据。如果源地址是未对齐的,那么DW_axi_dmac将获取一个额外的src_single_size_bytes来补偿源未对齐的字节,并为块提供blk_size_bytes_dst_u字节。此外,在少数情况下,当目标未对齐时,DW_axi_dmac会从源获取ceil (Destination Unaligned bytes/src_single_size_bytes)数量的额外数据。这例如,如果CHx_CTL.SRC_TR_WIDTH = 64位,CHx_CTL.DST_TR_WIDTH = 64位,CHx_CFG.TT_FC = MEM_TO_PER_DST, CHx_CTL.DST_MSIZE = 16个数据项,CHx_SAR =0x1007(源未对齐),CHx_DAR = 0xF008(目标对齐)。
- 从Source获取目标请求的字节数(DST_REQ_DATA) = CHx_CTL.DST_MSIZE * CHx_CTL.DST_TR_WIDTH=16 *8= 128字节
- 可以从源获取第一个目标请求的数据= (DST_REO_DATA/CHx_CTL.SRC_TR_WIDTH)* CHx_CTL. RC_TR_WIDTH-源未对齐的字节= (128/8) * 8 - 7= 121字节
- 从前面的例子中可以看到,源需要为第一个目标请求获取7个字节以上的数据——这是因为源传输未对齐。因此,DW_axi_dmac获取额外的sre_single_size_bytes (CHx_CTL.SRC_TR_WIDTH)数据来补偿未对齐的字节。
- 当涉及到内存时,支持传输类型和流控制器的组合不对齐传输—MEM_TO_PER_DST,当目的地是流控制器时。
- 当源或目标的多块类型为连续时,后续块的初始地址根据以下公式计算(SAR/DAR的不对齐特性也导致后续块的初始地址不对齐):
- Source连续:Next CHx_SAR = Current CHx_SAR (Aligned) + blk_size_bytes_dst_u + Source Unaligned bytes
- Destination连续:Next CHx_DAR = Current CHx_DAR + blk_size_bytes_dst_u
传输完成前暂停和禁用通道
暂停和禁用通道:
- 1. 按照通道挂起中的步骤1到4进行操作。
- 2. 要使用软件禁用挂起的通道,在DW_axi_dmac断言CHx_IntStatusReg之后,向通道启用寄存器(DMAC_ChEnReg)中的通道启用位(CH_EN)写入0。
- CH_SUSPENDED位改为1,表示该通道被挂起。当CHx_CTL.SRC_TR_WIDTH < CHx_CTL.DST_TR_WIDTH和DMAC_ChEnReg.CH_SUSP位为高时,通道FIFO中可能仍有数据,但不足以形成一次CHx_CTL.DST_TR_WIDTH的传输。在这种情况下,一旦通道被禁用,通道FIFO中剩余的数据就不会传输到目标外设而丢失。
- 3.DW_axi_dmac设置CHx_IntStatusReg.CH_DISABLED位为1,表示通道被禁用。
- 4. DW_axi_dmac生成一个CH_DISABLED中断(如果它没有被屏蔽)。
- 5. DW_axi_dmac清除DMAC_ChEnReg.CH_EN位到0。
传输完成前不挂起禁用通道
禁用通道不挂起:
- 1. 软件向通道启用寄存器DMAC_ChEnReg中的通道启用位CH_EN写入一个0。
- 2. DW_axi_dmac在完成源外设上发起的所有AXI传输后,会优雅地停止来自源外设的所有传输。
- 注意:如果通道FIFO已满,而目标外设没有请求数据传输,DW_axi_dmac就不能在相应的主机接口上接收更多数据,这可能导致死锁。由源/目标/LLI状态机发起的请求,并且出现在主机接口读地址通道和写地址通道fifo中,将在AXI主机接口上发送,即使通道暂停请求被发起,也将在AXI主机接口上发送。基于主机接口读地址和写地址通道FIFO深度配置,最多可以发起8个读/写请求,DW_axi_dmac也会在暂停通道之前等待这些请求的数据/响应。
- 3.DW_axi_dmac将通道FIFO中的所有数据传输到目标外设。如果CHx_CTL.SRC_TR_WIDTH小于CHx_CTL.DST_TR_WIDTH和DMAC_ChEnReg.CH_EN位低,信道FIFO中可能仍有数据,但不足以形成一次CHx_CTL.DST_TR_WIDTH的传输。在这种情况下,一旦通道被禁用,通道FIFO中剩余的数据就不会传输到目标外设而丢失。
- 4. DW_axi_dmac清除通道锁定并重置CHx_CFG寄存器中的通道锁定设置。
- 5. DW_axi_dmac设置CHx_IntStatusReg。ChLock_Cleared位为1,表示通道锁定被清除。
- 6. DW_axi_dmac设置CHx_IntStatusReg。CH_DISABLED位为1,表示通道被禁用。
- 7. DW_axi_dmac生成一个CH_DISABLED中断(如果它没有被屏蔽)。
- 8. DW_axi_dmac清除DMAC_ChEnReg。CH_EN位到0。
- Note:DMAC_ChEnReg.CH_EN,
一旦软件启动一个通道禁用程序,写一个0到DMAC_ChEnReg.CH_EN通道启用位,在DW_axi_dmac断言CHx_IntStatusReg.CH_DISABLED位之前,写一个1到DMAC_ChEnReg.CH_EN位重新使能通道是不允许的。DW_axi_dmac忽略这个写操作。
通道异常中止
- 终止通道不是建议的过程。只有当软件想要禁用一个通道而不复位整个DW_axi_dmac时,才应该使用此过程,例如,某个特定通道由于没有收到相应握手接口的响应而挂起。在中止通道之前,建议您首先尝试禁用通道。中止一个通道的过程如下:
- 1. 软件写一个1到通道启用寄存器的通道中止位DMAC_ChEnReg.CH_ABORT。
- 2. DW_axi_dmac在完成源/目标外设上发起的所有AXI传输后,会优雅地停止来自源/目标外设的所有传输。
- 3.通道FIFO中的数据被刷新,实际上丢失了。
- 4. DW_axi_dmac清除通道锁定并复位CHx_CFG寄存器中的通道锁定设置。
- 5. DW_axi_dmac设置CHx_IntStatusReg.ChLock_Cleared位改为1,表示通道锁定被清除。
- 6. DW_axi_dmac设置CHx_IntStatusReg。CH_ABORTED位改为1,表示通道被中止。
- 7. 如果DW_axi_dmac没有被屏蔽,则会生成CH_ABORTED中断。
- 8. DW_axi_dmac清除DMAC_ChEnReg.CH_EN位到0。
上下文敏感的低功耗选项
为了满足系统对高性能带宽的要求,DMA控制器必须在高频率下工作。这增加了DMA控制器的总体功耗。因此,在体系结构级别上减少功耗变得非常重要。本节描述DW_axi_dmac中包含的体系结构低功耗技术。DW_axi_dmac支持上下文敏感低功率选项,这是一种智能低功率逻辑,可以在各种场景下自动感知多个DMA通道、从总线接口和AXI主机接口通道中的空闲时间。这切断了这些模块的时钟,并显著降低了总体功耗。该逻辑足够快,可以在检测到任何活动时向这些模块提供时钟,而不会影响性能。这个上下文敏感的低功率选项是通过配置参数DMAX_CSLP_EN启用的。您可以通过以下参数为DMA通道、从总线接口和AXI主机接口启用或禁用此上下文敏感的低功耗技术选项:
- DMA通道上下文敏感低功耗技术- DMAX_CHNL_CSLP_EN
- 从总线接口上下文敏感的低功耗技术- DMAX_SBIU_CSLP_ENAXI
- 主机接口上下文敏感低功耗技术- DMAX_MXIF_CSLP_EN
- 以下部分描述了DMA通道、从总线接口和AXI主机接口模块中使用的上下文敏感的低功耗技术。
- Note:上下文敏感的低功耗特性添加了一个基于锁存器的时钟门控单元(DW_axi_dmac_clkgate_cell),这是时钟门控单元的行为模型。
- 在综合过程中,必须将该时钟门控单元行为模型替换为技术特定的基于锁存器的集成时钟门控(ICG)单元。
DMA通道上下文敏感低功耗技术
DMA Channel是负责控制诸如以下等操作的主要模块:
- 从源读取数据
- 读取的数据在通道FIFO中的临时存储
- 将数据写入目标
- 处理各种操作,如中断处理,握手处理
- 通道特定寄存器读写操作
- LLI获取和回写操作
- 通道暂停操作
- 信道中止操作等等
- 由于所有这些操作,该模块消耗大量的面积共享,因此它比DW_axi_dmac中的任何其他模块消耗更多的功耗。因此,优化该模块的功耗变得非常重要。
- 上下文敏感低功耗选项通过使用DMA通道低功耗状态机监视DMA通道上的活动。每当检测到DMA通道低功耗条件时,DMA通道低功耗延迟计数器启动。通道低功耗状态机等待直到DMA通道延迟计数器过期,在计数器过期后,DMA通道通过门控化dma_core_clk进入低功耗状态。它一直保持这种状态,直到在DMA通道上检测到任何活动。在某些情况下,如果在DMA通道低功耗延迟计数器运行时检测到活动,则重置DMA通道延迟计数器并停止,直到再次检测到低功耗条件。
- 以下是用来确定DMA Channel是否空闲的条件:
- DW_axi_dmac从复位中出来,没有写入或读取特定于通道的寄存器。DMA Channel为DMA操作而配置,并且通道已启用——DMA Channel通过握手信号或通过通道特定的软件握手寄存器等待握手接口上的任何活动。
- DMA通道被配置为DMA操作并且通道被启用——DMA通道源、目标或LLI状态机已经请求了AXI主机接口,但是它正在等待来自AXI主机接口仲裁者的授权(因为其他DMA通道源、目标和LLI状态机也在竞争AXI主机接口授权)。DMA通道在连续的DMA块之间被禁用,或者在传输完成之前通道被禁用。
- 根据通道暂停过程来暂停DMA通道
- 基于异常通道中止过程,DMA通道被中止。
- 通过DMAC_CFGREG.DMAC_EN禁用整个DMAC。
- DMAC软件复位后,DMAC_RESETREG.DMAC_RST被断言。
- 基于前面描述的空闲条件,DMA通道低功率计数器启动。如果DMA Channel低功耗延迟计数器过期,则相应的DMA Channel进入低功耗状态。以下是DMA通道退出低功耗状态的条件:
- 任何读/写传输都发生在任何DMA通道特定的寄存器(如CHx_SAR,CHx_DAR, CHx_BLOCK_TS, CHx_CTL, CHx_CFG等等)。
- 通过所述握手信号或通过所述通道特定的软件握手寄存器检测所述握手接口上的活动。
- DMA Channel源、目标或LLI状态机已被授予对AXI Master接口的访问权。
- 通过写入CHx_INTCLEARREG寄存器来清除特定于通道的中断。
- 在通道的上升或下降边缘启用DMAC_CHENREG.CHx_EN或DMAC_CFGREG.DMAC_EN。
- 在通道的上升或下降边缘上暂停或通道中止。
- 在断言的DMAC软件复位上
- 下文敏感的低功耗选项可以通过配置参数DMAX_CHNL_CSLP_EN启用。DMA通道低功耗延迟计数器加载值可以通过DMAC_LOWPOWER_CFGREG.CHNL_LPDLY寄存器字段配置。参数DMAX_GLCH_LPDLY用于配置DMAC_LOWPOWER_CFGREG.CHNL_LPDLY字段默认加载值。
从机总线接口上下文敏感低功耗技术
- 从总线接口模块用于通过外部AHB主机接口访问DW_axi_dmac的内部寄存器。上下文敏感低功耗选项的实现是为了优化从总线接口模块的功耗。上下文敏感低功耗选项基于SBIU状态机监视从机总线接口上的活动。每当检测到从总线接口低功耗条件时(即当没有AHB读或写传输正在进行且SBIU状态机处于IDLE状态时),SBIU低功耗延迟计数器就会启动。当SBIU低功耗延迟计数器到期时,从总线接口模块通过门控hclk或dma_core_clk(基于时钟模式配置)进入低功耗状态。它一直保持这种状态,直到从总线接口上检测到活动的读或写传输。在某些场景下,如果在SBIU低功耗延迟计数器运行时检测到活动传输,则SBIU延迟计数器将复位并停止,直到再次检测到低功耗条件。如果在从总线接口模块处于低功率状态时检测到读或写传输,则上下文敏感的低功耗逻辑立即响应,通过取消hclk或dma_core_clk退出低功耗状态。由于低功耗退出操作发生在一个时钟周期内,因此该体系结构的主要优点如下:
- 不需要额外的寄存器来缓冲传输控制信息
- 不需要插入等待周期
- 从总线接口模块进入Low Power状态时的情况:
- 没有活动的AHB读写传输正在进行,SBIU低功耗延迟计数器已过期
- 从机总线接口模块退出Low Power状态时的情况:启动任何AHB读或写传输
- 上下文敏感的低功率选项可以通过配置参数DMAX_SBIU_CSLP_EN启用。SBIU低功耗延迟计数器加载值可以通过DMAC_LOWPOWER_CFGREG.SBIU_LPDLY 寄存器段配置。
- DMAX_SBIU_LPDLY 用于配置DMAC_LOWPOWER_CFGREG.SBIU_LPDLY字段的默认加载值。
AXI主机接口上下文敏感的低功耗技术
- AXI主机接口模块实现了AXI总线在内存和外设之间传输数据。由于AXI总线以高频率工作以满足带宽需求,这导致了功耗的增加。上下文敏感低功耗选项在AXI主机接口中实现,以优化AXI主机接口模块的功耗。上下文敏感的低功耗选项分别为以下每个AXI通道实现:
- 写地址通道,写数据通道,写响应通道,读地址,读数据通道
- 每当检测到AXI通道低功耗条件时,相应的AXI通道低功耗延迟计数器就会启动。AXI低功耗逻辑等待直到AXI通道延迟计数器过期,在计数器过期后,AXI通道通过门通aclk_mi和/或dma_core_clk(基于时钟模式配置)进入低功耗状态。它一直保持这种状态,直到在各自的AXI通道上检测到任何活动。在某些情况下,如果在AXI Channel低功耗延迟计数器运行时检测到活动,则重置并停止AXI Channel延迟计数器,直到再次检测到低功耗条件。
- 以下是用来确定AXI通道是否空闲的条件:
- AXI通道FIFO为空,没有数据执行AXI传输
- 时钟模式同步:dma_core_clk域的FIFO标志为空
- 时钟模式异步:来自dma_core_clk和aclk_mi域的FIFO标志都为空
- 以下是DMA通道退出低功耗状态的条件:
- 数据被推入AXI通道FIFO:
- AW通道,W通道,AR通道:低功耗逻辑足够快,一旦它检测到来自DMA通道的push,就退出低功耗状态。这种逻辑确保了不需要额外的缓冲来避免由于退出低功耗状态的延迟而导致的push损失。如前所述,低功耗逻辑是为每个AXI通道分别实现的。
- B通道,R通道:低功耗逻辑足够快,一旦检测到来自基于bvalid/rvalid逻辑的AXI通道的push,就会退出低功耗状态。这种逻辑确保不需要额外的缓冲来避免由于退出低功耗状态的延迟而导致的push损失。如前所述,低功耗逻辑是为每个AXI通道分别实现的。
- 断言MAC软件复位
- 上下文敏感的低功耗选项可以通过配置参数DMAX_MXIF_CSLP_EN启用。可以通过DMAC_LOWPOWER_CFGREG.MXIF_LPDLY寄存器字段配置AXI Channel低功耗延迟计数器加载值。参数DMAX_MXIF_LPDLY.MXIF_LPDLY字段。用于配置DMAC_LOWPOWER_CFGREG的默认加载值。
全局上下文敏感低功耗技术
- 全局上下文敏感低功耗技术基于DMA通道、从总线接口和AXI主机接口空闲状态实现低功耗选项。如果所有提到的模块都指示DW_axi_dmac处于Idle状态,则启动全局低功耗延迟计数器。全局上下文敏感低功耗逻辑等待直到低功耗延迟计数器过期,在计数器过期后,DW_axi_dmac通过对所有模块(如dma_core_clk、hclk和/或aclk_mi)设置时钟门,进入低功耗状态(基于时钟模式配置)。它保持在低功耗状态,直到在前面提到的任何一个模块上检测到任何活动。在某些情况下,如果在全局低功耗延迟计数器运行时检测到某个活动,则重置全局延迟计数器并停止,直到再次检测到低功耗条件。上下文敏感的低功耗选项可以通过配置参数DMAX_CSLP_EN启用。全局低功耗延迟计数器加载值可以通过DMAC_LOWPOWER_CFGREG.GLBL_LPDLY寄存器字段配置。参数DMAX_GLCH_LPDLY.GLBL_LPDLY字段用于配置DMAC_LOWPOWER_CFGREG的默认加载值。
- AXI 未对齐传输支持
- DW_axi_dmac 支持在 AXI 主机接口上生成未对齐的 DMA 传输。 可以通过可配置参数 DMAX_UNALIGNED_XFER_EN 启用此功能。
- DW_axi_dmac 组件支持向后兼容性,即使不需要此功能,旧的驱动程序和寄存器编程也无需任何更改即可工作。
AXI Unaligned Transfer说明
- 未对齐的内存访问在基于 AXI 的系统中很常见,其中内存访问地址未与传输宽度的自然边界对齐。 DW_axi_dmac 支持在 AXI 主机接口上生成未对齐的内存 DMA 传输。 此功能支持消除了以下内存访问限制:
- ■ 源 AXI 数据传输 - SAR 地址必须与源传输宽度对齐,即 CHx_CTL.SRC_TR_WIDTH(AXI 总线 arsize)
- ■ 目标AXI 数据传输——DAR 地址必须与目标传输宽度对齐,即CHx_CTL.DST_TR_WIDTH(AXI 总线 awsize)。
- 因此,您可以使用任何地址对 CHx_SAR 和 CHx_DAR 寄存器进行编程,并且它可以与内存访问的源或目标传输宽度不对齐或对齐。 对于涉及内存访问的 CHx_CFG.TT_FC 组合(MEM_TO_PER_DMAC、PER_TO_MEM_DMAC、PER_TO_MEM_SRC、MEM_TO_PER_DST),支持未对齐访问。
- DW_axi_dmac 处理数据的打包和解包,考虑到源和目标传输中的未对齐偏移。 从未对齐的源事务接收到的数据被打包以与 FIFO 宽度对齐,然后存储在 FIFO 中。 在目标端,数据从 FIFO 中读取,并根据 CHx_DAR 寄存器和目标传输宽度进行解包。 目标传输的无效字节通过将相应的写选通驱动为 0 来使无效。以下部分提供有关基于 DMA、源或目标作为流控制器的未对齐传输的更多详细信息。
DW_axi_dmac 作为流量控制器
- CHx_BLOCK_TS 寄存器的定义保持不变,编程到 BLOCK_TS 字段中的数字表示在 DMA 块传输中要传输的数据宽度 CHx_CTL.SRC_TR_WIDTH 的总数。 如果源地址未对齐,则源中未对齐的字节被认为是在 DMA 块传输中传输的总字节数中派生的。计算未对齐传输的块中传输的有效字节总数的公式如下:
- blk_size_bytes_dma_u = (CHx_BLOCK_TS.BLOCK_TS * src_single_size_bytes) - 源未对齐字节
- ■ DW_axi_dmac 从源获取blk_size_bytes_dma_u 字节的数据,并根据CHx_DAR 寄存器将所有字节传输到目标。
- ■ 目标未对齐字节不会增加或减少传输的有效字节数
- 在 DMA 块中。 只有源未对齐字节会影响 DMA 块中传输的总字节数。
- ■ 未对齐传输支持传输类型和流控制器的组合,只要涉及内存(MEM_TO_MEM_DMAC、MEM_TO_PER_DMAC、PER_TO_MEM_DMAC)。
- ■ 当多块类型对于源或目标是连续的时,后续块的初始地址计算如下(SAR/DAR 的未对齐性质也导致后续块初始地址未对齐):
- ❑ 源连续:下一个 CHx_SAR = 当前 CHx_SAR + blk_size_bytes_dma_u
- ❑ 目标连续:下一个 CHx_DAR = 当前 CHx_DAR + blk_size_bytes_dma_u + 目标未对齐字节
Source为Flow Controller
- 计算未对齐传输的块传输中传输的有效字节总数的公式如下:
- blk_size_bytes_src_u =(块中的源突发事务数 * src_burst_size_bytes)+(块中的源单个事务数 * src_single_size_bytes)-源未对齐字节
- ■ DW_axi_dmac 从源获取blk_size_bytes_src_u 字节的数据,并根据CHx_DAR 寄存器将所有字节传输到目标。
- ■ 目标未对齐字节不会增加或减少DMA 块中传输的有效字节数。 只有源未对齐字节会影响 DMA 块中传输的总字节数。
- ■ 未对齐传输支持传输类型和流控制器的组合,只要涉及内存 - PER_TO_MEM_SRC,当源是流控制器时。
- ■ 当源或目标的多块类型为连续时,后续块的初始地址计算如下(SAR/DAR 的未对齐性质也导致后续块初始地址未对齐): □ 源连续:下一个 CHx_SAR = 当前 CHx_SAR + blk_size_bytes_src_u
- ❑ 目标连续:下一个 CHx_DAR = 当前 CHx_DAR + blk_size_bytes_src_u + 目标未对齐字节
Destination是Flow Controller
- 计算未对齐传输的块传输中传输的有效字节总数的公式如下:
- blk_size_bytes_dst_u =(块中目标突发事务的数量 * dst_burst_size_bytes)+(块中目标单个事务的数量 * dst_single_size_bytes)-目标未对齐字节
- ■ DW_axi_dmac 始终向目标提供blk_size_bytes_dst_u 字节的数据。
- ■ 如果源地址未对齐,则DW_axi_dmac 获取额外的src_single_size_bytes 以补偿源未对齐的字节并为块的目标提供blk_size_bytes_dst_u 字节。
- ❑ 除此之外,在少数情况下,当目标未对齐时,DW_axi_dmac 从源中获取 ceil(目标未对齐字节/src_single_size_bytes)数量的附加数据。
- ❑ 例如,如果 CHx_CTL.SRC_TR_WIDTH = 64 位,CHx_CTL.DST_TR_WIDTH = 64 位,
- CHx_CFG.TT_FC = MEM_TO_PER_DST,CHx_CTL.DST_MSIZE = 16 个数据项,CHx_SAR = 0x1007(源未对齐),CHx_DAR = 0xF008(目标已对齐)。
- ■ 要从源中为目标请求获取的字节数 (DST_REQ_DATA)
- = CHx_CTL.DST_MSIZE* CHx_CTL.DST_TR_WIDTH
- = 16*8
- = 128 字节
- ■ 可以从第一个目标请求的源获取数据
- = (DST_REQ_DATA/CHx_CTL.SRC_TR_WIDTH)* CHx_CTL.SRC_TR_WIDTH - 源未对齐字节
- =(128/8)*8 - 7
- = 121 字节
- 在前面的示例中,由于源传输未对齐,源需要为第一个目标请求获取 7 个字节的数据。 因此,DW_axi_dmac 获取额外的 src_single_size_bytes (CHx_CTL.SRC_TR_WIDTH) 数据以补偿未对齐的字节。
- ■ Transfer Type和Flow Controller的组合支持未对齐传输
- 只要涉及内存 - MEM_TO_PER_DST,当 Destination 是 Flow Controller 时。
- ■ 当源或目标的多块类型为连续时,后续块的初始地址根据以下公式计算(SAR/DAR 的未对齐性质也会导致后续块初始地址未对齐):
- ❑ 源连续:下一个 CHx_SAR = 当前 CHx_SAR(对齐)+ blk_size_bytes_dst_u + 源未对齐字节
- ❑ 目标连续:下一个 CHx_DAR = 当前 CHx_DAR + blk_size_bytes_dst_u
AXI 未对齐传输示例
- 以下示例解释了如何使用不同的配置和编程选项处理源和目标上的未对齐传输。
- ■ 配置参数:
- ❑ DMAX_M_DATA_WIDTH - AXI 主机接口数据总线宽度。
- ❑ DMAX_CH(x)_FIFO_WIDTH(内部参数)- 通道 x FIFO 宽度,(DMAX_M_DATA_WIDTH, DMAX_CHx_STW, DMAX_CHx_DTW) 的函数。
- ❑ DMAX_STATIC_ENDIAN_SELECT_MSTIF 和 DMAX_ENDIAN_FORMAT_MSTIF – 字节顺序选择
- ■ 编程寄存器:
- ❑ CHx_SAR - DMA 传输的源地址寄存器
- ❑ CHx_DAR——DMA 传输的目的地址寄存器
- ❑ CHx_CTL.SRC_MSIZE——源突发交易长度。 每个宽度 CHx_CTL.SRC_TR_WIDTH
- ❑ CHx_CTL.DST_MSIZE——目的地突发交易长度。 每个宽度 CHx_CTL.DST_TR_WIDTH
- ❑ CHx_CTL.SRC_TR_WIDTH - 源传输宽度(arsize)。
- ❑ CHx_CTL.DST_TR_WIDTH - 目标传输宽度 (awsize)。
- ❑ CHx_CFG.TT_FC——传输类型和流量控制。
- 在以下示例中,假设,
- ■ DMA 突发/单个事务的每一行都可以通过单个AXI 传输或基于DMAX_CHx_MAX_AMBA_BURST_LENGTH 和CHx_CTL.ARLEN/CHx_CTL.AWLEN 的突发传输来完成。
- ■ 这些示例中显示的未对齐传输只是对应于特定块的DMA 突发/单个事务。 整个 DMA 传输可能有多个块。
- ■ 默认的字节顺序是从little-endian 到little-endian,除非另有明确指定。
- ■ 有关 DMA 传输中传输的字节数的信息,请参见第 86 页上的“AXI 未对齐传输支持”部分。
- 惯例
- 以下是用于 DMA 传输字节的约定。
如果源和/或目标传输未对齐,则源和目标传输的 AXI 突发类型必须为 INCR(CHx_CTL.SINC/DINC 编程为 0)。 在这种情况下,源和目标的突发类型不能被编程为 FIXED。 由于以下原因,在系统级别不需要 FIXED 未对齐传输支持:
■ FIXED 传输指向FIFO。 但是这些 FIFO 没有选通信号来选择性地写入字节。
■ 未对齐的FIXED 传输对系统带宽利用率有很深的影响,从而影响系统性能。
例如,如果源传输宽度为 512,并且源未对齐 63。那么接收到的每个 AXI 节拍只有一个字节。 这导致对带宽利用率的重大影响。
例1
假设, ■ 源地址与源传输宽度未对齐 ■ 目标地址与目标传输宽度未对齐 表 2-5 描述了本示例考虑的所有主要 DMA 参数设置。
表 2-5 示例 1 - 配置和编程选项
在此示例中,单源突发事务被转换为多突发/单一事务——即使以下编程选项保持不变:
■ 来源和目的地事务长度
■ 源和目标传输宽度相同
这是由于未对齐的源地址。 图 2-35 显示了源传输所在的源地址
0x0001 未对齐。 这个未对齐的源传输有 4 个节拍,AWSIZE 为 3,即 8 个字节。 在接收到的第一个数据节拍中,最低有效字节被忽略,因为地址未与一个字节对齐。 如图 2-34 所示,所有其他字节都被打包到 FIFO 中。
图 2-36 显示了目标地址未对齐的目标传输 - 0x9007。 这个未对齐的目标传输有五个节拍,AWSIZE 为三个,即八个字节。 在生成的第一个写入数据节拍中,只有最高有效数据字节有效,因为地址未与七个字节对齐,并且写入选通被断言为 0x80(因为只有最高有效字节有效)。 对于所有其他写数据节拍,写选通被断言为 0xFF,因为所有字节都有效 - 除了最后一个写数据节拍。 对于最后一个写入数据节拍,只有较低的 6 个数据字节有效,其他两个字节无效 - 因此 strobe 被断言为 0x3F。
例2
假使,假设
■ 源地址未与源传输宽度对齐
■ 目标地址与目标传输宽度对齐
表 2-6 描述了本示例考虑的所有主要 DMA 参数设置。
例3
假设,
■ 源地址与源传输宽度对齐
■ 目标地址与目标传输宽度未对齐
表 2-7 描述了本例考虑的所有主要 DMA 参数设置。
例4
假设,
■ 源地址与源传输宽度未对齐,
■ 目标地址也未与目标传输宽度对齐
■ 源传输宽度与多源突发/单 DMA 事务的主机接口数据总线宽度不同
表 2-8 描述了本例考虑的所有主要 DMA 参数设置。
例5
假设,
■ 源地址与源传输宽度未对齐
■ 目标地址也未与目标传输宽度对齐
■ 目标传输宽度与具有多个目标突发/单个 DMA 事务的主机接口数据总线宽度不同
表 2-9 描述了本例考虑的所有主要 DMA 参数设置。
例6
假使,
■ 源地址未与源传输宽度对齐
■ 目标地址也未与目标传输宽度对齐
■ 源和目标传输宽度与具有多个源突发/单个DMA 事务的主机接口数据总线宽度不同。
表 2-10 描述了本示例考虑的所有主要 DMA 参数设置。
例 7
假设,
■ 源地址未与源传输宽度对齐
■ 目标地址也未与目标传输宽度对齐
■ 源和目标传输宽度与具有多个源突发/单个 DMA 事务的主机接口数据总线宽度不同
表 2-11 描述了本例考虑的所有主要 DMA 参数设置。
例8
假设,
■ 源地址与源传输宽度未对齐
■ 目标地址与目标传输宽度对齐
■ 源和目标字节序是大端字节序
表 2-12 描述了本示例考虑的所有主要 DMA 参数设置。
例 9
假设,
■ 源地址与源传输宽度未对齐
■ 目标地址也未与目标传输宽度对齐
■ 源和目标字节序是大端字节序
表 2-13 描述了本示例考虑的所有主要 DMA 参数设置
例10
假设,
■ 源地址与源传输宽度对齐
■ 目标地址与目标传输宽度未对齐
■ 源和目标字节序是大端字节序
表 2-14 描述了本示例考虑的所有主要 DMA 参数设置。
例 11
假设,
■ 源地址与源传输宽度未对齐
■ 目标地址也未与目标传输宽度对齐
■ 源传输宽度与多源突发/单 DMA 事务的主机接口数据总线宽度不同
■ 源和目标字节序是大端字节序
表 2-15 描述了本示例考虑的所有主要 DMA 参数设置。
在“示例11”中,数据字节3与数据字节4、5和6打包形成源传输宽度的数据项。 该数据项用于执行小端转换,如图 2-14 所示,即数据项的所有字节都被翻转。 对后续字节继续类似的操作。
BE-LE 转换使用 BE-8(字节不变)方法用于 64 位数据总线(字访问)
例 12
假设,
■ 源地址与源传输宽度未对齐
■ 目标地址也未与目标传输宽度对齐
■ 源和目标传输宽度与主机接口数据总线宽度不同
■ 源和目标字节序是大端字节序
表 2-16 描述了本示例考虑的所有主要 DMA 参数设置。
在“示例12”中,数据字节3与数据字节4、5和6打包形成源传输宽度的数据项。 该数据项用于执行大端转换(如图 2-14),即翻转数据项的所有字节。 对后续字节继续类似的操作。
通道暂停、禁用和中止
在正常操作下,软件通过向通道启用寄存器 DMAC_ChEnReg.CH_EN 写入 1 来启用通道,硬件通过清除 DMAC_ChEnReg.CH_EN 寄存器在传输完成时禁用通道。
在传输完成之前,软件可以暂停、禁用或中止通道。 挂起、禁用和中止过程将在以下部分进行说明。
通道暂停
要在 DMA 传输期间暂停通道:
1. 软件将 1 写入通道使能寄存器 DMAC_ChEnReg 中的通道暂停位 CH_SUSP。
2. 在源外设上启动的所有 AXI 传输完成后,DW_axi_dmac 优雅地停止来自源外设的所有传输。
3. DW_axi_dmac 将 CHx_IntStatusReg.CH_SRC_SUSPENDED 位设置为 1,以指示源数据传输已暂停并在未被屏蔽时生成中断。
4. DW_axi_dmac 将通道 FIFO 中的所有数据传输到目标外设。
当 CHx_CTL.SRC_TR_WIDTH < CHx_CTL.DST_TR_WIDTH 且
DMAC_ChEnReg.CH_SUSP 位为高,通道 FIFO 中可能仍有数据,但不足以形成 CHx_CTL.DST_TR_WIDTH 的单次传输。 如果稍后恢复通道,通道 FIFO 中剩余的数据将传输到目标,这会导致通道 FIFO 中填充更多数据。
5. DW_axi_dmac 清除通道锁定并重置 CHx_CFG 寄存器中的通道锁定设置。
6. DW_axi_dmac 将 CHx_IntStatusReg.ChLock_Cleared 位设置为 1,以指示通道锁定已清除。
7. DW_axi_dmac 将 CHx_IntStatusReg.CH_SUSPENDED 位设置为 1,以指示通道已挂起。
8. DW_axi_dmac 生成一个 CH_SUSPENDED 中断(如果它没有被屏蔽掉)。
通道暂停后,软件可能会在一段时间后恢复通道,或禁用通道
通道暂停和恢复
暂停和恢复频道:
1. 按照通道暂停中的步骤 1 到 4 进行操作。
2. 软件将 0 写入通道使能寄存器 DMAC_ChEnReg 中的通道暂停位 CH_SUSP。
3. DW_axi_dmac 从暂停点恢复 DMA 传输。
2.18.3 传输完成前通道暂停和禁用
暂停和禁用频道:
1. 按照通道暂停中的步骤 1 到 4 进行操作。
2. 要使用软件禁用挂起的通道,在 DW_axi_dmac 将 CHx_IntStatusReg.CH_SUSPENDED 位置为 1 以指示通道挂起后,将 0 写入通道启用寄存器 (DMAC_ChEnReg) 中的通道启用位 (CH_EN)。
当 CHx_CTL.SRC_TR_WIDTH < CHx_CTL.DST_TR_WIDTH 且DMAC_ChEnReg.CH_SUSP 位为高,通道 FIFO 中可能仍有数据,但不足以形成 CHx_CTL.DST_TR_WIDTH 的单次传输。
在这种情况下,一旦通道被禁用,通道 FIFO 中的剩余数据不会传输到目标外设并丢失。
3. DW_axi_dmac 将 CHx_IntStatusReg.CH_DISABLED 位设置为 1 以指示通道已禁用。
4. DW_axi_dmac 产生一个CH_DISABLED 中断(如果它没有被屏蔽掉)。
5. DW_axi_dmac 将 DMAC_ChEnReg.CH_EN 位清零。
传输完成前通道禁用无暂停
要在不挂起的情况下禁用通道:
1. 软件将 0 写入通道使能寄存器 DMAC_ChEnReg 中的通道使能位 CH_EN。
2. 在源外设上启动的所有 AXI 传输完成后,DW_axi_dmac 优雅地停止来自源外设的所有传输。
- 如果通道FIFO 已满且目标外设未请求数据传输,则DW_axi_dmac 无法在相应的主机接口上接收更多数据,这可能会导致死锁。
- 由源/目标/LLI 状态机发起并存在于主机接口读地址通道和写地址通道 FIFO 中的请求将在 AXI 主机接口上发送,即使通道暂停请求被发起也是如此 . 基于主机接口读取地址和写入地址通道 FIFO 深度配置,最多可以发起 8 个读/写请求,并且 DW_axi_dmac 也在挂起通道之前等待这些请求的数据/响应。
3. DW_axi_dmac将通道FIFO中的所有数据传输到目标外设。
如果 CHx_CTL.SRC_TR_WIDTH 小于 CHx_CTL.DST_TR_WIDTH 且 DMAC_ChEnReg.CH_EN 位为低,则通道 FIFO 中可能仍有数据,但不足以形成 CHx_CTL.DST_TR_WIDTH 的单次传输。
在这种情况下,一旦通道被禁用,通道 FIFO 中的剩余数据不会传输到目标外设并丢失。
4. DW_axi_dmac 清除通道锁定并重置 CHx_CFG 寄存器中的通道锁定设置。
5. DW_axi_dmac 将 CHx_IntStatusReg.ChLock_Cleared 位设置为 1,以指示通道锁定已清除。
6. DW_axi_dmac 将 CHx_IntStatusReg.CH_DISABLED 位设置为 1 以指示通道已禁用。
7. DW_axi_dmac 产生一个 CH_DISABLED 中断(如果它没有被屏蔽掉)。
8. DW_axi_dmac 将 DMAC_ChEnReg.CH_EN 位清零。
- 一旦软件通过向通道启用位 DMAC_ChEnReg.CH_EN 写入 0 来启动通道禁用程序,在 DW_axi_dmac 断言 CHx_IntStatusReg.CH_DISABLED 位不允许之前,向 DMAC_ChEnReg.CH_EN 位写入 1 以重新启用通道。 DW_axi_dmac 忽略这个写操作。
通道异常中止
不建议中止通道。 仅当软件想要禁用通道而不重置整个 DW_axi_dmac 时才应使用此过程,例如,如果特定通道由于未收到来自相应握手接口的响应而挂起。 在中止通道之前,建议您首先尝试禁用通道。
要中止通道:
1. 软件将 1 写入通道启用寄存器 DMAC_ChEnReg 中的通道中止位 CH_ABORT。
2. 在源/目标外设上启动的所有 AXI 传输完成后,DW_axi_dmac 优雅地停止来自源/目标外设的所有传输。
3. Channel FIFO 中的数据被刷新,基本上丢失了。
4. DW_axi_dmac 清除通道锁定并重置 CHx_CFG 寄存器中的通道锁定设置。
5. DW_axi_dmac 将 CHx_IntStatusReg.ChLock_Cleared 位设置为 1,以指示通道锁定已清除。
6. DW_axi_dmac 将 CHx_IntStatusReg.CH_ABORTED 位设置为 1 以指示通道中止。
7. DW_axi_dmac 如果没有被屏蔽掉就会产生CH_ABORTED 中断。
8. DW_axi_dmac 将 DMAC_ChEnReg.CH_EN 位清零。
DMAC保持控制
DW_axi_dmac 支持冻结操作。 这通过使用 I/O 上的两个信号 dmac_hold_req 和 dmac_hold_ack 来支持。dmac_hold_req 信号是将 DW_axi_dmac 置于保持(冻结)模式的请求。 断言此请求会将整个 DW_axi_dmac 置于冻结模式,而不会违反 AXI 协议。 DW_axi_dmac 在进入保持模式后置位 dmac_hold_ack。
将 DW_axi_dmac 置于保持模式:
1. 外部设备(主设备)置位 dmac_hold_req 以将 DW_axi_dmac 置于保持模式。
2. DW_axi_dmac 停止来自所有通道的源外设的所有传输。
- DW_axi_dmac 不会在 AXI 读地址通道上发起任何新的读请求。
- 一旦接收到arready_mN,DW_axi_dmac 就取消声明arvalid_mN 输出。
- DW_axi_dmac 取消置位 rready_mN 输出,以便在 AXI 读取数据通道上没有接收到新数据,因此没有新数据写入通道 FIFO。
3. DW_axi_dmac 停止所有通道的目标外设的所有传输,这意味着以下内容为真:
- DW_axi_dmac 不在 AXI 写地址通道上发起任何新的写请求。
- 当收到awready_mN 和wready_mN 时,DW_axi_dmac 取消断言awvalid_mN 和wvalid_mN 输出。
- 当 AXI 写入数据通道上的数据传输完成时,DW_axi_dmac 取消断言 bready_mN 输出。
4. 通道FIFO 不保证清空。 进入保持模式后,通道FIFO中可能仍有数据。
5. DW_axi_dmac 置位 dmac_hold_ack 以指示进入保持模式。
6. 要退出 DMAC 保持模式,可以在 DW_axi_dmac 置位 dmac_hold_ack 之后置低 dmac_hold_req。
7. 在 dmac_hold_req 被取消声明后,DW_axi_dmac 取消声明 dmac_hold_ack。
3 外部存储器接口
外部存储器接口概述
每个通道都有专用的 FIFO 用于数据存储。FIFO 存储器的尺寸可配置,宽度最高支持 512 位,深度最高支持 256。DW_axi_dmac 通道 FIFO 存储器使用基于触发器的存储器。如果在内存维度较大的情况下使用基于触发器的内存,则面积和功率效率不高。
External Memory 接口通过 SRAM、Register File 等外部存储器优化 DMAC 通道 FIFO 存储器,以实现面积和功耗优化。
DW_axi_dmac 的 QoR 可以通过使用 SRAM 实现通道 FIFO 存储器或基于寄存器文件的存储器以实现更大的存储器尺寸来显着提高。此功能为每个通道提供单独的外部存储器接口,以将基于 SRAM 或寄存器文件的存储器连接到通道 FIFO。外部存储器接口还允许您通过此外部存储器接口连接基于触发器的存储器。当通道 FIFO 存储器尺寸较小且基于触发器的存储器比 SRAM 或基于寄存器文件的存储器具有更高的 QoR 效率时,这是有益的。
DMA 通道从源读取数据并将数据临时存储在通道 FIFO 中。然后,DMA 通道从 FIFO 存储器中读取数据并写入目标。这种读写操作可以并行工作。可以根据 QoR 要求使用双端口寄存器文件、SRAM 或触发器存储器。
一般而言,Register File 或 SRAM 使用同步读取时序,读取数据在读取使能有效后的下一个周期内有效。如前所述,可以使用不同的 FIFO 存储器类型。例如,基于触发器的存储器可用于较小的存储器尺寸;寄存器文件或 SRAM 可用于更大的内存尺寸。但是,无论采用哪种类型,都应该使用同步读取时序。
添加 DMAX_CH_MEM_EXT 参数以选择内部通道 FIFO 存储器接口方案或外部通道 FIFO 存储器接口方案。
此参数还支持顶层值,即通道 FIFO 内存在 DW_axi_dmac 的顶层上实例化。
出于时序考虑,添加了所有通道都使用的 DMAX_CH_MEM_REGOUT 参数。当 DMAX_CH_MEM_REGOUT 参数设置为 1 时,会在内部添加一个流水线寄存器,用于在内部 FIFO 控制逻辑对内存读取数据进行采样之前。在这种情况下,读取数据有两个时钟周期延迟。
4 BCM 库组件
5 实例
HWHC: Hardware handshake channel
在设计中,I2C、13C、SPLM、SPLS、UART设备可以使用DMA,并通过硬件握手信道HWHC与DMA直接交互,以进一步减少数据传输的CPU使用。由于AHB DMA的硬件握手通道HWHC有限,需要一个多路复用器在这些外设的硬件握手信道HWHC之间进行选择。本文件将该多路复用器称为AHB DMAC HWCH MUX多路复用器,并描述了该多路复用的实现。
在设计中,总共有5个12C devices、6个I3C devices、3个SPIM devices、3个SPIS devices、2个UART devices和19个外设。这些devices可能需要在各自的使用场景中与AHB DMAC交互。即,使用AHB DMAC将数据传输到这些外设,或将数据从这些外设传输到其他地址空间。
当CPU使用DMA将数据传输到外设或从外设传输数据时,需要通过响应中断和配置寄存器来执行流控制,这些操作可能会降低CPU的效率。为了提高效率,在CPU执行指令或者数据运算,即总线没有被占用的时候,硬件握手可用于外设和AHB DMAC之间的直接通信,通过这种方式,可以进一步减少CPU使用。
设计中有19个外设需要与AHB DMAC握手。每个外设的TX和RX信道都有独立的硬件信道用于与AHB-DMAC握手,但AHB-DMA最多只能提供16个硬件握手信道。这些信道称为HWCH0-HWCH1…和HWCH 15。为了解决此问题,需要在外设的38个硬件握手通道和AHB DMAC的16个握手通道之间添加多个多路复用器。添加这些多路复用器AHB DMAC HWCH MUX后,CPU可以选择性地允许某些设备通过硬件握手信道与AHB DMAC进行交互。
主要功能
总共8个外设可以同时连接到AHB DMA(每个外设的两个硬件信号通道将同时连接)。这8个外设备包括3个12C或I3C、2个UART和3个SPIM或SPIS Explorer,有5个12C(12C_[0-4])和6个13C(I3C_[0-5]))。具有相同下标号的两个I2C和I3C设备的硬件握手通道不能同时连接到AHB DMAC。例如,12C_0和13C_0不能同时与AHB DMAC执行硬件握手。在满足上述约束的条件下,可以选择任何3个I2C或I3C设备使用AHB DMAC进行硬件握手,有3个SPIM(SPIM_[0-2])和3个SPIS(SPIS_[0-2])。具有相同下标号的两个SPIM和SPIS设备的硬件握手信道不能同时连接到AHB DMAC。例如,SPIM_ 0和SPIS_0不能同时与AHB DMAC执行硬件握手,在满足上述约束的条件下,可以选择任意3个SPIM或SPIS设备与AHB DMA进行硬件握手。Explorer中两个UART的硬件握手信道连接到AHB DMAC.
AHB-DMAC HWCH MUX的硬件结构图如前面的框图部分所示。
首先,HWCH MUX不会处理UART的硬件握手信号。两个UART的总共4个硬件握手信号直接连接到AHB DMAC。
第二,3个SPIM和3个SPIS使用3个2对1 MUX共享6个AHB DMAC硬件握手信道,具有相同下标号的SPIM和SPIS设备不能同时将硬件握手接口连接到AHB DMAC。例如,SPIM0和SPIS0将无法同时通过硬件接口与AHB DMAC交互。设备(SPIS或SPIM)的两个硬件握手信道(来自设备的发送TX和接收RX部分)将同时连接到AHB DMAC。
第三,5个I2C和6个I3C使用两级MUX结构来选择访问AHB DMAC的设备。在第一级MUX中,将从11个设备中选择6个设备。5个2对1 MUX用于选择12C_[0-4]和I3C_[0-4]中的5个设备。该级别的选择规则是不能同时选择具有相同编号的12C和13C。因为I3C5没有相应的I2C5,将直接用作在第一级中选择的6个设备之一。在第二级多路复用器中,在第一级选择的6台设备中的任何3台将被选择访问AHB DMAC,AHB DMAC HWCH多路复用器将外围硬件握手接口连接到AHB DMAC的硬件握手信道HWCH X。当使用AHB DMAC向或从外设传输数据时,您需要为使用硬件握手的传输指定硬件握手信道的编号(该信道连接到外围)。该编号是HWCH的编号X.
事实上,如上图所示,AHB DMAC内的HWCH MUX和MUX形成两级映射,将外围硬件握手通道与实际AHB DMAC数据传输通道相关联。
DMA=Direct Memory Access。这是一种通过硬件实现的数据传输机制。简单的说,就是不在CPU的参与下完成数据的传输。
DMA是一种硬件设备。这种设备的工作原理是这样的:
——首先CPU告诉DMA设备,要有一堆数据需要传输,为了效率而请它出马。(DMA请求)
——DMA收到CPU的消息,开始准备。此时CPU把数据源地址、数据目标地址、传输数据量、传输模式等等参数告诉它。(DMA初始化)
——DMA初始化完,向CPU发送消息“借你的总线用一用,我要开始传输数据了!”(总线出借,DMA启动)
——CPU收到消息后,暂时切断自己与总线的联系。DMA开始传输数据。(DMA数据)
——DMA传输完数据之后,向CPU发送消息“搞定了!总线还给你。”(总线归还)
——CPU说:“干得好!老将出马一个顶俩!辛苦了,你先歇着吧。”DMA设备停止。CPU该干啥干啥。
由于是硬件实现的,所以DMA的速度非常快。快到什么程度呢?在DS上,尤其是数据量非常大的时候,相比于CPU当中介,效率能够提高一百万倍以上。
由于DMA的速度是如此之快,所以大量的数据传输,一般都要求使用DMA。