12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PYNQ-Z1でカスタムIP作成してLEDチカ

Last updated at Posted at 2018-09-21

アジェンダ
0. Vivado WebPACK Editionのインストール

  1. プロジェクトの作成
  2. IP配置
  3. カスタムIPの作成
  4. 回路の追加
  5. bit streamの生成
  6. 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は余計なディレクトリを作らないようにチェックを外したまま
Screen Shot 2018-02-10 at 23.54r.png

Project TypeはRTL Projectを選択。Do not specify sources at this timeはチェックにしたまま
Screen Shot 2018-02-10 at 23.54.43.png
Default Partでは利用するFPGAボードを選択。
PYNQ-Z1では下図のようにxc7z020clg400-1を選択
Family: Zynq-7000
Package: clg400
Speed grade: -1
Screen Shot 2018-02-10 at 23.55.11.png

#2. IP配置
Flow Navidator->IP Integrator->Create Block Designをクリック。とりあえず、デフォルトのままOK
Screen Shot 2018-02-11 at 00.02.10.png
Diagramのキャンバス内のAdd IPの+ボタンをクリック
Screen Shot 2018-02-11 at 00.02r.png
ZYNQ7 Processing Systemを見つけダブルクリックしてIPをキャンバス内に配置
Screen Shot 2018-02-11 at 00.03.24.png
配置されたIP(水色のZYNQと書かれた箱)をダブルクリック
Screen Shot 2018-02-11 at 00.03.43.png
メニューバーのPresets->Apply Configurationを選択。
Screen Shot 2018-02-11 at 00.04.12.png
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
Screen Shot 2018-09-20 at 19.53.28.png
上記pynq_revC.tclでは、GP0が無効化されているので、有効化する。PS-PL Configurationを選択。AXI Non Secure Enablement->GP Master AXI Interfaceを展開し、M AXI GP0 Interfaceにチェック
Screen Shot 2018-02-11 at 00.06.18.png

#3. カスタムIPの作成
メニューバーのTools->Create and Package IP...を選択
Screen Shot 2018-02-11 at 00.06.55.png
Create a new AXI4 peripheralを選択
Screen Shot 2018-02-11 at 00.07.08.png
Name等はデフォルトのまま、IP Locationにプロジェクトのディレクトリを設定
Screen Shot 2018-02-11 at 23.40.37.png
AXI4インタフェース設定は、デフォルトのまま
Screen Shot 2018-02-11 at 23.41.07.png
Edit IPを選択
Screen Shot 2018-02-11 at 23.41.18.png

#4. 回路の追加
Screen Shot 2018-02-11 at 23.44.15.png
Sources->Design Sourcesのmyip_v1_0を展開、myip_v1_0_S00_AXI_inst:myip_v1_0_S00_AXIをダブルクリック、myip_v1_0_S00_AXI.vを編集
今回は、LEDを出力ポートとして追加します。
Screen Shot 2018-02-11 at 23.45.52.png
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を編集
Screen Shot 2018-09-20 at 20.17.35.png
同様に、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),
Screen Shot 2018-02-11 at 23.49.22.png Package IPペインから、Customization Parametersを選択し、右上ののMerge changes from~をクリック Screen Shot 2018-02-11 at 23.50.34.png Cutomization GUIを選択すると、LED端子が追加されている。 Screen Shot 2018-02-11 at 23.51.13.png Review and Packageを選択し、Re Package IPをクリック Screen Shot 2018-02-11 at 23.55.56.png Diagramウィンドウに戻り、ペイン上部の+アイコン(Add IP)をクリックし、先ほど作ったmyip_v1.0をダブルクリックして配置 Screen Shot 2018-02-11 at 23.56.26.png ペイン上部のRun Connection Automationをクリック(その横のRun Block Automationもやっとく) Screen Shot 2018-02-11 at 23.56.38.png そのままOKすると結線される。 Screen Shot 2018-02-11 at 23.57.29.png myip_0の端子LED[3:0]の上で右クリックメニューからMake Externalを実行 Screen Shot 2018-02-11 at 23.58r.png 出力ポートが接続される。 Screen Shot 2018-09-20 at 23.21r.png 出力先がLEDでなくLED_0に接続となる時は、LED_0をクリックするとExternal Port PropertiesがLED_0のプロパティを表示するので、NameをLEDに修正する。 Screen Shot 2018-02-11 at 23.58.22.png 右クリックメニューからValidate Designを実行し、デザインをチェック Screen Shot 2018-02-11 at 23.59.45.png Sources->Design Sources->design_1を右クリックし、Create HDL Wrapperを実行 Screen Shot 2018-02-12 at 00.00.27.png Sources->Constraints->constrs_1を右クリックし、Add sourcesを実行 Screen Shot 2018-02-12 at 00.00.33.png Add or creates constraintsを選択 Screen Shot 2018-09-20 at 21.40.58.png 制約ファイルを読み込み 事前に、上記digilentのサイトからDesign ResourcesのMaster XDC(pynq-z1_c.zip)をダウンロード/解凍、LEDsの部分を下記のようにコメントアウト/修正しておく(ledをLEDに)。
##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]
Screen Shot 2018-02-12 at 00.01.08.png

#5. bit streamの生成
Screen Shot 2018-02-12 at 00.01.56.png
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

Untitled.png In[1]:
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)

LEDチカ
Untitled.gif

#参考
PYNQ-Z1のOverlay読み込みとPythonからのFPGA PLの制御
FPGAプログラミング大全 Xilinx編

12
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?