ZYNQ PS与PL通信之DMA

在zynq开发中,PS与PL通信是非常关键的内容,掌握了PS与PL通信方法,就可以搭建各种常用的硬件平台。本文先介绍集中PL与PS的通信方法,然后重点介绍通过DMA实现PS与PL通信。

PL与PS通信方法

PL与PS通信通常有如下四种方法:

  • 使用AXI GPIO
  • 使用BRAM
  • 使用DMA
  • 使用VDMA
  • DMA硬件平台

    DMA通常与axis stream data fifo一起使用,下图为使用DMA时的硬件平台,axis stream data fifo接口的S_AXIS、s_axis_aclk和s_axis_aresetn通过引脚,连接到PL。

    axis stream data fifo信号如下:

    .S_AXIS_tdata(S_AXIS_tdata),
    .S_AXIS_tkeep(S_AXIS_tkeep),
    .S_AXIS_tlast(S_AXIS_tlast),
    .S_AXIS_tready(S_AXIS_tready),
    .S_AXIS_tvalid(S_AXIS_tvalid),
    .s_axis_aclk(s_axis_aclk),
    .s_axis_aresetn(s_axis_aresetn)

    控制axis stream data fifo

    PL端编写逻辑代码,将测试数据写入axis stream data fifo,可以通过vio控制,每次写入特定数据,例如S_AXIS_tdata为64bit,每次写入128个64bit。

    写入时序

    往axis stream data fifo中写入64'h0807060504030201,写入128个数据后,将S_AXIS_tlast置1后,完成一次发送。

    axi总线时序

    axis stream data fifo接收完成一帧数据后,将数据发送到DMA,观察DMA输出到PS的axi总线信号,先发送地址,后发送数据。

    地址通道:

    数据通道:

    DMA
    DMA可以在system memory和stream target之间进行数据交换。

    MM2S channel

    从PS DDR输出到DMA,DMA通过axi stream接口输出数据。

    S2MM channel

    从axi stream接口输入到DMA,PS读DMA数据存入DDR。本次设计使用S2MM。

    DMA控制流程

    PS软件控制DMA流程如下:

    S2MM channel 通道:

    1、设置S2MM通道,S2MM.DMACR.RS = 1,DMASR.Halted = 0;

    2、使能中断,S2MM_DMACR.IOC_IrqEn = 1,S2MM_DMACR.Err_IrqEn = 1。

    3、写入目的地址到S2MM_DA寄存器。假如地址空间大于32,需要配置S2MM_DA MSB寄存器。

    4、配置Re-Alignment。

    5、将要接收字节数,最后写入S2MM_LENGTH寄存器.。

    DMA软件设计

    使用XAxiDma_SimpleTransfer函数接收数据。

    传输方向

    else if(Direction == XAXIDMA_DEVICE_TO_DMA) //S2MM进入这个判断中

    主要寄存器配置

    XAxiDma_WriteReg(InstancePtr->RxBdRing[RingIndex].ChanBase,
    XAXIDMA_DESTADDR_OFFSET, LOWER_32_BITS(BuffAddr));//写入将存储数据地址
    XAxiDma_WriteReg(InstancePtr->RxBdRing[RingIndex].ChanBase,
    XAXIDMA_CR_OFFSET,
    XAxiDma_ReadReg(InstancePtr->RxBdRing[RingIndex].ChanBase,
    XAXIDMA_CR_OFFSET)| XAXIDMA_CR_RUNSTOP_MASK);//设置控制寄存器
    XAxiDma_WriteReg(InstancePtr->RxBdRing[RingIndex].ChanBase, //设置MM2S_LENGTH寄存器
    XAXIDMA_BUFFLEN_OFFSET, Length);

    将64‘0807060504030203写入内存后:

    写入多组数据

    如果要进行多包数据传输时,每包发送1024bytes,每次调用XAxiDma_SimpleTransfer时,将RxBufferPtr地址加1024,直到传输完成所有包,DDR中的数据会按地址顺序排列。

    Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR)RxBufferPtr,(u32)(MAX_PKT_LEN), XAXIDMA_DEVICE_TO_DMA);

    最新文章