datamover完成ZYNQ片内PS与PL间的数据传输.docxVIP

  • 91
  • 0
  • 约1.68千字
  • 约 4页
  • 2022-03-01 发布于浙江
  • 举报

datamover完成ZYNQ片内PS与PL间的数据传输.docx

PAGE PAGE 1 datamover完成ZYNQ片内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 0#define ps2pl_SA 0#define ps2pl_LENGTH 0x8400000C #define ps2pl_START 0#define ps2pl_FINISHED 0 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,(0num)); Xil_Out32(ps2pl_START,0; while(!(Xil_In32(ps2pl_FINISHED)0); } 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 0#define pl2ps_DA 0#define pl2ps_LENGTH 0x8400004C #define pl2ps_START 0#define pl2ps_FINISHED 0 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,(0num)); Xil_Out32(pl2ps_START,0; while(!(Xil_In32(pl2ps_FINISHED)0); } 附件为在vivado中打包好的用于pl2ps传输的ip。

文档评论(0)

1亿VIP精品文档

相关文档