2021年4月9日金曜日

PYNQ V2.6でDMA転送をする話(JupyterNotebook上での実行)



前回に引き続き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を埋め込み,動作させたいと思います.

参考


©2021 shts All Right Reserved.

0 件のコメント:

コメントを投稿