首页 > 资讯 > > 内容页

10.3 AXI DMA

2023-02-13 22:59:38 来源:哔哩哔哩 分享到 :

一、本节任务&基本概念

参考资料:


(资料图片)

"AXI DMA v7.1 LogiCORE IP Product Guide Vivado Design Suite PG021 June 14, 2019"

1.DMA简介

DMA 是所有现代计算机的重要特色,它允许不同速度的硬件设备进行沟通,而不需要依于中央处理器的大量中断负载。否则,中央处理器需要从来源把每一片段的数据复制到寄存器,然后把它们再次写回到新的地方。在这个时间里,中央处理器就无法执行其它的任务。 DMA是用硬件实现存储器与存储器之间或存储器与 I/O 设备之间直接进行高速数据传输。使用 DMA时,CPU向DMA控制器发出一个存储传输请求,这样当DMA控制器在传输的时候,CPU 执行其它操作, 传输操作完成时DMA以中断的方式通知CPU。

2.AXI DMA

ZYNQ 提供了两种 DMA,一种是集成在 PS 中的硬核 DMA,另一种是 PL 中使用的软核 AXI DMA IP。 此次我们使用XILINX官方提供的 AXI DMA IP实现DMA。

AXI DMA IP在内存(AXI4 内存映射)和AXI4-Stream外设间提供了高带宽的直接内存访问,其scatter/gather功能可以让CPU从数据搬运中脱离出来,执行其他工作。

从Block Diagram中可以看出AXI DMA IP实现了AXI4的内存映射到AXI4 Stream的转换(上方的MM2S,MemoryMap to Stream,和下方的S2MM,Stream to MemoryMap),在S/G模式下中间的功能才可用。

时钟

有四个时钟接口,可以使用同步或异步时钟的模式,如果选用同步模式,mm2s,s2mm,sg都要使用同一个时钟源,axi-lite使用更慢的时钟;如果选用异步模式,axi-lite时钟必须小于等于sg,sg小于等于mm2s和s2mm

复位

复位需要将复位信号激活最少16个最慢的时钟周期,即与axi-lite时钟同步。

3.Direct Register Mode (Simple DMA)

该模式提供了在MM2S和S2MM信道上进行简单的DMA传输的配置,只需较少的FPGA资源。通过访问DMACR,the Source or Destination  Address,the Length registers来进行传输。如果开启中断,当传输完成后,DMASR相关联的中断会激活。

MM2S的DMA设置

使能MM2S信道,向MM2S_DMACR.RS寄存器写1;

使能中断(如果有需求),MM2S_DMACR.IOC_IrqEn 和 MM2S_DMACR.Err_IrqEn寄存器写1;

写一个有效的源地址到MM2S_SA寄存器,如果没有配置Data Re-Alignment(DRE),在指定起始地址时要注意对其,是否对其取决于stream流宽度。例如,存储器映射数据位宽为32位(4字节),那么在给地址的之后就要每次+4,如0x00,0x04,0x08,0x0c...如果启用了DRE功能且stream位宽小于128,那么地址可以任意字节偏移;

写需要传输的字节数到MM2S_LENGTH寄存器。字节数为0无效,非0值会决定从存储器映射到Stream的数据长度,该寄存器必须最后才配置,其他寄存器的配置顺序没有要求。

S2MM的DMA设置

与MM2S类似

4.Scatter/Gather Mode

该模式将传输的基本参数BD(Buffer Descriptor)储存在内存中,在工作时通过SG接口加载、更新BD。这里不做详细介绍,参考:https://blog.csdn.net/qq_43541062/article/details/126180031

5.设计(使用)流程

XILINX文档也给我们提供了在VIVADO中IP核的配置流程。实际上通过设置这些参数,就不用像上面说的对寄存器进行读写操作。

Enable Asynchronous Clocks 使能异步时钟

Enable Scatter Gather Engine 使能SG模式

Enable Micro DMA 使能MicroDMA,会产生高优化的DMA,资源占用小,但性能更差、

Width of Buffer Length Register 在简单DMA模式中,用于指示传输数据的数量,等于2^Length Width

Address Width (32 - 64)  设置地址位宽,范围为32~64

Enable MultiChannel DMA 使能多通道DMA

Enable Read Channel 和 Enable Write Channel 使能读、写通道,需要的话都要勾选

Number of Channels 信道数量

Memory Map Data Width 存储器映射数据位宽

Stream Data Width 流数据位宽

Max Burst Size突发传输大小

Allow Unaligned Transfers 允许非对其传输

二、程序设计

1.VIVADO程序设计

加入PS IP核、AXI DMA IP、AXI Stream FIFO IP。注意PS要添加HP从机端口和中断端口。

配置AXI DMA

完成后互联,这里还需要自己连接S2MM和MM2S。

2.VITIS程序设计

导入简单传输中断的例程,这个例程实际上完成了一次DMA循环,在内存中划定了一片发送缓冲区和接收缓冲区,并在发送缓冲区写入给定的数据后开始发送,同时接收,实现一次数据的DMA搬运。发送、传输完成后会触发中断。

①宏定义与声明

②初始化DMA器件

③设置中断

④中断处理函数

⑤传输部分

3.上板验证

在数据传输部分打上断点,然后Debug As上板子。

打开Memory Monitors可以观察对应地址数据的变化。

三、总结

1.用了AXI DMA 但没有完全用,如果使用PS自带的硬核DMA呢?

2.对于AXI-Stream的传输流程并不了解,这只能再看看datasheet了

3.之前对于中断处理函数那块不清楚,我还在想中断处理函数执行结束后不应该清除中断状态吗,和同学、正点原子客服讨论之后又看了ug585,感觉应该是XAxiDma_IntrAckIrq(axidma_inst, irq_status, XAXIDMA_DMA_TO_DEVICE);这个函数实现了中断状态清除。

开学倒计时,计划这周边复习器件物理、模寄,一边整OV5640 LCD显示,正点原子SDK开发手册里面给了一个VDMA的例程,可以参考,另外我想的是做一个简化版的,如果不使用DMA,在PL里面做一个data_reg[800*480:0][23:0]用来储存一帧的数据呢?(会不会太大了?)

推荐阅读