当前位置:   article > 正文

ZYNQ PS与PL通信之DMA_zynq dma

zynq 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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/830487
推荐阅读
相关标签
  

闽ICP备14008679号