アジェンダ
0. Vivado WebPACK Editionのインストール
- プロジェクトの作成
- IP配置
- カスタムIPの作成
- 回路の追加
- bit streamの生成
- Jupyter notebookからの実行
#0. Vivado WebPACK Editionのインストール
Vivado WebPACK Editionを下記から、アカウント作ってインストールしておく。
https://www.xilinx.com/support/download.html
Vivado Design Suite - HLx Edition - xxxx.x Full Product Installation
以下説明は、下記環境の実行例です。
-OS: CentOS 7.4
-Vivado version: Vivado v2017.3
-FPGA評価ボード: PYNQ-Z1
vivadoを起動
sudo /opt/Xilinx/Vivado/2017.3/bin/vivado
#1. プロジェクトの作成
Vivadoを起動して、Quick StartのCreate Projectをクリック。Project Nameに適当な名前と、Project Locationに保存ディレクトリを入力。create project subdirectoryは余計なディレクトリを作らないようにチェックを外したまま
Project TypeはRTL Projectを選択。Do not specify sources at this timeはチェックにしたまま
Default Partでは利用するFPGAボードを選択。
PYNQ-Z1では下図のようにxc7z020clg400-1を選択
Family: Zynq-7000
Package: clg400
Speed grade: -1
#2. IP配置
Flow Navidator->IP Integrator->Create Block Designをクリック。とりあえず、デフォルトのままOK
Diagramのキャンバス内のAdd IPの+ボタンをクリック
ZYNQ7 Processing Systemを見つけダブルクリックしてIPをキャンバス内に配置
配置されたIP(水色のZYNQと書かれた箱)をダブルクリック
メニューバーのPresets->Apply Configurationを選択。
PYNQ-Z1用のPreset TCL File(pynq_revC.tcl)を選択。(事前に、下記からDesign ResourcesのZynq Presets(pynq_revC.zip)をダウンロード/解凍しておく。)
https://reference.digilentinc.com/reference/programmable-logic/pynq-z1/start
上記pynq_revC.tclでは、GP0が無効化されているので、有効化する。PS-PL Configurationを選択。AXI Non Secure Enablement->GP Master AXI Interfaceを展開し、M AXI GP0 Interfaceにチェック
#3. カスタムIPの作成
メニューバーのTools->Create and Package IP...を選択
Create a new AXI4 peripheralを選択
Name等はデフォルトのまま、IP Locationにプロジェクトのディレクトリを設定
AXI4インタフェース設定は、デフォルトのまま
Edit IPを選択
#4. 回路の追加
Sources->Design Sourcesのmyip_v1_0を展開、myip_v1_0_S00_AXI_inst:myip_v1_0_S00_AXIをダブルクリック、myip_v1_0_S00_AXI.vを編集
今回は、LEDを出力ポートとして追加します。
18行目くらいに下記のように出力ポートを追加
//Users to add ports here
output wire [3:0] LED,
同様に400行目くらい下記のようにレジスタをポート信号へ接続
//Add user logic here
assign LED = slv_reg0[3:0];
編集したら、フロッピーディスクアイコンをクリックしてSaveします。
Sources->Design Sourcesのmyip_v1_0をダブルクリック、上位階層のmyip_v1_0.vを編集
同様に、18行目くらいに下記のように出力ポートを追加
//Users to add ports here
output wire [3:0] LED,
51行目くらいに下記のように下位階層のポートを追加
) myip_v1_0_S00_AXI_inst (
.LED (LED),
.S_AXI_ACLK(s00_axi_aclk),
##LEDs
set_property -dict { PACKAGE_PIN R14 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L6N_T0_VREF_34 Sch=led[0]
set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L6P_T0_34 Sch=led[1]
set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L21N_T3_DQS_AD14N_35 Sch=led[2]
set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L23P_T3_35 Sch=led[3]
#5. bit streamの生成
Flow Navigator->PROGRAM AND DEBUG->Generate Bitstreamをクリック。
ウィンドウの右上で緑の風車?がくるくる回るので終わるまで待つと、下部のTCL Consoleに下記のようなログが出るので、プロジェクトディレクトリ内の当該ファイルdesign_1_bd.tclとdesign_1_wrapper.bit を、PYNQ-Z1上の/home/xilinx/pynq/overlays/baseディレクトリにscp等でコピーしておく。(PYNQ-Z1はデフォルトの構成です。)
design_1_bd.tclはdesign_1_wrapper.tclにリネームして置く。
...
Generated Block Design Tcl file /home/kenichi/blink_zq/blink_zq.srcs/sources_1/bd/design_1/hw_handoff/design_1_bd.tcl
...
Run output will be captured here: /home/kenichi/blink_zq/blink_zq.runs/impl_1/runme.log
Writing bitstream ./design_1_wrapper.bit...
#6. Jupyter notebookからの実行
PYNQ-Z1上のJupyter notebookで下記のようにpython scriptを書く。
Jupyter notebookの使い方は、この辺を見てください。https://pynq.readthedocs.io/en/v2.0/jupyter_notebooks.html
from pynq import Overlay
from pynq import PL
OL = Overlay("/home/xilinx/pynq/overlays/base/design_1_wrapper.bit")
bitstreamファイルを指定
In[2]:
OL.download()
PL.ip_dict
bitstreamを読み込んで、デバイスファイルに書き込み
In[3]:
from pynq import MMIO
mmio=MMIO(int(PL.ip_dict["myip_0"]["phys_addr"]), 4, True)
mmio.write(0,15)
MMIOクラスを用いて、FPGAのレジスタにアクセス
In[4]:
import time
while(True):
for i in range(16):
mmio.write(0,i)
time.sleep(0.5)
#参考
PYNQ-Z1のOverlay読み込みとPythonからのFPGA PLの制御
FPGAプログラミング大全 Xilinx編