在zynq开发中,PS与PL通信是非常关键的内容,掌握了PS与PL通信方法,就可以搭建各种常用的硬件平台。本文先介绍集中PL与PS的通信方法,然后重点介绍通过DMA实现PS与PL通信。
PL与PS通信方法
PL与PS通信通常有如下四种方法:
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);