1 配置界面说明
我们打开AXI Direct Memory Access 7.1的配置界面:
- 使能SG模式
- Width of Buffer length :即buffer length对应的位宽,设置16bit,即buffer length最大设置65536,buffer length对应的单位为Byte。
- Read Channel:M_AXI_MM2S读数据 通过 M_AXIS_MM2S发出
- Write Channel:S_AXIS_S2MM写入数据 通过 M_AXI_S2MM写给内存
所以可以理解为:Read channel对应MM2S Write channel 对应S2MM。

2 仿真架构说明
打开example仿真工程,可以看到架构如下

其中CHECK模块会核对读写数据的一致性,输出pass 和 fail

3 仿真说明
3.1 配置和寄存器详解
地址0x008 写 0x0000_0000
地址0x000 写 0x0002_7001
地址0x010 写0x0000_0040
地址0x038 写 0x0000_00C0
地址0x030 写 0x0002_7001
地址0x040 写0x0000_0100

其中 0x000 0x008 0x010 对应MM2S的SG模式
0x030 0x038 0x040 对应S2MM的SG模式
我们只对MM2S的寄存器进行说明,S2MM与MM2S是一样的,只是寄存器地址不同
地址0x008 写 0x0000_0000,即SG模式的描述符的开始地址。

地址0x000 写 0x0002_7001,DMA控制器的配置。
bit[0]--DMA Run
bit[14:12]---使能响应的中断
bit[23:16]=2,即收到两个中断之后,才拉起外部的intr。

地址0x010 写 0x0000_0040,尾描述符指针。

3.2 SG链表配置详解
当我们配置完,描述符的首指针 并使能DMA之后,SG通道就从指针对应的地址,取链表信息,链表信息包含了如下配置。

我们看一下例程中读出的信息:
这是0x000地址配置完之后,SG通道读取的信息

从第一个链表地址0x0000_0000读出:
数据1-0x00:0x40---即下一个链表的地址
数据2-0x04:0x00
数据3-0x08:0x00---即MM2S取数据的基地址是0x0000_0000
数据4-0x0c:0x00
数据5-0x10:0x00
数据6-0x14:0x00
数据7-0x18:0x0c00_0080--MM2S这个链表的传输配置项,如下
bit[22:0]对应80,即buffer length=0x80=128byte,本次搬移128byte数据量
bit[27:26]=2'b11,指示这个起始帧,也是结束帧,即单帧有效

那根据第一个链表的指示,第二个链表就从0x0000_0040基址开始取链表信息
数据1-0x00:0x80---即下一个链表的地址
数据2-0x04:0x00
数据3-0x08:0x80---即MM2S取数据的基地址是0x0000_0080
数据4-0x0c:0x00
数据5-0x10:0x00
数据6-0x14:0x00
数据7-0x18:0x0c00_0080--MM2S这个链表的传输配置项,如下
bit[22:0]对应80,即buffer length=0x80=128byte,本次搬移128byte数据量
bit[27:26]=2'b11,指示这个起始帧,也是结束帧,即单帧有效
根据这样的配置,就可以实现提前在内存中写好CMD信息,然后在AXI4LITE配置接口给出描述符的起始和结尾,就可以发起多次DMA传输了,与Direct Register模式相比可以大大提高传输的效率。
3.3 MM2S工作流程
从仿真可以看出,当0x000配置完成之后,AXI4_SG从0x0000_0000的基地址开始取SG的配置信息。
当第一个链表配置信息读取成功之后,AXI4_MM2S从0x0000_0000的基地址开始取数据,并将数据转为AXIS_MM2S输出,最后一个数据的时候拉起Tlast,数据量为128个byte,
当第二个链表配置信息读取成功之后,AXI_MM2S就从0x80的基地址取数据,转为AXIS_MM2S输出,最后一个数据拉起Tlast
每完成一次传输,实际都会产生一次中断,但是我们前面的配置是2次IRQ中断才拉起一次外部中断,所以可以看到MM2S_intr是在两次传输都完成之后才拉起的。

从时序可以看出,每次传输完成之后SG都会发起一笔写请求,写的地址为0x1c,写的数据为0x8000_0080,什么意思呢?

从Table 2-21可以看出,0x1C对应 STATUS,寄存器如下:
bit[22:0]=0x80,即本次实际传输了128byte的数据(与配置要求的传输数据量一致)
bit[31]为1,即本次传输成功。
在AXI_DMA传输故障的时候,这个寄存器显得尤为重要。


3.3 S2MM工作流程
从仿真可以看出,当0x030配置完成之后,AXI4_SG从0x0000_00C0的基地址开始取SG的配置信息。
当第一个链表配置信息读取成功之后,AXIS_S2MM接收stream流数据,转为AXI4_S2MM,写数据的基址为0x0000_0000,数据量为128个byte。
当第二个链表配置信息读取成功之后,AXIS_S2MM接收stream流数据,转为AXI4_S2MM,写数据的基址为0x0000_0080
每完成一次传输,实际都会产生一次中断,但是我们前面的配置是2次IRQ中断才拉起一次外部中断,所以可以看到S2MM_intr是在两次传输都完成之后才拉起的。

4 注意事项
MM2S是边从内存取数据,边通过AXIS端发出,数据足够buffer length的时候,拉高tlast信号
S2MM既认数据量又认Tlast,也就是当数据量不足128byte,但是Tlast提前到来了,它也会执行数据搬移。
920

被折叠的 条评论
为什么被折叠?



