• 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。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jIITJ3dM-1660131734775)(./pic/1.png)]

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    控制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后,完成一次发送。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EgbmQKui-1660131734777)(./pic/2.png)]

    axi总线时序

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

    地址通道:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-es3vZOuV-1660131734778)(./pic/4.png)]

    数据通道:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JTm5R828-1660131734779)(./pic/5.png)]

    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进入这个判断中
    
    • 1

    主要寄存器配置

    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);                
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    将64‘0807060504030203写入内存后:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tRL3Mg0K-1660131734780)(./pic/3.png)]

    写入多组数据

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

    Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR)RxBufferPtr,(u32)(MAX_PKT_LEN), XAXIDMA_DEVICE_TO_DMA);
    
    • 1
  • 相关阅读:
    Python | 24K纯新手的Python环境搭建之路!~(Anaconda + Jupyter)
    hevc 半像素
    构建网站遇到的一些问题(浏览器缓存问题)
    【物理】不脱离外圆面问题
    有刷电机的速度pid-位置pid算法
    ISO三体系认证需要什么材料,办理流程
    单调栈理论基础 及 力扣:739. 每日温度
    基于TensorRT部署和C++推理目前最SOTA的图像降噪网络
    基于springboot实现“漫画之家”系统项目【项目源码+论文说明】
    eclispe项目中静态文件出现错误解决方法
  • 原文地址:https://blog.csdn.net/clj609/article/details/126273174