使用axi_datamover完成ZYNQ片內PS與PL間的數據傳輸


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM