Xilinx MPSoC调试经验二--datamovev地址非4字节对齐时的用法

  1. Datamover的使用

1)传输时如果需要支持地址非对齐,s2mm侧:

 

地址非对齐时的命令设定

assign s_axis_s2mm_cmd_tdata[22:0] = length;

assign s_axis_s2mm_cmd_tdata[23] = 1;     //type: 1-enable INCR  0- enable FIXED;

assign s_axis_s2mm_cmd_tdata[29:24] = 6'b0;

assign s_axis_s2mm_cmd_tdata[31:30] = 2'b00;

assign s_axis_s2mm_cmd_tdata[63:32] = addr; 

assign s_axis_s2mm_cmd_tdata[67:64] = tag;

assign s_axis_s2mm_cmd_tdata[71:68] = 0;

 

简单总结:s2mm方向,流接口方向是地址无关的,数据总是从低位开始有效,字节总数决定传几拍。Tkeep在tlast位置指示非C-width对齐时,低位开始哪些字节有效。

Axi总线上:axi总线都会从axi-s总线的0地址取数据,然后放到axi的低位地址指示的byte lane上面。

比如写地址0x5, 1个字节,会从axi-s的0-lane上取数据,放到axi的byte5上,axi-s的tkeep是0x1,axi上的tkeep是0x20.

Axi总线上的数据对齐是根据命令中的saddr产生的,tkeep根据地址和传输长度决定。

 

 

 

2)mm2s方向:

  

 

地址非对齐时的命令设定

assign s_axis_s2mm_cmd_tdata[22:0] = length;

assign s_axis_s2mm_cmd_tdata[23] = 1;     //type: 1-enable INCR  0- enable FIXED;

assign s_axis_s2mm_cmd_tdata[29:24] = DSA(地址低位);

assign s_axis_s2mm_cmd_tdata[31:30] = 2'b11;

// EOF为了在axi-s产生tlast

assign s_axis_s2mm_cmd_tdata[63:32] = addr; 

assign s_axis_s2mm_cmd_tdata[67:64] = tag;

assign s_axis_s2mm_cmd_tdata[71:68] = 0;

 

简要说明:

AXI侧:

非对齐时,AXI侧根据DSA和DRR设定,在特定byte-lane数据对齐到AXI-S侧的byte0-lane上。

DRR设定是为了告诉AXI进行非对齐处理,DSA提供了有效数据在byte lane上的位置。

EOF为了在axi-s产生tlast,将读的最后一个数据放在axi-s总线上。

 

总结:流接口方向上的传输是跟地址无关的,所以有效数据总是从byte0开始的。

Axi接口上是地址相关的,s2mm方向,saddr同步了地址信息,以及数据在总线上的对齐位置。Mm2s方向,DRR/DSA同步了地址信息,以及从axi总线上哪个位置开始取数据放到axi-s。 EOF用于产生tlast信号。

猜你喜欢

转载自blog.csdn.net/weixin_38712697/article/details/90739356