1.今日摸鱼计划

学习PS与PL之间的交互

Xilinx 官方提供了许多可进行协议转换的 IP 核,如 DMA、VDMA、AXI-FIFO-MM2S、AXI-Datamover等。这些 IP 核都能对 AXI4-Stream 协议 进行转换,实现 PS 与 PL 间数据的交互。其中的 DMA IP 核在嵌入式开发中属于 较常用的一个 IP 核,常常被用于在系统内存和基于 AXI4 流的目标 IP(如 AXI 以太网)之间提供高速数据移动。
学一下AXI DMA基础

小梅哥教材:

03_【裸机教程】基于C编程的Zynq裸机程序设计与应用教程v2.4.5.pdf

17.1 AXI DMA 简介

2. 简单学习一下

系统内存和传输的目标之间主要通过高速 DMA数据传输,数据之间的流向是 :
        ① AXI4 读数据的主端口到 AXI4 内存映射流(Memory-Mapped To Stream,MM2S);
        ② 通过数据流到内存映射(Stream To Memory-MappedS2MM)从外设写入到内存中
AXI DMA 还支持在分散/聚集模式下,MM2S S2MM 路径上最多 16 个多通道的数据传输。
MM2S 通道和 S2MM 通道独立运行。
AXI DMA 提供 4KB 地址边界保护(在非 Micro DMA中配置时)、自动突发映射以及使用 AXI4-Stream 总线的几乎全部带宽功能对多个传输请求进行排队的能力。
此外,AXI DMA 提供字节级数据重新对齐,允许从任何字节偏移位置开始进行内存读取和写入。
MM2S 通道支持用于将用户应用数据发送到目标 IP AXI 控制流。
对于S2MM 通道,提供了一个 AXI 状态流,用于从目标 IP 接收用户应用数据。

2.1 AXI DMA 设计样例

该设计中AXI DMA工作在SG模式(Scatter-Gather分散-聚集)下,AXI Ethernet可以切换为用户系统,
各个接口对应功能如下:
        处理器、中断控制、 DDR 控制器通过AXI interconnect连接到 AXI4-Lite 接口,对 DMA 进行控制。
        MM2S Read 负责读出 DDR 中映射单元的数据到 DMA 中。
        S2MM Write 负责将数据从 DMA 写入到 DDR 的映射单元中。
        Master Strm 接口负责将数据从 DMA 发送到具有 Stream IP 接口。
        S2MM Strm 负责从具有 Stream 接口的 IP 中将数据读入 DMA
        MM2S_IntrOut 中断:DMA 完成读出 DDR 中数据并发送到具有 Stream 接口的 IP 操作时产生。
        S2MM_IntrOut 中断:DMA 完成从有 Stream 接口的 IP 中读入数据,并写到内存映射单元时产生。
        SG R/WCtr StrmStatus Strm SG 模式下的三个接口

2.2 时钟与时钟模式

        m_axi_mm2s_aclk:用于 MM2S 接口
        m_axi_s2mm_aclk:用于 S2MM 接口
        s_axi_lite_aclk:用于 AXI4-Lite 控制接口
        m_axi_sg_clk:用于 SG 接口

①同步时钟

m_axi_sg_aclkm_axi_mm2s_aclkm_axi_s2mm_aclk:同一个时钟源
s_axi_lite_aclk 可以连接到频率更低的时钟

②异步时钟

s_axi_lite_aclk 必须小于或等于 m_axi_sg_aclk
m_axi_sg_aclk 必须小于或等于 min{m_axi_mm2s_aclk ,m_axi_s2mm_aclk }

2.3 工作模式

Direct Register Mode (Simple DMA)

直接寄存器模式(简单 DMA模式,SG引擎禁用): MM2S和 S2MM 通道上简单 DMA 传输。
只需较少FPGA资源,通过访问 DMACR、源地址或者目的地址和长度寄存器发起 DMA 的传输。
当传输完成后,如果使能了产生中断输出, DMASR 寄存器相关联的通道位会有效,即产生中断输出。
MM2S 信道 
        a.设置运行/停止位为 1 (MM2S_DMACR.RS=1),启动 MM2S。
           停止位(DMASR.Halted)应该取消上拉,表示 MM2S 通道正在运行。
        b.可以通过向 MM2S_DMACR.IOC_IrqEn MM2S_DMACR.Err_IrqEn写1启用中断。
            当 AXI DMA 配置为 Direct Register 模式时,延迟中断、延迟计数和阈值计数不被使用。
        c.将有效的源地址写入 MM2S_SA 寄存器。
           如果为AXI DMA 分配的地址空间大于 32,则对 MM2S_SA MSB 寄存器进行编程。
           如未将AXI DMA 配置为数据重新对齐,则必须对齐有效地址,否则将出现未定义的结果。
           对齐与否的判定内容基于数据流的宽度。
           当在 Micro 模式下配置 AXI DMA 时,需要指定正确的地址。
        d.MM2S_LENGTH寄存器中写入要传输的字节数。必须最后写入
           MM2S_LENGTH 从 MM2S AXI4 接口读取,并从 MM2S AXI4- stream 接口输出。
           在 Micro DMA 下,此值不能超过[突发长度*(内存映射数据宽度)/8]
S2MM 信道
        a. 开启/使能 S2MM 通道
        b. 如果需要,可以使能中断
        c. 写一个有效的源地址到 S2MM_SA 寄存器
            如果没有使能 DRE(Data Realignment Engine,数据重对齐引擎) 功能,
            在指定起始地址时,要注意字节地址对齐,哪些地址对齐不对齐取决于 Stream 流的数据位宽。
        d. 写传输的字节数到 LENGTH 寄存器。必须最后写入
            长度为 0 无效,而非 0 的值决定存储器映射到 Stream 流的数据个数。

Scatter/Gather Mode  需要进行大量数据传输的场合

        S/G 模式从设置控制寄存器描述符指针开始。
        传输的基本参数BD(Buffer Descriptor)存储到内存中。
        通过 SG 的接口进行加载和更新 BD 的状态从而进行对指定的位置的数据进行读写操作。

MM2S 信道 

        a. 将起始描述符的地址写入当前描述符寄存器。
        如果 AXI DMA 被配置为大于 32 的地址空间,那么也对当前描述符的 MSB 32 位进行编程。
        b. 设置运行/停止位为 1 (MM2S_DMACR.RS=1),启动 MM2S 通道运行。
            停止位(DMASR.Halted)应该取消上拉,表示 MM2S 通道正在运行。
        c. 可以通过向 MM2S_DMACR.IOC_IrqEn MM2S_DMACR.Err_IrqEn 写1 启用中断。
        d. 向尾部描述符寄存器写入一个有效地址。
            如果 AXI DMA 被配置为大于32 的地址空间,那么也对当前描述符的 MSB 32 位进行编程。
        e. 写入尾部描述符寄存器会触发 DMA 开始从内存中获取描述符。
            在多通道配置的情况下,描述符的获取在数据包到达 S2MM 通道时开始。
        f. 对获取的描述符进行处理,从内存中读取数据,然后输出到 MM2S 流通道。

S2MM 信道

        a. 将起始描述符的地址写入当前描述符寄存器。
            如果 AXI DMA 被配置为大于 32 的地址空间,那么也对当前描述符的 MSB 32 位进行编程。
        b. 设置运行/停止位为 1 (S2MM_DMACR.RS=1),启动 S2MM 通道运行
            停止位(DMASR.Halted)应该取消上拉,表示 S2MM通道正在运行。
        c. 可以通过向 S2MM_DMACR.IOC_IrqEn 和 S2MM_DMACR.Err_IrqEn 写1 启用中断。
        d. 向尾部描述符寄存器写入一个有效地址。
            如果 AXI DMA 被配置为大于 32 的地址空间,那么也对当前描述符的 MSB 32 位进行编程。
        e. 写入尾描述符寄存器将触发 DMA 开始从内存中获取描述符。
        f. 对获取的描述符进行处理,并将从 S2MM 流通道接收的任何数据写入内存。

Cyclic DMA Mode

在循环模式下,DMA 无中断地获取和处理相同的 BDsDMA 会一直获取和处理,直到停止或重置。

Tail BD 指向第一个 BD
尾描述符寄存器没有任何用途,仅用于触发 DMA 引擎。
遵循 S/G 模式中提到的相同编程顺序,确保设置了控制寄存器中的循环位。
可以使用一些不属于 BD 链的值对尾部描述符寄存器进行编程,如 0x50
在尾部描述符寄存器编程后,DMA 开始获取和处理 BDs(以环形方式设置),直到 DMA 停止或重置。

2.4 直接寄存器模式对应寄存器空间

偏移地址 名称 描述
00h
MM2S_DMACR MM2S DMA 控制寄存器
04h
MM2S_DMASR
MM2S DMA 状态寄存器
18h
MM2S_SA
MM2S 32 位源地址
1Ch
MM2S_SA_MSB
MM2S 32 位源地址
28h MM2S_LENGTH MM2S 传输长度(Byte
30h S2MM_DMACR S2MM DMA 控制寄存器
34h S2MM_DMASR S2MM DMA 状态寄存器
48h S2MM_DA S2MM 32 位目的地址
4Ch S2MM_DA_MSB S2MM 32 位目的地址
58h S2MM_LENGTH S2MM 缓冲区长度(Byte
这些寄存器共有三种访问类型,分别为:只读(RO)、可读写(R/W)、读或写清除(R/WC)。
只读寄存器,向其中某位写入值不会产生任何影响;
读或写清除寄存器,向对应位写入 1 将会清除该位。

DMACR 控制寄存器)

字段 默认 类型 描述
0 RS 0 R/W
1运行/0停止控制
当前DMA 操作完成时 DMA 停止。
对于直接寄存器模式,挂起的命令/传输被刷新或完成, AXI4-Stream 输出可能被提前终止。当 DMA 引擎停止时,DMA 状态寄存器中的停止位为 1。 发生错误时,该位由 AXI DMA 硬件清零。 CPU 也可选择清除该位来停止 DMA 操作。
DMA 引擎开始操作时,状态寄存器停止位变 0
1 保留 1 RO 写入无影响,读取始终为 1
2 Reset 0 R/W
 DMA 核的软复位,挂起的命令/传输可能被刷新或完成, AXI4-Stream 输出可能会提前终止。
设置该位为 1 会重置整个 AXI DMA 引擎。软复位完成后,所有寄存器和位都处于复位状态。
0 正常操作   1 复位
3 Keyhole 0 R/W 直接寄存器模式下该位将不起作用
4

Cyclic BD

Enable

0 R/W
设置为 1 时,DMA工作在循环 DMA模式。
该位应在 DMA 空闲或未工作时设置,否则会导致意外行为。DMA 在多通道模式下运行时,该位不起作用。
11-5 保留 0 RO 写入无影响,读取始终为 0
12 IOC_IrqEn 0 R/W
完成时中断 (IOC) 中断使能。
设置为 1 时,允许DMASR.IOC_Irq 为设置了 IOC 位的描述符生成中断输出。
0  IOC 中断不使能
1  IOC 中断使能
13 Dly_IrqEn 0 R/W
延迟定时器中断 中断使能。
设置为 1 时,允许DMASR.Dly_Irq 生成中断输出。
DMA 被配置为直接寄存器模式时,该位无效
14
Err_IrqEn
0 R/W
错误中断 中断使能。
15
保留
0 RO
写入无影响,读取始终为 0
23-16
IRQ Threshold
01h R/W
中断阈值, 该值用于设置中断阈值。
IOC 中断事件发生时,内部计数器从中断阈值设置开始倒计时。
当计数达到零时,DMA 引擎会产生中断输出。
该位设置的最小值为0x01。
当被配置为直接寄存器模式时,该位将被忽略
31-24
IRQDelay
00h R/W
中断延时超时,该值用于设置中断超时值。
中断超时机制使 DMA 引擎在延迟时间段到期后产生中断,计数器在收到新数据包或发生超时事件时重置。
1 超时间隔 = 125*SG 时钟周期
设置 0 将禁用中断。
直接寄存器模式时,该字段将会被忽略

DMASR 状态寄存器)

字段 默认 类型 描述
0
Halted
1 RO
DMA 通道停止,DMA 通道的运行/停止状态。
0 运行 1停止
直接寄存器模式,当 DMACR.RS = 0 并且 DMA 操作停止时,该位被设置。
在 DMACR.RS = 0 DMASR.Halted = 1 之间可能存在时间延迟。
1
Idle
0 RO
DMA 通道空闲。 指示 AXI DMA 操作的状态。
直接寄存器模式,不同值代表的含义如下:
0 = Not Idle,传输未完成
1 = Idle,传输已完成且控制器已暂停
当通道停止 (DMASR.Halted=1) 时,该位为 0
直接寄存器模式时,该位不使用并固定为 0
2 保留 0 RO 写入无影响,读取始终为 0
3
SGIncld
C_
INCLUDE
_SG
RO
1 = S/G 使能
0 = S/G 不使能
4
DMAIntErr
0 RO
DMA 内部错误。
0 无内部错误,1 检测到内部错误,引擎停止
直接寄存器模式时,该位不使用并固定为 0
5
DMASlvErr
0 RO
DMA 从机错误。
如果从存储器映射接口读取的从器件发出从器件错误,则会发生此错误,导致 AXI DMA 停止。 DMACR.RS 位设置为 0,当引擎完全关闭时,DMASR.Halted 位设置为 1
0 无从机错误,1从机错误,引擎停止。
6
DMADecErr
0 RO
DMA 解码错误。
地址请求指向无效地址, AXI DMA停止。 DMACR.RS 位设置为 0,当引擎完全关闭时,DMASR.Halted 位设置为 1
0 无解码错误,1 解码错误,引擎停止。
7 保留 0 RO 写入无影响,读取始终为 0
8
SGIntErr
0 RO
SG 内部错误。
直接寄存器模式时,该位不使用并固定为 0
9
SGSlvErr
0 RO
SG 从机错误。
直接寄存器模式时,该位不使用并固定为 0
10
SGDecErr
0 RO
SG 解码错误。
直接寄存器模式时,该位不使用并固定为 0
11 保留 0 RO 写入无影响,读取始终为 0
12
IOC_Irq
0
R/WC
完成中断。
当直接寄存器模式设置为 1 时,表示在完成传输时产生了中断事件。
如果在 MM2S_DMACR (IOC_IrqEn = 1) 中启用了相应位并且如果已满足中断阈值,则会导致从AXI DMA 生成中断输出。
IOC 中断,1 IOC 中断。
向该位写入 1 将清除它。
13
Dly_Irq
0
R/WC
延迟中断。
0 无延迟中断,1 延迟中断。
向该位写入 1 将清除它。
直接寄存器模式时,该位不使用并固定为 0
14
Err_Irq
0
R/WC
错误中断。
设置为 1 时,表示发生错误时产生中断事件。 如果在 MM2S_DMACR (Err_IrqEn = 1)中启用相应位,则从 AXI DMA 生成中断输出。
0 无错误中断,1 错误中断。
向该位写入 1 将清除它。
15 保留 0 RO 写入无影响,读取始终为 0
23-16
IRQ ThresholdSts
01h RO
中断阈值状态。 指示当前中断阈值。
仅在启用 Scatter Gather 时适用。
31-24
IRQ DelaySts
00h RO
中断延迟时间状态。 表示中断延迟时间值。
仅在启用 Scatter Gather 时适用。

MM2S_SA  MM2S_SA_MSB(MM2S DMA源地址寄存器)

字段 默认 类型 描述
31-0 Source Address 0
R/W
指示 AXI DMA 读取的源地址以将数据传输到MM2S 通道上的 AXI4-Stream 接口。
如含数据重对齐引擎,源地址可以是任何字节偏移。如不含,源地址必须与 MM2S Memory Map 数据宽度对齐。

字段 默认 类型 描述
31-0 Source Address 0
R/W
指示 AXI DMA 读取的源地址的 MSB 32 位,以将数据传输到 MM2S 通道的 AXI4-Stream 接口。
如含数据重对齐引擎,源地址可以是任何字节偏移。如不含,源地址必须与 MM2S Memory Map 数据宽度对齐。

S2MM_DA S2MM_DA_MSB(S2MM DMA目的地址寄存器)

字段 默认 类型 描述
31-0
Destination
Address
0
R/W
指示 AXI DMA 写入的目标地址,以在 S2MM 通道上从 AXI4-Stream 传输数据。
如含数据重对齐引擎,源地址可以是任何字节偏移。如不含,源地址必须与 MM2S Memory Map 数据宽度对齐。

字段 默认 类型 描述
31-0
Destination
Address
0
R/W
指示 AXI DMA 写入的目标地址的 MSB 32 位,以在 S2MM 通道上从 AXI4-Stream 传输数据。
如含数据重对齐引擎,源地址可以是任何字节偏移。如不含,源地址必须与 MM2S Memory Map 数据宽度对齐。

LENGTH 传输长度寄存器)

字段 默认 类型 描述
25-0 Length 0
R/W
通道传输的字节数。 写入非零值启动传输。
31-26 保留 0 RO 写入无影响,读取始终为 0

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐