一,ps到pl的資料傳輸流程:
1,傳輸過程
(1)、向pl端查詢剩餘資料儲存長度(以byte為單位);
(2)、通過寫暫存器設定pl端dma資料傳輸開始位址;
(3)、通過寫暫存器設定pl端dma資料傳輸長度(以byte為單位);
(4)、通過寫暫存器啟動pl端dma傳輸;
(5)、通過讀暫存器查詢pl端dma是否完成資料傳輸;
在sdk ps端**:
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_******_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的資料傳輸流程:
1,pl到ps的資料傳輸相對複雜,vivado自帶dma測試發現有時不太正常,按照vivado自帶dma介面協議重新寫了模組:
(1)、通過讀暫存器查詢待傳輸資料長度(以byte為單位);
(2)、通過寫暫存器設定pl端dma資料傳輸開始位址;
(3)、通過寫暫存器設定資料傳輸長度(以byte為單位);
(4)、通過寫暫存器啟動資料傳輸;
(5)、通過讀暫存器查詢pl端dma是否完成資料傳輸;
資料傳輸長度有數值限制,假如待傳輸資料長度為8byte的整數倍,則每次的資料傳輸長度也必須為8byte的整數倍。
假如待傳輸資料長度不是8byte的整數倍,以15byte為例,只能以下面兩種方式讀取:
1、第一次讀取8byte,第二次讀取7byte;
2、一次讀取15byte。為了簡化這種限制,可以使每次的待傳輸資料長度小於ps端的快取,這樣可以一次讀取所有待傳輸的資料,也就是第二種讀取方式。
在sdk ps 端**如下:
#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_******_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));
zynq平台,PS 與 PL共享記憶體的方法
開發環境 ubuntu18.04 軟體環境 linux核心 uboot原始碼及fpga程式 硬體環境 zynq 開發板 mz7100 關於本文中所述問題,ps arm linux 與 fpga 共享的事ps端的記憶體。開發板的記憶體共有1g 0x00000000 0x40000000 其中768m ...
ip 與 整數間 的相互轉換 python實現
我們有時會將乙個整數與ip位址進行互換,用python 實現很簡單 將乙個整數如2000000,變為乙個ip位址的方式 import socket import struct int ip 123456789 ip socket.inet ntoa struct.pack i socket.hton...
linux訊號量實現程序間同步與互斥
同步與互斥是程序間的制約關係,同步 是為了保證臨界資源的時序的可控性,安全性。是程序間由於相互合作引起的直接制約關係。互斥 是為了保證對臨界資源同一時間的唯一訪問性。是程序間由於共享資源引起的間接制約關係。多個程序當需要操作同一資源的時候就需要通過同步和互斥機制來實現對臨界資源的安全訪問。臨界資源就...