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,如0x1000、0x1010等。 - 若起始地址为
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 数据传输的标准化流程如下:
- 确认空闲:检查
CDMASR.IDLE寄存器状态为 1,验证当前 DMA 处于空闲状态。 - 配置中断:将中断控制寄存器
CDMACR.IOC_IrqEn位(第 12 位)置为逻辑有效电平,启用传输完成中断机制;可选配置CDMACR.ERR_IrqEn位以激活错误异常中断功能。 - 设置源地址:将正确的传输源地址写入源地址寄存器(SA),须确保其地址空间指向有效的数据缓冲区且数据已就绪;若地址总线位宽超过 32 位,需同步配置
SA_MSB高位扩展寄存器。 - 设置目标地址:设定目标地址寄存器(DA),若地址位宽超限则需补充
DA_MSB高位寄存器的写入操作。 - 设置传输长度:定义传输字节数并写入突发传输长度寄存器(BTT),单次最大传输容量为 8,388,607(8M)字节(DataMover Lite 模块场景除外),完成写入后会触发传输启动指令。
- 等待传输完成:通过轮询机制监测
CDMASR.IDLE位直至返回空闲状态(值为 1),或在启用中断场景下等待 CDMA 模块输出完成中断信号(需满足CDMACR.IOC_IrqEn=1)。 - 解析中断类型:若采用中断响应模式,需解析中断状态寄存器以判定中断类型(传输正常结束或异常事件触发)。
- 清除中断标志:通过向
CDMASR.IOC_Irq状态标志位写入逻辑 1 执行中断清除操作。 - 准备下一次传输:完成当前传输周期后,若需执行新传输任务,请返回步骤 1 重新初始化
流程。
1.3 寄存器使用
有了上节的操作步骤,我们还需要了解 CDMA 的寄存器空间。CDMA 一共包含多个寄存器,其中在数据传输过程中最常用的是以下 5 个:
| 偏移地址 | 寄存器名称 | 作用 |
|---|---|---|
0x00 | CDMACR(控制寄存器) | 控制 DMA 的启动、复位及中断使能等 |
0x04 | CDMASR(状态寄存器) | 反映 DMA 当前状态(空闲、忙、错误等) |
0x18 | SA(源地址寄存器) | 设置数据搬运的源地址 |
0x20 | DA(目标地址寄存器) | 设置数据搬运的目标地址 |
0x28 | BTT(传输长度寄存器) | 设置本次传输的字节数 |
其中
0x00、0x04对应上节操作步骤中反复提到的CDMACR与CDMASR,而0x18、0x20、0x28则分别对应源地址、目标地址与传输长度,正好覆盖一次完整 DMA 传输所需的全部关键配置。
存
2.1 CDMACR 寄存器(0x00)
CDMACR 是 CDMA 的控制寄存器,负责配置中断使能、工作模式、软复位等关键功能。其各 bit 位含义如下:
| Bit 位 | 字段名称 | 默认值 | 访问类型 | 适用模式 | 描述 |
|---|---|---|---|---|---|
| 31-24 | IRQDelay | 00h | 读写 | SG | 中断延迟超时:传输结束后启动计时器,超时后触发中断;新传输或超时事件会重置计时器。设为 0 禁用延迟中断;不启用 SG 模式时此设置无效。 |
| 23-16 | IRQThreshold | 01h | 读写 | SG | 中断阈值:每完成一次传输(IOC 事件),计数器从阈值递减至 0 时触发中断。最小值 0x01(写 0x00 无效);不启用 SG 模式时此设置无效。 |
| 15 | 保留 | 0 | 只读 | - | 保留位,始终读为 0。 |
| 14 | Err_IrqEn | 0 | 读写 | 所有模式 | 错误中断使能:控制是否允许CDMASR.Err_Irq标志触发中断。1 = 使能;0 = 禁用。 |
| 13 | Dly_IrqEn | 0 | 读写 | SG | 延迟中断使能:控制是否允许CDMASR.Dly_Irq(延迟超时中断)触发中断。仅 SG 模式有效;1 = 使能;0 = 禁用。 |
| 12 | IOC_IrqEn | 0 | 读写 | 所有模式 | 传输完成中断使能:控制是否允许CDMASR.IOC_Irq(传输完成中断)触发中断。1 = 使能;0 = 禁用。 |
| 11-6 | 保留 | 0 | 只读 | - | 保留位,始终读为 0。 |
| 5 | KeyHoleWrite | 0 | 读写 | 所有模式 | 固定地址写模式使能:设为 1 启用 AXI 固定地址写突发(Key Hole 模式)。传输中不可更改;启用时需设置突发长度(Max Burst Length)为 16;从设备需支持此功能。 |
| 4 | KeyHoleRead | 0 | 读写 | 所有模式 | 固定地址读模式使能:设为 1 启用 AXI 固定地址读突发(Key Hole 模式)。传输中不可更改;启用时需设置突发长度(Max Burst Length)为 16;从设备需支持此功能。 |
| 3 | SGMode | 0 | 读写 | 所有模式 | 分散聚集(SG)模式使能:设为 1 启用 SG 模式(需 IP 核支持 SG 引擎)。需在 CDMA 空闲(CDMASR.IDLE=1)时修改;写入新描述符指针后需先置 0 再置 1 以生效。 |
| 2 | Reset | 0 | 读写 | 所有模式 | 软复位控制:设为 1 启动 CDMA 软复位(完成进行中的传输后复位)。1 = 复位中;0 = 正常运行。复位后所有寄存器恢复默认值。 |
| 1 | TailPntrEn | 1 | 只读 | SG | 尾指针模式状态:指示 SG 引擎尾指针功能是否启用。SG 模式固定为 1;纯简单 DMA 模式时为 0。 |
| 0 | 保留 | 0 | 只读 | - | 保留位,始终读为 0。 |
使用注意事项
- SG 模式专用位:
IRQDelay、IRQThreshold、Dly_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 发出重置位。
常见错误类型如下:
| 错误类型 | 说明 |
|---|---|
| DMAIntErr | CDMA 内部错误:检测到 AXI 数据移动器中的内部错误。当 BTT=0 写入主 AXI DataMover 命令输入时,或使用 BTT 字段=0 的 CONTROL 字获取并执行传输描述符时可能发生。 |
| DMASlvErr | CDMA 从属设备错误:当传输数据的从属设备以 SLVERR 响应时发生。 |
| DMADecErr | CDMA 解码错误:当地址请求指向不存在的地址时发生。 |
| SGIntErr | 分散聚集内部错误:当 BTT=0 时发生,仅当获取的描述符已设置完整位时才会出现,表明描述符尚未被 CPU 处理,被视为过时。 |
| SGSlvErr | 分散聚集从属设备错误:当获取和更新描述符的从属设备以 SLVERR 响应时发生。 |
| SGDecErr | 分散聚集解码错误:当地址请求指向不存在的地址时发生。 |
2.2 CDMASR 寄存器(0x04)
CDMASR 是 CDMA 的状态寄存器,用于反映 DMA 当前的工作状态、中断标志及错误信息。其各 bit 位含义如下:
| Bit 位 | 字段名称 | 默认值 | 访问类型 | 适用模式 | 描述 |
|---|---|---|---|---|---|
| 31-24 | IRQDelaySts | 00h | 只读 | SG | 中断延迟时间状态:反映 SG 引擎当前的中断延迟计时器值。仅当启用 SG 模式时有效。 |
| 23-16 | IRQThresholdSts | 01h | 只读 | SG | 中断阈值状态:反映 SG 引擎当前的中断阈值计数值。仅当启用 SG 模式时有效。 |
| 15 | 保留 | 0 | 只读 | - | 保留位,始终读为 0。 |
| 14 | Err_Irq | 0 | 读/写清零 | Simple 和 SG | 错误中断标志:置 1 表示因错误条件触发中断事件。若CDMACR.Err_IrqEn=1,则触发中断输出。写 1 清零。0 = 无错误中断;1 = 错误中断激活。 |
| 13 | Dly_Irq | 0 | 读/写清零 | SG | 延迟中断标志:置 1 表示延迟计时器超时触发中断。若CDMACR.Dly_IrqEn=1,则触发中断输出。写 1 清零。SG 模式专用,当CDMACR.SGMode=0时自动清零。 |
| 12 | IOC_Irq | 0 | 读/写清零 | Simple 和 SG | 传输完成中断标志:置 1 表示 DMA 传输完成触发中断。若CDMACR.IOC_IrqEn=1,则触发中断输出。SG 模式下需同时满足中断阈值条件。写 1 清零。0 = 无完成中断;1 = 完成中断激活。 |
| 11 | 保留 | 0 | 只读 | - | 保留位,始终读为 0。 |
| 10 | SGDecErr | 0 | 只读 | SG | SG 解码错误:SG 引擎读取/写入传输描述符时发生 AXI 解码错误(访问无效地址)。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。 |
| 9 | SGSlvErr | 0 | 只读 | SG | SG 从机错误:SG 引擎读取/写入传输描述符时收到 AXI 从机错误响应。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。 |
| 8 | SGIntErr | 0 | 只读 | SG | SG 内部错误:SG 引擎发生内部错误。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。 |
| 7 | 保留 | 0 | 只读 | - | 保留位,始终读为 0。 |
| 6 | DMADecErr | 0 | 只读 | Simple 和 SG | DMA 解码错误:DataMover 访问无效地址时发生 AXI 解码错误。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。 |
| 5 | DMASlvErr | 0 | 只读 | Simple 和 SG | DMA 从机错误:DataMover 传输时收到 AXI 从机错误响应。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。 |
| 4 | DMAIntErr | 0 | 只读 | Simple 和 SG | DMA 内部错误:DataMover 遇到内部错误(如写入 BTT=0)。触发后 CDMA 优雅停止,IDLE=1,更新CURDESC_PNTR。0 = 无错误;1 = 检测到错误,需软/硬复位清除。 |
| 3 | SGIncld | 配置决定 | 只读 | Simple 和 SG | SG 引擎使能状态:指示 IP 核是否包含 SG 引擎。0 = 未包含 SG(仅支持简单 DMA);1 = 包含 SG(支持 SG 和简单 DMA)。由 IP 核配置决定,软件可读取此位判断功能。 |
| 2 | 保留 | 0 | 只读 | - | 保留位,始终读为 0。 |
| 1 | Idle | 0 | 只读 | Simple 和 SG | CDMA 空闲状态:简单模式下 1 = 传输完成,等待新任务,写 BTT 启动传输;SG 模式下 1 = 所有描述符处理完成,写TAILDESC_PNTR重启 SG 引擎。关键状态位。0 = 运行中;1 = 空闲(传输完成或未开始)。 |
| 0 | 保留 | 0 | 只读 | - | 保留位,始终读为 0。 |
使用注意事项
- 中断标志清除:
Err_Irq、Dly_Irq、IOC_Irq均为写 1 清零,读取后需主动写 1 清除,避免重复触发中断。 - 错误状态位:
SGDecErr、SGSlvErr、SGIntErr、DMADecErr、DMASlvErr、DMAIntErr均为只读,检测到错误后需通过软/硬复位清除。 - 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 位字),示例为0x00、0x40、0x80,任何其他对齐方式都会产生未定义的结果。当CDMACR.SGMode=0时,该寄存器被清除。 |
| 5-0 | 保留 | 0 | 只读 | - | 保留位,始终读为 0,写入无效。 |
关键操作条件
- 仅当
CDMASR.IDLE=1时可软件写入:空闲状态下才能更新描述符指针。 CDMACR.SGMode=0时自动清零:退出 SG 模式后该寄存器被清除。
使用注意事项
- 64 字节对齐:描述符地址必须为 64 字节对齐(即低 6 位 = 0),例如
0x00、0x40、0x80,否则不能进行传输。 - 仅 SG 模式有效:仅当启用 SG 模式(
CDMACR.SGMode=1)时有效,简单 DMA 模式下此寄存器被忽略。 - 错误自动更新:发生错误(如
SGDecErr)时,硬件自动更新为触发错误的描述符地址,错误类型在上节已有阐述。 - 复位清零:软复位(
CDMACR.Reset=1)或 SGMode 禁用时,本寄存器清零。
2.4 TAILDESC_PNTR 寄存器(0x10)
TAILDESC_PNTR 是 CDMA 的尾描述符指针寄存器,在 SG 模式中扮演关键角色:它指定描述符链的暂停点,并支持通过写入新指针来重启或扩展任务流。其各 bit 位含义如下:
| Bit 位 | 字段名称 | 默认值 | 访问类型 | 适用模式 | 描述 |
|---|---|---|---|---|---|
| 31-6 | TailDescPtr | 0 | 读/写(RO*) | SG | 尾描述符指针:指定描述符链的暂停点,SG 引擎处理到与该指针匹配的描述符后暂停获取新描述符。当CDMACR.SGMode=1时,写入新指针会触发 SG 引擎重启处理(从CURDESC_PNTR开始获取描述符)。地址必须 64 字节对齐(0x00、0x40、0x80)。 |
| 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-0 | Source Address | 0x0 | 读/写 | 简单 DMA | 存放 DMA 读取数据的起始物理地址。必须在写入 BTT 寄存器前配置有效地址。 |
核心说明
- 适用模式:仅在Simple(简单)模式下生效;Scatter-Gather(SG)模式下该寄存器不使用,源地址由 BD 描述符提供。
- 配套寄存器:
0x1C为SA_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-0 | Destination Address | 0x0 | 读/写 | 简单 DMA | 数据传输的目标内存地址。必须在写入 BTT 寄存器前配置有效地址。 |
使用注意事项
- 配置时序:必须在写入 BTT 寄存器之前配置有效地址,否则传输可能使用无效的目标地址。
- 对齐要求:无强制对齐要求,但建议按数据宽度对齐以优化传输性能。
- KeyHole 写模式:若启用 KeyHole 写模式(固定地址突发),地址需符合 AXI 协议要求。
- 复位清零:软/硬复位后本寄存器清零(重置值 0x0)。
2.7 BTT 寄存器(传输长度 - 0x28h)
BTT 是 CDMA 的突发传输长度寄存器,用于指定本次 DMA 传输的字节数,同时也是 Simple DMA 模式下启动传输的触发开关。其各 bit 位含义如下:
| Bit 位 | 字段名称 | 默认值 | 访问类型 | 适用模式 | 描述 |
|---|---|---|---|---|---|
| 31-23 | 保留 | 0 | 只读 | 所有模式 | 保留位,始终读为 0,写入无效。 |
| 22-0 | Bytes_To_Transfer | 0 | 读/写 | 简单 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 专注于算法或其他核心任务处理。
