Edited at

第5回 PYNQのOverlayを作ってみた


はじめに

とりあえず、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 ジャンプスタート


資料集

1) DIGLENT PYNQ-Z1 リファレンスマニュアル - まずはここ。Zynqから周辺機器の情報、結線まで。

2) DIGLENT PYNQ-Z1 ここのDesign ResourceにMaster XDCとZynq Presetsがある

3) marseeさん FPGAの部屋PYNQボード用PSの設定方法

4) @kamotsuruさん PYNQ-Z1でカスタムIP作成してLEDチカ


PLの作成


vivado web packのインストール

(手順省略)。


ボード資源情報の入手

Zynq Presets(PYNQ-Z1のPLまわりの設定)を上記2)からダウンロードして解凍。

MasterXDC(制約ファイル)もダウンロードして解凍しておく。


サンプルプロジェクトの作成

Zynqなどプロセッサ付きの開発では、IP Integratorベースで設計するのが定石かな。

marseeさんの記事 3)を参考にしながら、kamotsuruさんの記事 4) にそってやってみる。


  1. プロジェクトを作る(略)

  2. ここで開発対象とするFPGAまたはボード情報を選択しなければならない。vivado web packには、PYNQ-Z1のボード情報はないので、xc7z020clg400-1を選択して、あとから先ほどダウンロードしたボード資源情報を突っ込んでいく。


IP Integratorを用いてブロックデザインを作成する。

IP Integratorを使うと、GUIをつかって、ハード部品(IP)のブロックを設定したりつないだりしてデザインを作ることができる。


Zynqの設定


  1. ブロックデザインに、ご本尊のZynqを追加し、ダブルクリックし設定を加えていく。

  2. まず、presetとして、先ほどダウンロードしたZynq Presetsファイルを適用する。これにより、PSの機能のうちPYNQ-Z1で実際に使用する機能がセットされる。

  3. LEDにアクセスするには、AXIのGPIO(出力、つまりマスター)を使うが、presetでは、AXIのGPIOは設定されていない。そこで、Zynq BlockダイヤグラムのAXI Master Portをクリックして(メニュ-からPS-PL Configurationから選んでもよい)M AXI GP0にチェックをいれる

  4. OK


Zynqのピンの接続


  1. 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での作業です。

1. 「+」アイコン(Add IP)をクリックして、AXI GPIOを選択してブロックデザインに追加

2. 4bit幅に変更

2. AXIバスを接続するため、Run Connection Automationをクリックすると、接続対象がでてくる。

3. そのまま作業をすすめるとGPIO側まで自動でつなごうとするが、きまったピンはないので、あとで手作業でつなぐ。このため、GPIOのチェックをはずし、S_AXIのチェックだけ残し、OK。

4. AXI_GPIOブロックのGPIO側のピンを展開し、gpio_io_oを選択し、右クリックしてMake Externalを選択

5. でてきた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 wrapper2017.2 - [PSU-1] critical warning with basic Zynq design on DDR interface によれば、まあ気にしなくてもよいようです。


Hardware wrapper作成


  1. constraintに2)からダウンロードしたxdcファイルをcopy

  2. xdcのledのエントリの先頭の#をはずす

  3. synthesisののちgenerate bitstreamを実行

  4. 成功したら、***.runs/impl_1/デザイン名_wrapper.bitをとりだす。

  5. Tcl Console のログ出力で、Generated を検索し、Generated Block Design Tcl fileのパスを調べてsources_1_bd/design_1/hw_handofにあるdesign_1_bd.tclを取り出す

  6. PYNQのsmbに接続し、¥¥pynq¥xilinx¥pynq¥overlays¥に格納フォルダ(PQ001など)を作成し、前述のbitとtclをcopyしファイル名を同じにする。


Juniper notebookスクリプトの作成

ここからは@kamotsuruさんの記事4)でやってみます。


PLをインポート

from pynq import Overlay

from pynq import PL
OL = Overlay("/home/xilinx/pynq/overlays/PQ001/design_1.bit")


GPIOの名前を確認

#OL.downoad()  # Overlayを作成した時点で自動ダウンロード

PL.ip_dict


MemoryMapedIOでアクセス

from pynq import MMIO

mmio=MMIO(int(PL.ip_dict["axi_gpio_0"]['phys_addr']),4,True)
mmio.write(0,15)


Lチカby@kamotsuruさん

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をつくってみよう。