※M2です.(PYNQは)初心者です.
※この手の記事は山程あって今更感もありますが,毎回やり方を忘れるので,メモ用として残します.
※PYNQ自体の解説記事ではありません.実装内容自体は↓の"Developing Single IP"と同じです.
PYNQ Overlay Tutorial: https://pynq.readthedocs.io/en/v2.5.1/overlay_design_methodology/overlay_tutorial.html
※PYNQの使い方というより,Vivadoの使い方の記事になってしまいました.
※工業大学生です.文章力に期待をしてはいけません.
はじめに
以下の状態を満たした状態で始めることとします.
- Ultra96 V1上で,PYNQのjupyter-notebookを起動できる.
- Vivado HLS,Vivadoがインストール済み&使用できる.
今回の記事では,Vivadoは2018.3のバージョンのものを用いました.
最終目標は,PYNQ Overlay Tutorialのadd関数をUltra96 V1上で動かせるようにすることです.
Vivado HLSを用いてIPコアを作成
PYNQ Overlay Tutorialに沿って,2つの整数を加算するIPコアを作成します.
Vivado HLSを起動して新しいプロジェクトを作成し,Partsは"xczu3eg-sbva484-1-e"を指定します.
新しいファイルをsourceに追加し,PYNQ Overlay Tutorialのadd関数をコピペしておきます.このadd関数をトップ関数に指定し,C Synthesisで合成をかけます.
合成が完了したら,Export RTLでIPコアを作成します.
Vivadoを用いてbit streamを作成
Vivadoを起動したら,新しいプロジェクト(RLT Project)を作成し,BoardはUltra96 V1を指定します.
IPコアをプロジェクトに追加する
前の工程で作成したIPコアをこのプロジェクトに追加できるように設定します.
Tools→Settingsを選択し,Project SettingsからIP→Repositoryを選択します."+"ボタンを押して,出てきたディレクトリ選択画面の中から,先程作成したVivado HLSプロジェクトの中の"solution1/impl/ip"を選択します.
Block Designを作成する
IP INTEGRAGERのCreate Block Designを選択します.
Diagramの中のadd IP("+"ボタン)を選択し,先程追加したIPコアを指定します.
同様にして,Zynq UltraScale+ MPSoCも追加します.
以上の操作が完了したら,Run Block Automation → Run Connection Automationを選択し,配線をしてもらいます.
配線が完了したら,保存してBlock Designを閉じます.
Bitstreamを生成する
Sources→Design Sourcesで先程,作成したブロックデザインを右クリックし,Create HDL Wrapperを選択します.
Wrapperができたら,Generate Bitstreamを選択して完了です.
Ultra96上でOverlayを動かす
<Vivado プロジェクト>.src/sources_1/bd/design1/hw_handoff/design_1/design_1.hwh
<Vivado プロジェクト>.src/sources_1/bd/design1/hw_handoff/design_1/design_1_bd.tcl
<Vivado プロジェクト>.runs/impl_1/design_1_wrapper.bit
の3つのファイルを,まとめてUltra96上の同一ディレクトリ内にコピーしておきます.
これら3つのファイルは念の為,すべて同じ名前(ここでは,design_1.*)にしておきます.
あとはPYNQ Overlay Tutorialに沿って,overlayを動かしていきます.
from pynq import Overlay
overlay = Overlay('/home/xilinx/design_1.bit')
add_ip = overlay.add_0
add_ip.write(0x10, 4)
add_ip.write(0x18, 5)
add_ip.read(0x20)
動きました.
感想
Tutorialって行間が広すぎて生きて帰ってくるのが大変ですね.