前言
在上一篇内容当中,介绍了PS端通过M_AXI_GP接口和PL端进行交互,但由于M_AXI_GP接口是一个AXI_Lite接口,所以更多时候作为PS端控制PL端一些寄存器时使用,若要进行大量数据交互,则行不同。
交互方式
GP接口都是32bit的AXI_Lite接口,HP接口则可以实现32/64bit的长数据流传输,HP接口是将数据写入了DDR当中(这样子的话ARM读数据需要先刷新cache,然后再读数据),还有一种适合大量数据交互的接口是ACP,它是直接将数据给到了ARM(也可能是直接给到了cache,反正就是不需要先到DDR当中),速度更加快。
一、基于HP接口交互
1、BD框图
2、PL端工作
主要实现了一个AXI_FULL主机模块,具体代码可以看之前的一篇博客内容:https://blog.csdn.net/m0_56222647/article/details/136459976
3、PS端工作
和上一篇代码基本一致,就是读数据位宽变为64,地址一次加8.
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "sleep.h"
#include "xparameters.h"
#include "xil_cache.h"
#include "xil_io.h"
int main()
{
init_platform();
Xil_DCacheDisable();
Xil_ICacheEnable();
print("Disabled cache\n\r");
u64 Data[10];
int i;
while(1){
for(i=0; i<10; i++){
Data[i] = Xil_In64(XPAR_PS7_RAM_0_S_AXI_BASEADDR + i*8);
}
usleep(5000);
}
cleanup_platform();
return 0;
}
二、上板效果
PL端AXI_Mater模块写数据过程:
通过AXI_smartconnect向ARM写数据,与上面波形是一样的,就是过了一级AXI_smartconnect。同时我们也可以看到PS端AXI_S_HP接口是AXI_FULL接口。
PS端读数据过程:
可以看到PS端读数据正常