AXI-DMA

心已入冬 提交于 2019-11-30 03:08:47

---恢复内容开始---

AXI DMA:为内存与AXI4-Stream外设之间提供高宽带的直接存储访问,scatter/gather功能可将CPU从数据搬移任务中解放出来。

在ZYNQ中,AXI DMA就是FPGA访问DDR3的桥梁,受ARM监管。

AXI-DMA IP核有6个接口 :

S_AXI_LITE是ARM配置dma寄存器的接口;

M_AXI_SG是从(往)存储器加载(上传)buffer descriptor的接口;

剩下4个构成两对接口:MM2S表示PS向PL传送,S2MM表示PL向PS端(M表示主机代表PS,S表示从机代表PL)

           AXI是存储器一侧的接口,AXIS是FPGA一侧的接口。

 

AXI DMA工作模式分为两种,分别是Direct Register Mode和Scatter/Gather Mode。

Direct Register Mode模式:具备DMA的基本功能,除了控制寄存器和状态寄存器之外,给出源(目的)地址和传输长度之后就可以开启一次传输了。Direct Register Mode的特点(也是缺点)是配置完一次寄存器之后只能完成存储器连续地址空间的读写,如果有需求往不同地址空间搬运数据的话,那就需要重新配置寄存器开启一次新的传输。S2MM和MM2S不支持多个通道。

 scatter gather模式:把关于传输的基本参数(比如起始地址、传输长度、包信息等)存储在存储器中,一套参数称之为Buffer Descriptor(简称BD),在工作过程中通过上面提到的SG接口来加载BD并且更新BD中的状态。从图3可以看出,Scatter/Gather Mode下的寄存器列表中没有了Address、Length相关的寄存器了,取而代之的是CURDESC、TAILDESC。Multichannel DMA:S2MM和MM2S都支持多个通道。Multichannel模式下,S2MM有16个通道,每个通道都有独立的CURDESC和TAILDESC寄存器,而CR和SR则是共用的。MM2S多个通道共用一份CURDESC和TAILDESC寄存器。MM2S端只能等当前包传输完才能开始下一次的传输,先执行一个通道的发送任务再执行另一个通道的发送任务。Cyclic DMA:循环模式是在Scatter/Gather模式下的一种独特工作方式,在Multichannel Mode下不可用。正常情况下的Scatter/Gather模式在遇到Tail BD就应该结束当前的传输,但是如果使能了Cyclic模式的话,在遇到Tail BD时会忽略completed位,并且回到First BD,这一过程会一直持续直到遇到错误或者人为中止。Cyclic模式只需要在开启传输前设置好BD链条,工作之后就再也不需要管了。要做到遇到Tail BD时返回到First BD。

Data Cache:ZYNQ内部ARM CPU与DDR3之间存在两级缓存区,分别是L1 I/D Cache和L2 Cache,它们都是32-byte line size。Data Cache的使用带来了一个问题,DMA和CPU都与DDR3有数据往来,可CPU的Cache是不知道DMA对DDR3的数据读写过程的,也就是说CPU得到的数据很可能是”假的“,这就是著名的Cache一致性问题。解决该问题的办法是在程序中使用flush函数(invalid函数)及时将Cache的数据写入到DDR3(从DDR3读取数据到Cache),也就是说要避免该问题就只能靠我们自己了。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!