ZYNQ踩坑日记:AXI_DMA传输问题详解——问题再续篇

       关于使用AXI_DMA使用的问题,我实现的功能是使用AXI_DMA采集ADC数据写入DDR,每次数据包128个,数据包大小64bit,但是AXI总线在LAST信号拉高之后,并没有立即拉低READY信号,而是又接收了4个时钟数据然后拉低,并且这4个时钟数据并没有写入DDR,仍然存在DMA的缓冲数组中,在下一次传输开始时,这4个时钟数据会最开始写入,然后重复这个过程。

        在xilinx官网的axi dma production guide PG021文档中有一句话

        Note: In the absence of any setup (that is, before it is programmed to run), AXI DMA will pull the s_axis_s2mm_tready signal Low after taking in four beats of streaming data. This will throttle the input data stream. To have a minimum amount of throttling, ensure that the AXI DMA is set up to run much before the actual data arrives.

        简单翻译一下为:在没有任何设置的情况下(即在其被编程运行之前),AXI DMA 在接收了四个节拍的流数据后,会将 s_axis_s2mm_tready 信号拉低。这将限制输入数据流。为了尽量减少节流,确保 AXI DMA 在实际数据到达之前就已经设置好并运行。

        之前理解是AXI DMA在初始化后会接收四个节拍的流数据,然后后面就不需要接收四个节拍的流数据,在xilinx中文官网咨询后得知,实际上AXI DMA在每次运行XAxiDma_SimpleTransfer函数前,slave tready都会一直拉高等待四个节拍流数据,当前我的adc ip核心设置成当tlast信号拉高后,tvalid拉低10个时钟周期,于是会出现下面这种情况。

        会发现,一包数据流的结尾,吊着4个节拍的流数据,这四个流数据会进入AXI DMA的缓冲区中,在下一次DMA传输时,4个数据会写入DDR作为头数据。

       想要实现每一包数据都是连续的然后没有吊着尾巴这种情况,需要运行XAxiDma_SimpleTransfer函数后在拉高tvalid信号,这样就能实现一包数据连续不断。 

作者:铅笔头884

物联沃分享整理
物联沃-IOTWORD物联网 » ZYNQ踩坑日记:AXI_DMA传输问题详解——问题再续篇

发表回复