分享下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。