最近被AXI DMA给坑了一下 烦躁了几天 今天终于找到了原因。之前一直以为是AXI FIFO有BUG 而且是XILINX的BUG 老是出现DMA读完FIFO中数据之后程序卡死的情况,而且还会丢失FIFO中的数据现象。网上的大部分例程都是回环测试 基本避过了这个坑 但是项目需要往FIFO中写入PL端获取的数据 就会遇到这个问题了。XINLINX的Document还是要多看看滴。
首先就是LAST信号的使用问题;
其次:S2MM传输的数据源和FIFO连接axi_dma模块的s2mm_prmry_reset_out_n复位信号(见Block Design中的紫色高亮信号线),理由如下:
① 注意注意:axi_dma模块S2MM传输的全部数据量对于其S_AXIS_S2MM端口而言必须是1个完整的Packet,完成的标志即s_axis_s2mm_tlast出现高电平,如果此时数据量不足PS传输指令的数据量,传输仍然结束并且通过dma的buffer length寄存器返回已传输的数据量
② axi_dma模块内部S2MM通道可以缓冲16字节的数据量,即复位结束后通过s_axis_s2mm_tready高电平可以收入16字节数据,如果数据源或者FIFO的复位与S2MM通道复位不同步,则axi_dma模块复位后数据可能丢失,而数据源却认为已经发送,导致数据量出错,从而S2MM传输错误,现象就是AXI DMA的前四个时钟数据丢失。
③ AXI4-Stream Data FIFO模块的输入输出接口的Packet格式完全一样,即S_AXIS进入数据的Packet中Burst数目与M_AXIS送出数据的Packet中的Burst数目一样。于是数据源送出的Packet中的tlast的位置必须精确控制到与PS传输指令要求的数据量一致。