当前位置: 首页 > news >正文

Zynq7000--AXI CDMA + BRAM 从PS侧DDR搬运数据记录

目录

  • 前言
      • 核心特性
      • 为什么需要 CDMA?
  • 1. CDMA
    • 1.1 原理
      • 对比:自己运 vs 快递代劳
    • 1.2 IP 配置与使用流程
      • 关键配置选项解析
        • 1. DMA 工作模式
        • 2. 4K 边界检查(Allow Unaligned Transfers 相关)
        • 3. 非对齐传输选项
        • 4. 传输数据宽度与突发长度
        • 5. 数据预取缓冲(FIFO 缓存)
      • 操作步骤
    • 1.3 寄存器使用
      • 2.1 CDMACR 寄存器(0x00)
        • 使用注意事项
        • 错误中断说明(Bit 14)
      • 2.2 CDMASR 寄存器(0x04)
        • 使用注意事项
      • 2.3 CURDESC_PNTR 寄存器(0x08)
        • 关键操作条件
        • 使用注意事项
      • 2.4 TAILDESC_PNTR 寄存器(0x10)
        • 关键操作条件
        • 核心机制
        • 使用注意事项
      • 2.5 SA 寄存器(源地址 - 0x18h)
        • 核心说明
        • 使用注意事项
      • 2.6 DA 寄存器(目的地址 - 0x20h)
        • 使用注意事项
      • 2.7 BTT 寄存器(传输长度 - 0x28h)
        • 传输触发机制
        • 错误场景
        • 使用注意事项
    • 3. 总结:Simple DMA 传输完整流程
      • 3.1 核心思路
      • 3.2 配置步骤
      • 3.3 小结

前言

AXI CDMA 是基于 AXI4 协议的 DMA 控制器 IP,主要用于实现内存到内存内存到外设的大规模数据搬运,全程无需 CPU 参与,从而显著提升系统效率。

核心特性

  • 定位明确:AXI CDMA 是专门做【Memory-Mapped → Memory-Mapped】地址到地址拷贝的 DMA,没有 AXI-Stream 接口。
  • 适用场景适合 DDR↔DDR、DDR↔BRAM、DDR↔PL 寄存器模块这类地址映射型数据搬移。

为什么需要 CDMA?

在传统系统中,CPU 需要通过软件指令逐字节复制数据(如内存间大文件拷贝),消耗大量计算资源。CDMA IP 通过硬件级 DMA 代替 CPU 完成数据搬运,释放 CPU 算力用于核心任务处理,将 CPU 从冗余的数据搬运中解放出来(如摄像头采集数据存入 DDR),使其专注算法或其他任务处理。

1. CDMA

1.1 原理

我们可以用快递寄东西来直观理解 AXI CDMA 的工作原理,整个过程分为四步:

快递流程AXI CDMA 对应操作
📞下单:打电话给快递公司CPU 告诉 AXI CDMA 要传输数据
📝填单:告诉快递员取货地址(山东)、收货地址(北京)、箱子数量设置源地址、目标地址、传输长度
🚚自动搬运:快递车直接到山东装货,全程走高速送到北京DMA 从内存读数据,通过 AXI 总线传输,完全不用 CPU 动手
🔔签收提醒:快递小哥打电话告诉你“送到了”DMA 发中断通知 CPU 传输完成

AXI CDMA 这个 IP 就像专业快递:你只管下单,脏活累活它全包,速度快还省力!

对比:自己运 vs 快递代劳

方式特点
自己运(CPU 搬运)费力、耗时、耽误其他事(CPU 被占用)
快递代劳(AXI CDMA)你喝茶等结果就行(CPU 解放出来处理其他任务)

1.2 IP 配置与使用流程

关键配置选项解析

在 Vivado 中配置 AXI CDMA IP 时,除了工作模式外,还有几个关键选项需要理解清楚。下面逐一解析:

1. DMA 工作模式

AXI CDMA 支持两种工作模式:

  • Simple DMA(简单模式):仅支持寄存器直控方式,每次传输都需要 CPU 通过寄存器配置源地址、目标地址和传输长度。
  • Scatter Gather(SG 模式):支持链表描述符自动传输,CPU 只需维护描述符链表,CDMA 会自动按链表依次执行多次传输,大幅减少 CPU 干预。
2. 4K 边界检查(Allow Unaligned Transfers 相关)

AXI 协议要求突发传输(Burst)不能跨越 4KB 地址边界(如0x1000 → 0x1FFF)。若传输范围跨越边界,CDMA 会自动拆分成多个突发操作。

如果禁用 4K 边界检查,则允许单次突发传输直接跨越 4KB 边界,无需拆分,适用于大块连续数据的一次性传输。

注意:禁用 4K 边界检查可提升 DMA 效率,但要求系统内存物理连续且无访问保护。根据 PG034 手册描述,禁用 4K 边界检查时带宽利用率可达≥95%;而启用 4K 边界检查时,带宽利用率约为≤85%

3. 非对齐传输选项

非对齐传输是指源地址或目的地址未按数据总线宽度对齐的内存访问操作。AXI 协议要求突发传输的起始地址必须按数据宽度对齐,例如:

  • 若 AXI 总线数据宽度为 128 bit,则地址需满足Addr % 16 = 0,如0x10000x1010等。
  • 若起始地址为0x1005,则属于非对齐访问。
4. 传输数据宽度与突发长度

Write/Read data width、Write/Read Burst Size 这两个参数直接决定 AXI 传输的效率:

  • 传输数据宽度:AXI 总线单次传输的数据位宽(如 32/64/128 bit)。
  • 突发长度(Burst Length):一次突发传输中包含的数据传输次数。

两者共同决定了单次突发传输的数据总量,合理配置可显著提升传输效率。

5. 数据预取缓冲(FIFO 缓存)

该选项决定数据是否在传输前先在 FIFO 内缓存,即在传输开始前完整读取源数据到内部缓冲区,再写入目标地址。

  • 优点:避免读写并行时源数据被意外修改(如 CPU 更新缓冲区)导致的数据损坏。
  • 代价:会增加数据传输的延时。

Simple DMA 模式是 CDMA 最基础的工作方式:在此模式下,CDMA 执行完一个编程的 DMA 命令后即停止,需要外部 AXI4 主机为每个所需的 DMA 操作重新设置 CDMA 寄存器。

操作步骤

在简易操作模式下,配置并启动一次 CDMA 数据传输的标准化流程如下:

  1. 确认空闲:检查CDMASR.IDLE寄存器状态为 1,验证当前 DMA 处于空闲状态。
  2. 配置中断:将中断控制寄存器CDMACR.IOC_IrqEn位(第 12 位)置为逻辑有效电平,启用传输完成中断机制;可选配置CDMACR.ERR_IrqEn位以激活错误异常中断功能。
  3. 设置源地址:将正确的传输源地址写入源地址寄存器(SA),须确保其地址空间指向有效的数据缓冲区且数据已就绪;若地址总线位宽超过 32 位,需同步配置SA_MSB高位扩展寄存器。
  4. 设置目标地址:设定目标地址寄存器(DA),若地址位宽超限则需补充DA_MSB高位寄存器的写入操作。
  5. 设置传输长度:定义传输字节数并写入突发传输长度寄存器(BTT),单次最大传输容量为 8,388,607(8M)字节(DataMover Lite 模块场景除外),完成写入后会触发传输启动指令。
  6. 等待传输完成:通过轮询机制监测CDMASR.IDLE位直至返回空闲状态(值为 1),或在启用中断场景下等待 CDMA 模块输出完成中断信号(需满足CDMACR.IOC_IrqEn=1)。
  7. 解析中断类型:若采用中断响应模式,需解析中断状态寄存器以判定中断类型(传输正常结束或异常事件触发)。
  8. 清除中断标志:通过向CDMASR.IOC_Irq状态标志位写入逻辑 1 执行中断清除操作。
  9. 准备下一次传输:完成当前传输周期后,若需执行新传输任务,请返回步骤 1 重新初始化

流程。

1.3 寄存器使用


有了上节的操作步骤,我们还需要了解 CDMA 的寄存器空间。CDMA 一共包含多个寄存器,其中在数据传输过程中最常用的是以下 5 个:

偏移地址寄存器名称作用
0x00CDMACR(控制寄存器)控制 DMA 的启动、复位及中断使能等
0x04CDMASR(状态寄存器)反映 DMA 当前状态(空闲、忙、错误等)
0x18SA(源地址寄存器)设置数据搬运的源地址
0x20DA(目标地址寄存器)设置数据搬运的目标地址
0x28BTT(传输长度寄存器)设置本次传输的字节数

其中0x000x04对应上节操作步骤中反复提到的CDMACRCDMASR,而0x180x200x28则分别对应源地址、目标地址与传输长度,正好覆盖一次完整 DMA 传输所需的全部关键配置。

2.1 CDMACR 寄存器(0x00)

CDMACR 是 CDMA 的控制寄存器,负责配置中断使能、工作模式、软复位等关键功能。其各 bit 位含义如下:

Bit 位字段名称默认值访问类型适用模式描述
31-24IRQDelay00h读写SG中断延迟超时:传输结束后启动计时器,超时后触发中断;新传输或超时事件会重置计时器。设为 0 禁用延迟中断;不启用 SG 模式时此设置无效。
23-16IRQThreshold01h读写SG中断阈值:每完成一次传输(IOC 事件),计数器从阈值递减至 0 时触发中断。最小值 0x01(写 0x00 无效);不启用 SG 模式时此设置无效。
15保留0只读-保留位,始终读为 0。
14Err_IrqEn0读写所有模式错误中断使能:控制是否允许CDMASR.Err_Irq标志触发中断。1 = 使能;0 = 禁用。
13Dly_IrqEn0读写SG延迟中断使能:控制是否允许CDMASR.Dly_Irq(延迟超时中断)触发中断。仅 SG 模式有效;1 = 使能;0 = 禁用。
12IOC_IrqEn0读写所有模式传输完成中断使能:控制是否允许CDMASR.IOC_Irq(传输完成中断)触发中断。1 = 使能;0 = 禁用。
11-6保留0只读-保留位,始终读为 0。
5KeyHoleWrite0读写所有模式固定地址写模式使能:设为 1 启用 AXI 固定地址写突发(Key Hole 模式)。传输中不可更改;启用时需设置突发长度(Max Burst Length)为 16;从设备需支持此功能。
4KeyHoleRead0读写所有模式固定地址读模式使能:设为 1 启用 AXI 固定地址读突发(Key Hole 模式)。传输中不可更改;启用时需设置突发长度(Max Burst Length)为 16;从设备需支持此功能。
3SGMode0读写所有模式分散聚集(SG)模式使能:设为 1 启用 SG 模式(需 IP 核支持 SG 引擎)。需在 CDMA 空闲(CDMASR.IDLE=1)时修改;写入新描述符指针后需先置 0 再置 1 以生效。
2Reset0读写所有模式软复位控制:设为 1 启动 CDMA 软复位(完成进行中的传输后复位)。1 = 复位中;0 = 正常运行。复位后所有寄存器恢复默认值。
1TailPntrEn1只读SG尾指针模式状态:指示 SG 引擎尾指针功能是否启用。SG 模式固定为 1;纯简单 DMA 模式时为 0。
0保留0只读-保留位,始终读为 0。
使用注意事项
  • SG 模式专用位IRQDelayIRQThresholdDly_IrqEn仅在启用 SG 引擎时生效。
  • 复位要求:修改SGMode或清除错误状态需满足CDMASR.IDLE=1
  • Key Hole 模式:启用时需确保从设备支持固定地址突发,且突发长度设为 16。
  • SG 指针更新:修改描述符指针后需切换SGMode(0→1)以生效。
  • 中断使能:错误中断(Err_IrqEn)和完成中断(IOC_IrqEn)适用于所有模式。
  • SG 中断触发:需同时满足阈值(IRQThreshold)和使能条件。
错误中断说明(Bit 14)

任何检测到的错误都会导致 AXI CDMA 正常停止。根据 AXI4 协议,所有已通过接受的地址通道传输提交的 AXI 传输都必须完成相关的数据传输。因此,AXI CDMA 在设置CDMASR之前完成所有已提交的 AXI4 传输。当CDMASR.IDLE位设置为 1,AXI CDMA 引擎真正停止。

指向与错误传输相关联的描述符的指针被更新到CURDESC_PNTR寄存器。在检测到多个错误的罕见情况下,只记录其中一个错误的CURDESC_PNTR寄存器。要恢复操作,必须通过硬件重置或向CDMACR写入 1 来向 AXI CDMA 发出重置位。

常见错误类型如下:

错误类型说明
DMAIntErrCDMA 内部错误:检测到 AXI 数据移动器中的内部错误。当 BTT=0 写入主 AXI DataMover 命令输入时,或使用 BTT 字段=0 的 CONTROL 字获取并执行传输描述符时可能发生。
DMASlvErrCDMA 从属设备错误:当传输数据的从属设备以 SLVERR 响应时发生。
DMADecErrCDMA 解码错误:当地址请求指向不存在的地址时发生。
SGIntErr分散聚集内部错误:当 BTT=0 时发生,仅当获取的描述符已设置完整位时才会出现,表明描述符尚未被 CPU 处理,被视为过时。
SGSlvErr分散聚集从属设备错误:当获取和更新描述符的从属设备以 SLVERR 响应时发生。
SGDecErr分散聚集解码错误:当地址请求指向不存在的地址时发生。

2.2 CDMASR 寄存器(0x04)

CDMASR 是 CDMA 的状态寄存器,用于反映 DMA 当前的工作状态、中断标志及错误信息。其各 bit 位含义如下:

Bit 位字段名称默认值访问类型适用模式描述
31-24IRQDelaySts00h只读SG中断延迟时间状态:反映 SG 引擎当前的中断延迟计时器值。仅当启用 SG 模式时有效。
23-16IRQThresholdSts01h只读SG中断阈值状态:反映 SG 引擎当前的中断阈值计数值。仅当启用 SG 模式时有效。
15保留0只读-保留位,始终读为 0。
14Err_Irq0读/写清零Simple 和 SG错误中断标志:置 1 表示因错误条件触发中断事件。若CDMACR.Err_IrqEn=1,则触发中断输出。写 1 清零。0 = 无错误中断;1 = 错误中断激活。
13Dly_Irq0读/写清零SG延迟中断标志:置 1 表示延迟计时器超时触发中断。若CDMACR.Dly_IrqEn=1,则触发中断输出。写 1 清零。SG 模式专用,当CDMACR.SGMode=0时自动清零。
12IOC_Irq0读/写清零Simple 和 SG传输完成中断标志:置 1 表示 DMA 传输完成触发中断。若CDMACR.IOC_IrqEn=1,则触发中断输出。SG 模式下需同时满足中断阈值条件。写 1 清零。0 = 无完成中断;1 = 完成中断激活。
11保留0只读-保留位,始终读为 0。
10SGDecErr0只读SGSG 解码错误:SG 引擎读取/写入传输描述符时发生 AXI 解码错误(访问无效地址)。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。
9SGSlvErr0只读SGSG 从机错误:SG 引擎读取/写入传输描述符时收到 AXI 从机错误响应。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。
8SGIntErr0只读SGSG 内部错误:SG 引擎发生内部错误。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。
7保留0只读-保留位,始终读为 0。
6DMADecErr0只读Simple 和 SGDMA 解码错误:DataMover 访问无效地址时发生 AXI 解码错误。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。
5DMASlvErr0只读Simple 和 SGDMA 从机错误:DataMover 传输时收到 AXI 从机错误响应。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。
4DMAIntErr0只读Simple 和 SGDMA 内部错误:DataMover 遇到内部错误(如写入 BTT=0)。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。
3SGIncld配置决定只读Simple 和 SGSG 引擎使能状态:指示 IP 核是否包含 SG 引擎。0 = 未包含 SG(仅支持简单 DMA);1 = 包含 SG(支持 SG 和简单 DMA)。由 IP 核配置决定,软件可读取此位判断功能。
2保留0只读-保留位,始终读为 0。
1Idle0只读Simple 和 SGCDMA 空闲状态:简单模式下 1 = 传输完成,等待新任务,写 BTT 启动传输;SG 模式下 1 = 所有描述符处理完成,写TAILDESC_PNTR重启 SG 引擎。关键状态位。0 = 运行中;1 = 空闲(传输完成或未开始)。
0保留0只读-保留位,始终读为 0。
使用注意事项
  • 中断标志清除Err_IrqDly_IrqIOC_Irq均为写 1 清零,读取后需主动写 1 清除,避免重复触发中断。
  • 错误状态位SGDecErrSGSlvErrSGIntErrDMADecErrDMASlvErrDMAIntErr均为只读,检测到错误后需通过软/硬复位清除。
  • Idle 位:是判断 DMA 是否空闲的关键状态位,操作步骤中反复提到的CDMASR.IDLE即此位。
  • SGIncld 位:软件可通过读取此位判断当前 IP 核是否支持 SG 模式,从而选择 Simple DMA 或 SG 模式编程流程。

2.3 CURDESC_PNTR 寄存器(0x08)

CURDESC_PNTR 是 CDMA 的当前描述符指针寄存器,用于指示 SG 引擎当前正在处理的描述符地址。其各 bit 位含义如下:

Bit 位字段名称默认值访问类型适用模式描述
31-6当前描述符指针0读/写(RO*)SG当前描述符指针:指示当前正在处理的描述符的指针。在写入TAILDESC_PNTR寄存器之前,此寄存器必须包含指向有效描述符的指针,否则会导致 CDMA 执行未定义的操作。当 CDMA SG 引擎运行(CDMASR.IDLE=0)时,SG 引擎更新CURDESC_PNTR寄存器以反映当前正在执行的描述符的起始地址。检测到错误时,CURDESC_PNTR寄存器将更新为反映与检测到的错误关联的描述符。只有当 AXI CDMA 处于空闲状态(CDMASR.IDLE=1)时,才能通过软件对寄存器进行写入。写入的描述符地址必须与 64 字节边界对齐(16 个 32 位字),示例为0x000x400x80,任何其他对齐方式都会产生未定义的结果。当CDMACR.SGMode=0时,该寄存器被清除。
5-0保留0只读-保留位,始终读为 0,写入无效。
关键操作条件
  • 仅当CDMASR.IDLE=1时可软件写入:空闲状态下才能更新描述符指针。
  • CDMACR.SGMode=0时自动清零:退出 SG 模式后该寄存器被清除。
使用注意事项
  • 64 字节对齐:描述符地址必须为 64 字节对齐(即低 6 位 = 0),例如0x000x400x80,否则不能进行传输。
  • 仅 SG 模式有效:仅当启用 SG 模式(CDMACR.SGMode=1)时有效,简单 DMA 模式下此寄存器被忽略。
  • 错误自动更新:发生错误(如SGDecErr)时,硬件自动更新为触发错误的描述符地址,错误类型在上节已有阐述。
  • 复位清零:软复位(CDMACR.Reset=1)或 SGMode 禁用时,本寄存器清零。

2.4 TAILDESC_PNTR 寄存器(0x10)

TAILDESC_PNTR 是 CDMA 的尾描述符指针寄存器,在 SG 模式中扮演关键角色:它指定描述符链的暂停点,并支持通过写入新指针来重启或扩展任务流。其各 bit 位含义如下:

Bit 位字段名称默认值访问类型适用模式描述
31-6TailDescPtr0读/写(RO*)SG尾描述符指针:指定描述符链的暂停点,SG 引擎处理到与该指针匹配的描述符后暂停获取新描述符。当CDMACR.SGMode=1时,写入新指针会触发 SG 引擎重启处理(从CURDESC_PNTR开始获取描述符)。地址必须 64 字节对齐(0x000x400x80)。
5-0保留0只读-保留位,始终读为 0,写入无效。
关键操作条件
  • 仅 SG 模式有效:该寄存器仅在启用 SG 模式时生效。
  • 地址未对齐将导致未定义行为:写入的指针必须满足 64 字节对齐要求。
  • SG 引擎运行时为只读状态:引擎运行期间软件不可写入。
核心机制
  • 暂停控制:SG 引擎处理到与尾指针匹配的描述符时自动暂停,避免继续处理后续描述符链。
  • 任务重启:当软件写入新指针时(需满足 SG 模式使能且引擎空闲),会触发 SG 引擎从CURDESC_PNTR指定的地址重新开始获取描述符,恢复被暂停的任务流(适用于动态扩展描述符链表场景)。
  • 动态链表管理:通过更新尾指针,实现运行时动态扩展 SG 描述符链表(追加新描述符后更新尾指针即可激活新任务)。
使用注意事项
  • 64 字节对齐:地址必须 64 字节对齐(低 6 位 = 0),否则行为未定义。
  • 重置行为:软复位(CDMACR.Reset=1)或 SGMode 禁用时寄存器清零

2.5 SA 寄存器(源地址 - 0x18h)

SA 是 CDMA 的源地址寄存器,用于指定 DMA 读取数据的起始物理地址。其各 bit 位含义如下:

Bit 位字段名称默认值访问类型适用模式描述
31-0Source Address0x0读/写简单 DMA存放 DMA 读取数据的起始物理地址。必须在写入 BTT 寄存器前配置有效地址。
核心说明
  • 适用模式:仅在Simple(简单)模式下生效;Scatter-Gather(SG)模式下该寄存器不使用,源地址由 BD 描述符提供。
  • 配套寄存器0x1CSA_MSB,当地址空间超过 32 bit 时才需要配置高 32 位地址。
  • 写入前提:必须在CDMASR.Idle=1(CDMA 空闲)时写入,否则写入无效。
  • 启动传输:配置好 SA、DA 后,往 BTT(0x28)写入传输字节数,会直接启动 Simple 模式 DMA 传输。
使用注意事项
  • 配置时序:必须在写入 BTT 寄存器之前配置有效地址,否则传输可能使用无效的源地址。
  • 对齐要求:无强制对齐要求,但建议按数据宽度对齐以优化传输性能。
  • 地址偏移处理:实际传输过程中,地址偏移根据 BTT 和 KeyHole 模式自动处理。
  • 复位清零:软/硬复位后本寄存器清零(重置值 0x0)。

2.6 DA 寄存器(目的地址 - 0x20h)

DA 是 CDMA 的目标地址寄存器,用于指定 DMA 写入数据的目标内存地址。其各 bit 位含义如下:

Bit 位字段名称默认值访问类型适用模式描述
31-0Destination Address0x0读/写简单 DMA数据传输的目标内存地址。必须在写入 BTT 寄存器前配置有效地址。
使用注意事项
  • 配置时序:必须在写入 BTT 寄存器之前配置有效地址,否则传输可能使用无效的目标地址。
  • 对齐要求:无强制对齐要求,但建议按数据宽度对齐以优化传输性能。
  • KeyHole 写模式:若启用 KeyHole 写模式(固定地址突发),地址需符合 AXI 协议要求。
  • 复位清零:软/硬复位后本寄存器清零(重置值 0x0)。

2.7 BTT 寄存器(传输长度 - 0x28h)

BTT 是 CDMA 的突发传输长度寄存器,用于指定本次 DMA 传输的字节数,同时也是 Simple DMA 模式下启动传输的触发开关。其各 bit 位含义如下:

Bit 位字段名称默认值访问类型适用模式描述
31-23保留0只读所有模式保留位,始终读为 0,写入无效。
22-0Bytes_To_Transfer0读/写简单 DMA待传输字节数:写入非零值后,CDMA 立即启动传输(需先配置 SA/DA);传输过程中可读(递减),传输完成时自动清零。最大值:8,388,607 字节(2²³-1)。
传输触发机制
  • Simple DMA 模式:写入 BTT 寄存器是启动传输的唯一方式(需满足CDMASR.IDLE=1)。
  • SG 模式关联:SG 模式下,BTT 由描述符控制,此寄存器无效(忽略写入)。
错误场景
  • 写入 BTT=0
    • 简单模式:触发CDMASR.DMAIntErr(内部错误),引擎停止。
    • SG 模式:描述符中 BTT=0 触发相同错误。
使用注意事项
  • 对齐要求:无强制对齐要求,但实际传输效率受 SA/DA 地址对齐影响(建议按数据宽度对齐)。
  • 重置行为:软复位(CDMACR.Reset=1)或硬复位后清零。
  • 读取行为:传输过程中读取 BTT,会返回剩余未传输完成的字节数;传输完成时自动清零,同时CDMASR.IOC_Irq置位(若使能则触发中断)。

3. 总结:Simple DMA 传输完整流程

到这里,我们已经把 AXI CDMA 的寄存器空间逐一梳理完毕。最后,我们把Simple DMA(寄存器直接模式)的完整配置流程串起来,方便大家在实际开发中对照使用。

3.1 核心思路

Simple DMA 传输的本质,就是通过4 类寄存器完成一次数据搬运:

寄存器偏移作用
CDMACR(控制寄存器)0x00配置工作模式与中断使能
SA(源地址寄存器)0x18指定数据读取的起始地址
DA(目标地址寄存器)0x20指定数据写入的目标地址
BTT(传输长度寄存器)0x28指定传输字节数,写入即启动传输

注意:Simple DMA 模式下,CDMA 必须处于Simple 模式(非 Scatter Gather 模式),即CDMACR寄存器的SGMode位(Bit 3)= 0。

3.2 配置步骤

第一步:配置控制寄存器(CDMACR,0x00

CDMACR 是 Simple 传输的核心控制寄存器,需设置以下位:

  • SGMode(Bit 3)= 0:进入 Simple DMA 模式。
  • IOC_IrqEn(Bit 12)= 1:允许传输完成中断(传输完成时产生中断,方便 CPU 响应)。
  • Err_IrqEn(Bit 14)= 1:允许错误中断(传输过程中发生错误时产生中断)。
  • KeyHoleRead/KeyHoleWrite(Bit 4/5)= 1(可选):若使用固定地址 burst 传输(Key Hole 模式),需开启这两个位,并确保MAX BURST LENGTH = 16

第二步:配置源地址(SA,偏移0x18

将源内存地址写入 SA 寄存器(32 位),该地址是 Simple 传输的读取起点

第三步:配置目标地址(DA,偏移0x20

将目标内存地址写入 DA 寄存器(32 位),该地址是 Simple 传输的写入起点

第四步:配置传输字节数(BTT,偏移0x28

将需传输的总字节数写入 BTT 寄存器(32 位),该值决定了从源地址到目标地址的数据量。例如传输 1KB 数据,写入0x400

第五步:启动传输,等待中断响应

写入 BTT 后,CDMA 立即启动传输。传输完成后,若已使能IOC_IrqEn,则产生传输完成中断,CPU 在中断服务程序中响应即可。

3.3 小结

Simple DMA 模式是 AXI CDMA 最基础、最常用的工作方式,只需4 个寄存器 + 5 步配置即可完成一次高效的数据搬运。相比 CPU 逐字节拷贝,CDMA 将 CPU 从冗余的数据搬运中彻底解放出来,让 CPU 专注于算法或其他核心任务处理。

http://www.cnnetsun.cn/news/4355613.html

相关文章:

  • 基于SpringBoot的酒水销售系统的设计与实现(源代码+文档+PPT+调试+讲解)
  • 计算机单片机毕设实战-基于 STM32 或 51 单片机的 WiFi 智能鱼缸软硬件协同设计 基于 STM32 或 51 单片机的水族箱多参数自动管控系统设计(025205)
  • 三类技术背景转型AI安全:CAIDCP认证与对抗样本实战指南
  • SWAT模型高阶应用:从无资料流域建模到情景模拟的完整工程实践
  • PECR:一种可复现的、基于遥测信息的SD-WAN漏洞优先级排序规范与综合压力测试用于SD-WAN漏洞优先级排序的PECR
  • 兽剧预告怎么拆解?以《愚行录》第二支预告为例
  • 网易人机交互算法工程师笔试题全解析:考点、易错点与复习路线
  • 选择GEO接口对接定制开发服务要参考哪些核心适配标准?
  • 【单片机课设毕设项目】基于单片机的 LCD1602 显示智能加湿设备设计开发 基于 STM32 或 51 单片机的继电器驱动智能加湿调控系统设计(024905)
  • 2026年实测这3个高性价比降AIGC网站,毕业论文AI率检测一次过不返工!
  • 华为OD机试新系统C卷备考指南:题型拆解与实战技巧
  • Unity游戏开发入门:从零构建3D平台跳跃游戏Demo
  • CST 电磁仿真 GPU 加速性能实测报告-2026 最新版
  • 计算机毕业设计之基于Java Web的药店管理系统设计与实现
  • 8.STM32 串口通信程序编写详解:寄存器与 HAL 库实战
  • AI编程工作流实战:从零构建Flask API项目
  • 【2014-08-18】Django自学笔记:模板
  • 【three.js教程】Three.js 加载 3D 模型(Loading 3D Models):选对格式,少踩一半坑
  • 基于SpringBoot的毕业设计导师分配系统(源码+lw+部署文档+讲解等)
  • 从“盯屏幕发呆”到“一键生成初稿”:毕夏AI官网正在重新定义毕业论文写作这件事
  • Nacos服务实例频繁掉线:系统性排查框架与解决方案
  • 爱普生L系列打印机查询IP地址与联网状态排查指南
  • Vue2/Vue3中使用hiprint实现可视化打印设计与报表打印的实践
  • 一台设备的代码从头到尾长什么样:从粗浅到通用,新手怎么一步步搭
  • 腾讯音乐2023春招移动客户端笔试复盘与解题思路
  • kkce.com:为什么网站测速要算TCP RTT而非只看TTFB?-快快测
  • Do Large Language Model Agents Exhibit a Survival Instinct? An Empirical Study in a Sugarscape-St...
  • 蔚来数据分析岗笔试复盘:SQL、Python与业务思维全解析
  • Level 4自动驾驶系统设计50——中间件 0
  • SpringBoot与若依框架实战:快速构建图书管理系统全流程指南