zoukankan      html  css  js  c++  java
  • 使用axi_datamover完成ZYNQ片内PS与PL间的数据传输

    分享下PS与PL之间数据传输比较另类的实现方式,实现目标是:

    1、传输时数据不能滞留在一端,无论是1个字节还是1K字节都能立即发送;

    2、PL端接口为FIFO接口;

    PS到PL的数据传输流程:

    PS到PL的数据传输相对简单,使用vivado自带的axi_datamover即可完成,详细如下:

    A、向PL端查询剩余数据存储长度(以byte为单位);
    B、通过写寄存器设置PL端DMA数据传输开始地址;
    C、通过写寄存器设置PL端DMA数据传输长度(以byte为单位);
    D、通过写寄存器启动PL端DMA传输;
    E、通过读寄存器查询PL端DMA是否完成数据传输;
     
    PS(ARM)端驱动代码如下:
    #define WRITE_SPACE_REG 0x84000004
    #define ps2pl_SA 0x84000008
    #define ps2pl_LENGTH  0x8400000C
    #define ps2pl_START 0x84000010
    #define ps2pl_FINISHED 0x84000014
     
    data_space = Xil_In32(WRITE_SPACE_REG);
     
    void init_axi_dma_simple_write(u32 num)
    {
    Xil_Out32(ps2pl_SA,(unsigned int )recvram);
    Xil_Out32(ps2pl_LENGTH,(0x80000000+num));
    Xil_Out32(ps2pl_START,0x00000001);
    while(!(Xil_In32(ps2pl_FINISHED)&0x00000001));
    }
     
     
    PL到PS的数据传输流程:
    PL到PS的数据传输相对复杂点,vivado自带axi_datamover测试发现有时不太正常,所以按照vivado自带axi_datamover接口协议重新写了模块,详细如下:
     
    A、通过读寄存器查询待传输数据长度(以byte为单位);
    B、通过写寄存器设置PL端DMA数据传输开始地址;
    C、通过写寄存器设置数据传输长度(以byte为单位);
    D、通过写寄存器启动数据传输;
    E、通过读寄存器查询PL端DMA是否完成数据传输;
    注:数据传输长度有数值限制,假如待传输数据长度为8byte的整数倍,则每次的数据传输长度也必须为8byte的整数倍。假如待传输数据长度不是8byte的整数倍,以15byte为例,只能以下面两种方式读取:1、第一次读取8byte,第二次读取7byte;2、一次读取15byte。为了简化这种限制,可以使每次的待传输数据长度小于PS端的缓存,这样可以一次读取所有待传输的数据,也就是第二种读取方式。
     
    PS(ARM)端代码如下:
    #define READ_NUM_REG 0x84000044
    #define pl2ps_DA 0x84000048
    #define pl2ps_LENGTH 0x8400004C
    #define pl2ps_START 0x84000050
    #define pl2ps_FINISHED 0x84000054
     
    data_return = Xil_In32(READ_NUM_REG);
     
    void init_axi_dma_simple_read(u32 num)
    {
    Xil_Out32(pl2ps_DA,(unsigned int )recvram);
    Xil_Out32(pl2ps_LENGTH,(0x80000000+num));
    Xil_Out32(pl2ps_START,0x00000001);
    while(!(Xil_In32(pl2ps_FINISHED)&0x00000001));
    }
     
    附件为在vivado中打包好的用于pl2ps传输的ip
  • 相关阅读:
    分布式架构高可用架构篇_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试
    @interface [SpringMVC+redis]自定义aop注解实现控制器访问次数限制
    ActiveMQ安装与持久化消息
    activemq 5.13.2 jdbc 数据库持久化 异常 找不到驱动程序
    java通过Comparable接口实现字符串比较大小排序的简单实例
    微信小程序--火车票查询
    【调试】如何使用javascript的debugger命令进行调试(重要)
    【调试】js调试console.log使用总结图解(重要)
    ajax提交表单
    一个项目的404错误处理页面
  • 原文地址:https://www.cnblogs.com/otod3r/p/5275697.html
Copyright © 2011-2022 走看看