前回に引き続きDMA転送の話です.今回は前回作成したビットストリームを実行していきます.今回のnotebookはこちらに上げています.
1.PYNQで動かす
PYNQ上のJupyter Notebookにアクセスする話は割愛します.
とりあえず適当なからフォルダを作り,その中に先ほどの.bitと.hwhを入れ,.ipynbをそのフォルダ内で新規で作成しておきます..bitと.hwhはファイル名をそろえておきます(今後はdesign_1.bit, design_1.hwhとする).
1-1.オーバーレイのロード
from pynq import Overlay
from pynq import PL
OL = Overlay("design_1.bit")
print(OL.ip_dict.keys())
dma = OL.axi_dma_0
ビットストリームの読み込みはこれで完了です..bitのファイル名を使用して.hwhを読み込むようなので,名前はそろえておきましょう. OL.ip_dictには使用したIPのうち,PS側から操作できるものが辞書として登録されています. この辞書内からdmaのIPを探し出し,dmaとしておきましょう.
1-2.xlnkとAllocate
import numpy as np
from pynq import allocate
data_src = allocate((100,), dtype=np.int16)
for i in range(100):
data_src[i] = i + 1
data_dst = allocate((512,), dtype=np.int16)
print("size of data_src :", data_src.nbytes, "Byte")
print("size of data_dst :", data_dst.nbytes, "Byte")
V2.6のPYNQでは,旧来より使われてきたXlnkに代わり,allocateを使うようになっています.今回はAXI-Streamのデータ幅を16bitにしたので,dtypeも16bitのモノに設定しました.入出力のバッファ領域をこれで確保しました.
1-3.実行
print(data_dst)
dma.sendchannel.transfer(data_src)
dma.sendchannel.wait()
print("send done")
dma.recvchannel.transfer(data_dst)
dma.recvchannel.wait()
print("receive done")
print(data_dst)
dmaのメンバ関数にsendchannel,recvchannelがあり,それぞれにtransferとwaitがあります.この辺は以前のPYNQと変わらずに使えます.
2.まとめ
とりあえずこのような形でPYNQ+DMAの動作を確認出来ました.
そのうちVivado HLSで作成したIPを埋め込み,動作させたいと思います.
参考
okchan08,ZYNQでAXI DMAを試してみる
©2021 shts All Right Reserved.
0 件のコメント:
コメントを投稿