はじめに
第4回で、PSでbase overlay動かすところまではできたので、次のステップはカスタムoverlayをつくってみます。
第1回 Setup PYNQ-Z1
第2回 はじめてのJupyter
第3回 pythonとPYNQ PL資源へのアクセス
第4回 PYNQ OVERLAY
第5回 PYNQのOverlayを作ってみた
第6回 カスタムIPを作ってPYNQ overlayに組み込む
第7回 PYNQのHDMI出力overlayを作る
番外編 python ジャンプスタート
用語
PS :Processing System 基本周辺回路を含むマイコン部分
PL :Programmable Logic ユーザがプログラムできる回路
overlay :PLで作る周辺回路
base overlay : デフォルトの周辺回路
資料集
- DIGLENT PYNQ-Z1 リファレンスマニュアル - まずはここ。Zynqから周辺機器の情報、結線まで。
- DIGLENT PYNQ-Z1 ここのDesign ResourceにMaster XDCとZynq Presetsがある
- marseeさん FPGAの部屋PYNQボード用PSの設定方法
- @kamotsuruさん PYNQ-Z1でカスタムIP作成してLEDチカ
PLの作成
vivado web packのインストール
(手順省略)。
ボード資源情報の入手
Zynq Presets(PYNQ-Z1のPLまわりの設定)を上記2)からダウンロードして解凍。
MasterXDC(制約ファイル)もダウンロードして解凍しておく。
サンプルプロジェクトの作成
Zynqなどプロセッサ付きの開発では、IP Integratorベースで設計するのが定石かな。
marseeさんの記事 3)を参考にしながら、kamotsuruさんの記事 4) にそってやってみる。
- プロジェクトを作る(略)
- ここで開発対象とするFPGAまたはボード情報を選択しなければならない。vivado web packには、PYNQ-Z1のボード情報はないので、xc7z020clg400-1を選択して、あとから先ほどダウンロードしたボード資源情報を突っ込んでいく。
IP Integratorを用いてブロックデザインを作成する。
IP Integratorを使うと、GUIをつかって、ハード部品(IP)のブロックを設定したりつないだりしてデザインを作ることができる。
Zynqの設定
- ブロックデザインに、ご本尊のZynqを追加し、ダブルクリックし設定を加えていく。
- まず、presetとして、先ほどダウンロードしたZynq Presetsファイルを適用する。これにより、PSの機能のうちPYNQ-Z1で実際に使用する機能がセットされる。
- LEDにアクセスするには、AXIのGPIO(出力、つまりマスター)を使うが、presetでは、AXIのGPIOは設定されていない。そこで、Zynq BlockダイヤグラムのAXI Master Portをクリックして(メニュ-からPS-PL Configurationから選んでもよい)M AXI GP0にチェックをいれる
- OK
Zynqのピンの接続
- DDRやFIXED_IOを外に出す(Make External)。これらは接続PINが固定されているので「Run Block Automation」をクリックすると自動配線される。(端子を右クリックしてMake Externalとしてもよい)
DDRやFIXED_IOピンについては、Debuggin' Everyday ZYBO で FreeBSD が動くまで (ハードウェア編)の記事を参考にさせていただきました。
LEDを接続するGPIO追加
次にパラレルIO(GPIO)のインターフェースを追加します。marseeさんの3)を参考にします。ひきつづき、IP IntegratorのBLOCK DESIGNでの作業です。
- 「+」アイコン(Add IP)をクリックして、AXI GPIOを選択してブロックデザインに追加
- 4bit幅に変更
- AXIバスを接続するため、Run Connection Automationをクリックすると、接続対象がでてくる。
- そのまま作業をすすめるとGPIO側まで自動でつなごうとするが、きまったピンはないので、あとで手作業でつなぐ。このため、GPIOのチェックをはずし、S_AXIのチェックだけ残し、OK。
- AXI_GPIOブロックのGPIO側のピンを展開し、gpio_io_oを選択し、右クリックしてMake Externalを選択
- でてきたgpio_io_oのポートを選択すると、Block_propertiesのウィンドウに、External Port Propertiesが現れるので、Generalタブを選択し、名前をledに変更。
validate Design
CRITICAL WARNING PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_2 has negative value -0.009 ...
が2つでる。
Forumsの記事Vivado critical warning when creating hardware wrapperや2017.2 - [PSU-1] critical warning with basic Zynq design on DDR interface によれば、まあ気にしなくてもよいようです。
Hardware wrapper作成
- constraintに2)からダウンロードしたxdcファイルをcopy
- xdcのledのエントリの先頭の#をはずす
- synthesisののちgenerate bitstreamを実行
- 成功したら、
***.runs/impl_1/デザイン名_wrapper.bit
をとりだす。 - Tcl Console のログ出力で、Generated を検索し、Generated Block Design Tcl fileのパスを調べて
sources_1_bd/design_1/hw_handof
にあるdesign_1_bd.tclを取り出す - PYNQのsmbに接続し、
¥¥pynq¥xilinx¥pynq¥overlays¥
に格納フォルダ(PQ001など)を作成し、前述のbitとtclをcopyしファイル名を同じにする。
Juniper notebookスクリプトの作成
ここからは@kamotsuruさんの記事4)でやってみます。
from pynq import Overlay
from pynq import PL
OL = Overlay("/home/xilinx/pynq/overlays/PQ001/design_1.bit")
#OL.downoad() # Overlayを作成した時点で自動ダウンロード
PL.ip_dict
from pynq import MMIO
mmio=MMIO(int(PL.ip_dict["axi_gpio_0"]['phys_addr']),4,True)
mmio.write(0,15)
import time
while(True):
for i in range(16):
mmio.write(0,i)
time.sleep(0.5)
まとめ
- 開発ツールはvivado webpack
- PYNQ-Z1固有データ(Zynq Presets,制約)をdigilentから取得
- vivadoを起動して、projectを作る。FPGAはxc7z020clg400-1を選択
- IP Integratorでzynqを配置し、Zynq Presetsをセット。AXI GPIOなどC使用するIOをチェック。
- AXI GPIOを配置し、配線
- 使用ピンのコメントをはずした制約を追加
- tclとbitをコピー
- pythonスクリプトを書く
つぎは@kamotsuruさんの記事4)を参考にして、カスタムIPをつくってみよう。