ACRi

SWEST/ACRi 共同企画セッション

PYNQ でお手軽に始める
FPGA システム開発◆ Adaptive Computing Research Initiative2021-09-03 SWEST23◼ FPGA に代表されるアダプティブなハードウェアデバイスの活用方法を模索・研究する団体◼ 要するに，FPGA を盛り上げる会◼ 5大学，17社が参加（2021/7 現在）

藤枝 直輝（愛知工業大学）◆ 本セッションは SWEST/ACRi の共同企画です

https://www.acri.c.titech.ac.jp/
SWEST/ACRi 共同企画

2021/9/3

アウトライン

FPGA 使ってますか？

◆ PYNQ とは何か？ 何が嬉しいか？

◆ FPGA = 論理が書換え可能なディジタルLSI

2◼ 開発コスト・期間の削減◼ 製造のイニシャルコスト低減◼ ハードのプロセッサコアと FPGA とがワンチップ化された製品も存在◆ PYNQ-Z1 ボードのセットアップ◆ LED 点滅回路を含む設計例◆ グラフィックパターン送信回路を含む設計例◆ Xilinx 社 Zynq シリーズなど◆ FPGA のハード開発◼ ハードウェア記述言語（HDL）がよく使われる◼ 最近では C/C++ で開発（高位合成）することもSWEST/ACRi 共同企画

2021/9/3

3

ありがちな？ パターン◼ Xilinx 社のオープンソースプロジェクト◼ 各種ライブラリ（ハードウェア・ソフトウェア），
Python 開発環境，事前に用意されたディスクイメージ等

assign LED = count[25];◆ その先が長すぎて挫折する

always_ff @ (posedge CLK) begin
if (RST) begin
count <= 26'h0;
end else begin
count <= count + 1'b1;
end
end
endmodule◆ PYNQ のねらい
◼ 「組込みアーキテクト・エンジニア・
デザイナが ASIC スタイルの設計ツールを使うことなく Zynq を利用できるようにする」*◼ そもそも何をしていいかわからない◼ 作った回路を周辺回路にパッケージするには……
◼ プロセッサを含んだシステムを合成するには……
◼ プロセッサ側で制御プログラムを動かすには……
◼ プロセッサ側で OS を走らせるには……
SWEST/ACRi 共同企画

2021/9/3

4◆ Python の生産性を Zynq にmodule led_disp (input logic CLK,
input logic RST,
output logic LED);
logic [25:0] count;……

2021/9/3

PYNQ◆ FPGA の評価ボードを買ってみる◆ LED をチカチカさせてみる

SWEST/ACRi 共同企画

* PYNQ Introduction, https://pynq.readthedocs.io/en/v2.6.1/, retrieved 2021-07-08.
画像出典: PYNQ: Python Productivity, http://www.pynq.io, retrieved 2021-07-08.
5

SWEST/ACRi 共同企画

2021/9/3

61

PYNQ の利点 (1)PYNQ の利点 (2)◆ 論理の書換えの容易さ◆ プログラミングの容易さ◼ Python でプログラムが記述できる◼ オーバーレイ: FPGA 部分の情報一式◆ 記述の抽象度の高さ◆ .bit ファイル: 回路情報

◆ 豊富なソフトウェアライブラリ◆ .hwh ファイル: ハードウェア構成◼ ハードウェアへのアクセスも容易◼ Python で Overlay クラスのインスタンスを作成すると，対応する回路が FPGA 部分に自動的に書き込まれる◼ ハードウェア構成ファイルを読み取り，対応するドライバ
クラスを自動的にインスタンス化
プロセッサ(PS)

オーバーレイ1

オーバーレイ2

FPGA(PL).bit ファイル.bit ファイル

Zynq
SWEST/ACRi 共同企画

◆ ドライバクラスの read, write メソッドで MMIO にアクセス◆ カスタムのドライバクラスの作成も可能
from pynq import Overlay
import timepl = Overlay("knight_pynq.bit")gpio = pl.axi_gpio_0
for i in range(3):gpio.write(0, 10000000); time.sleep(3)gpio.write(0, 20000000); time.sleep(3)gpio.write(0, 0xffffffff)

PYNQ における LED 点滅回路の制御プログラム例

PYNQ のファイルシステム
7

2021/9/3

SWEST/ACRi 共同企画

2021/9/3

8

PYNQ の利点 (3)つまり PYNQ では……

◆ ボードとの接続の容易さ◆ 自作回路をプロセッサの周辺回路として含んだ
FPGA システムを，お手軽に開発できる！

◼ Ethernet ケーブルでボードと接続◼ Python のプログラミングは Jupyter Notebook で◼ ハードウェアオーバーレイと関連 API◼ Python による開発環境・ライブラリ◼ Web ベースの技術を活用した容易なボード利用◆ Web ブラウザからアクセス◼ ファイルのアップロードもお好みの方法で◆ SCP, SMB, Jupyter Notebook のアップロード機能...

画像出典: PYNQ: Python Productivity, http://www.pynq.io, retrieved 2021-07-08.
SWEST/ACRi 共同企画

2021/9/3

9

SWEST/ACRi 共同企画

2021/9/3

PYNQ 対応ボード

アウトライン◆ Zynq ベースの各種ボード，または Alveo◆ PYNQ とは何か？ 何が嬉しいか？

◼ ディスクイメージが用意されているボードを使うのが楽10◆ PYNQ-Z1 ボードのセットアップ◆ 本セッションの対象◆ LED 点滅回路を含む設計例◼ PYNQ-Z1（Digilent社）◼ PYNQ-Z2 （TUL社）でも OK◆ グラフィックパターン送信回路を含む設計例◆ I/O の種類や配置に違いはあるが，スペックはほとんど同じ◆ PYNQ-Z2 の方が少し安い

ローエンド（数万円程度）
ミドルレンジ（数十万円程度）
ハイエンド（それ以上）
画像出典: PYNQ: Python Productivity - Board, http://www.pynq.io/board.html, retrieved 2021-07-08.

SWEST/ACRi 共同企画

2021/9/3

11

SWEST/ACRi 共同企画

2021/9/3

122

機材を準備する

機材の準備（補足）◆ USB-Ethernet アダプタを使うと便利

ボード本体◼ ボードをホスト PC とだけ接続できる◆ 単に既存の有線 LAN に接続しても OK

microUSB ケーブル

◼ この場合はアダプタは不要◼ DHCP で IP アドレスが設定される

Ethernet ケーブル
microSD カード(8 GB 以上）

◆ セキュリティ，有線 LAN の物理的配線など考慮して，お好みの方でUSB-Ethernet
アダプタ
SWEST/ACRi 共同企画

2021/9/3

13

SWEST/ACRi 共同企画

2021/9/3

イメージファイルをダウンロード

イメージファイルを書き込み◆ ボードに対応した SD カードイメージをhttp://www.pynq.io/board.html
からダウンロード◆ Windows なら Rufus などのツールを使って，イメージファイルを microSD に書き込む

14◼ ブートの種類 → 選択 で先ほどのイメージを選択◆ くれぐれも書き込み先デバイスを間違えないように！

◼ 圧縮時 2 GB 弱，展開後 6 GB 程度あるので注意◼ 展開して pynq_z1_v2.6.0.img を取り出しておく◼ 書き込み後は2つのパーティションが作成される◆ 後者は Windows から認識できないが，それで正常◆ v以降の数字は今後のバージョンアップ

で変わる可能性あり◆ Windows 上で開こうとすると「イメージが壊れています」と言われるが，それで正常
画像出典: PYNQ: Python Productivity - Board, http://www.pynq.io/board.html, retrieved 2021-07-08.

SWEST/ACRi 共同企画

2021/9/3

15

ボードの接続を確かめる

SWEST/ACRi 共同企画

2021/9/3

16

USB-Ethernet アダプタの設定◆ 設定 → ネットワークとインターネット →イーサネット → アダプタのオプションを変更する

ジャンパ位置をSD に◼ アダプタのプロパティを以下の通り設定

ジャンパ位置をUSB に※ ボード左上側のジャンパは，PYNQ-Z2 ではボード右側．
microSD カードの差込口は，PYNQ-Z2 ではボード下側．
SWEST/ACRi 共同企画

2021/9/3

17

SWEST/ACRi 共同企画

2021/9/3

18

3

ボードの電源を入れる

Jupyter Notebook にログイン◆ ボードの電源スイッチを ON 側に◆ ブラウザで 192.168.2.99 にアクセスする◼ 1分ほどすると LED が数回点滅したあと，緑色の4つの LED が点灯した状態になる◼ Tera Term などで仮想シリアルポートにアクセス(115,200 bps）すると，シェルの画面が表示される◼ 既存の LAN に接続した場合は，ボードに割当てられたIP アドレスを確認して，そのアドレスにアクセスする◼ Jupyter Notebook のログイン画面が表示されるので，
パスワードに xilinx と入力してログインする

初期パスワードは
xilinxSWEST/ACRi 共同企画

2021/9/3

19

SWEST/ACRi 共同企画

2021/9/3

20

アウトライン

LED 点滅回路◆ PYNQ とは何か？ 何が嬉しいか？

◆ PYNQ の緑色 LED（4個）を，一定時間おきに点滅させる◆ PYNQ-Z1 ボードのセットアップ◼ 点滅周期 CDIV は入力として与える◆ LED 点滅回路を含む設計例◆ グラフィックパターン送信回路を含む設計例
CDIV 回数える

SWEST/ACRi 共同企画

2021/9/3

21

LED 点滅回路のソースコード
module blink_pynq (input wire
CLK, RESETN,
input wire [31:0] CDIV,
output reg[3:0] LED);

blink.v

2021/9/3

22◆ 自作回路が外部入出力をもつ場合◼ 入出力信号の FPGA のピンへの割当ての情報が必要◼ 制約ファイル（拡張子 .xdc）を使う

always @ (CDIV, count, LED) begin
if (count >= CDIV) begin
n_count = 1;
数え終わったら LED を反転
n_led= ~ LED;end else begin
n_count = count + 1'b1;
CDIV 回数える
n_led= LED;
end
end

SWEST/ACRi 共同企画

2021/9/3

LED 点滅回路の制約ファイル

reg [31:0] count, n_count;reg [3:0] n_led;

always @ (posedge CLK) begin
if (~ RESETN) begin
count <= 0;LED<= 4'b1001;
end else begin
count <= n_count;LED<= n_led;end
end
endmodule

SWEST/ACRi 共同企画

数え終わったら LED を反転◆ LED 点滅回路では◼ 回路の LED 出力を PYNQ-Z1 の LED 出力ピン
（右から R14, P14, N16, M14）へ割当てる

LED の初期値（一部点灯・一部消灯）

blink.xdc
set_property -dict { PACKAGE_PIN R14
set_property -dict { PACKAGE_PIN P14
set_property -dict { PACKAGE_PIN N16
set_property -dict { PACKAGE_PIN M14

23

SWEST/ACRi 共同企画

IOSTANDARD LVCMOS33 } [get_ports { LED[0] }];IOSTANDARD LVCMOS33 } [get_ports { LED[1] }];IOSTANDARD LVCMOS33 } [get_ports { LED[2] }];IOSTANDARD LVCMOS33 } [get_ports { LED[3] }];2021/9/3

24

4

Vivado の準備

新規プロジェクトの作成 (1)◆ PYNQ のバージョンに対応した Vivado を用意◆ File → Project → New◼ 既存の周辺回路（IP コア）のバージョンを合わせるため◼ PYNQ 2.6 に対応した Vivado: 2020.1◼ ウィザードが表示されるので，まず Next
◼ 2つ目の画面でプロジェクト名と作業ディレクトリを指定◆ create project subdirectory にチェックすると，◆ ボードファイルを事前にインストール

プロジェクト名と同じ名前のフォルダが自動的に作成される

https://pynq.readthedocs.io/en/latest/overlay_design_methodology/board_settings.html

SWEST/ACRi 共同企画

2021/9/3

25

SWEST/ACRi 共同企画

2021/9/3

26

新規プロジェクトの作成 (2)プロジェクトへのファイルの追加 (1)◆ プロジェクト種別: RTL Project◆ LED 点滅回路のソースをプロジェクトに追加◼ その下の Do not specify～ にチェックしておく◼ Project Manager → Add Sources でウィザードが表示される◼ Add or create design sources◆ パーツ選択: Boards → PYNQ-Z1◼ 表示されない場合は以下をチェック◆ ボードファイルが所定の位置にコピーされているか◆ Vivado インストール時に Zynq-7000 をチェックしたか◆ 最終確認画面で Finish

SWEST/ACRi 共同企画

2021/9/3

27

SWEST/ACRi 共同企画

2021/9/3

プロジェクトへのファイルの追加 (2)ブロック図の新規作成◆ LED 点滅回路のソースをプロジェクトに追加◆ 点滅回路を含んだシステムのブロック図を作成◼ Add Files ボタンでソースコードのファイルを指定する◼ ファイルがリストに追加されたことを確認して Finish

28◼ IP Integrator → Create Block Design◼ ダイアログが出るのでそのまま OK を押す◆ 同じ要領で制約ファイルも追加◼ ただし，Add or create constraints を使う

SWEST/ACRi 共同企画

2021/9/3

29

SWEST/ACRi 共同企画

2021/9/3305回路ブロックの追加 (1)回路ブロックの追加 (2)◆ プロセッサ部をブロック図に追加◆ 汎用 I/O（点滅周期用）をブロック図に追加◼ ブロック図の + ボタンを押す◼ ZYNQ7 Processing System を探し，ダブルクリック◼ + ボタン → AXI GPIO を探してダブルクリック◼ 追加された AXI GPIO のブロックをダブルクリック◼ IP Configuration → All Outputs をチェック◆ ログに警告が表示されるが，無視して構わない◼ Run Block Automation で初期設定

SWEST/ACRi 共同企画

2021/9/3

31

SWEST/ACRi 共同企画

2021/9/3

回路ブロックの追加 (3)回路ブロックの追加 (4)◆ 汎用 I/O（点滅周期用）をプロセッサに接続◆ 点滅回路をブロック図に追加・接続◼ Run Connection Automation をクリック◼ axi_gpio_0 の S_AXI にだけチェックを入れて OK

32◼ ブロック図の何もない場所を右クリックし，Add Module◼ blink_pynq を選択して，OK◼ AXI GPIO の gpio_io_o 出力を，blink_pynq の CDIV 入力へとドラッグして接続する◆ この段階でのブロック図の例: 右下◆ gpio_io_o は GPIO の横の + をクリックすると表示される

SWEST/ACRi 共同企画

2021/9/3

33

SWEST/ACRi 共同企画

2021/9/3

回路ブロックの追加 (5)ハードウェアの作成 (1)◆ 点滅回路をブロック図に接続◆ ブロック図の検証◼ blink_pynq の LED 出力を右クリックし，Create Port
◼ ダイアログが表示されるので，デフォルトのまま OK

34◼ ブロック図の何もないところを右クリックし，
Validate Design◼ Validation Successful と表示されることを確認◆ LED が出力ポートとして外に引き出される（図左側）◼ Run Connection Automation を実施◆ クロック，リセットが接続される（図右側）

SWEST/ACRi 共同企画

2021/9/3

35

SWEST/ACRi 共同企画

2021/9/3

36

6

ハードウェアの作成 (2)ハードウェアの作成 (3)◆ ブロック図の HDL によるラッパを作成◆ ブロック図からの各種ファイルの生成◼ Sources → design_1 を右クリックし，Create HDL Wrapper◼ 「Let Vivado manage～」を選択して OK◼ design_1_wrapper というモジュールが作成され，太字で表示されていることを確認

SWEST/ACRi 共同企画

2021/9/3◼ IP Integrator → Generate Block Design◼ ダイアログの設定は変更せず Generate ボタン◼ 1～2分待つとファイルの生成・合成が完了し，Vivado 画面右上に Ready と表示される

37

SWEST/ACRi 共同企画

2021/9/3

ハードウェアの作成 (4)PYNQ にアップロード (1)◆ ハードウェアの合成◆ オーバーレイに必要なファイルをコピー◼ Program and Debug → Generate Bitstream◼ 数分待つとハードウェアの合成に成功した旨が表示されるので，Cancel でダイアログを閉じる◼ プロジェクト名.runs¥impl_1¥design_1_wrapper.bit◼ プロジェクト名.srcs¥sources_1¥bd¥design_1¥
hw_handoff¥design1.hwh◼ それぞれ適当なディレクトリにコピーしてから，
blink.bit, blink.hwh に名前を変更しておく◆ 以降の作業は Vivado 上では行わないのでSWEST/ACRi 共同企画

2021/9/3

39

SWEST/ACRi 共同企画

2021/9/3

PYNQ にアップロード (2)PYNQ にアップロード: 参考◆ オーバーレイを PYNQ にアップロード◆ Windows の設定やバージョンによっては，事前にログイン情報の設定が必要◼ エクスプローラで「¥¥192.168.2.99」にアクセス◼ xilinx をダブルクリック◼ ユーザ名・パスワードに xilinx と入力してログイン◼ pynq¥overlays ディレクトリに blink フォルダを作り，そこに先ほどの2つのファイルをコピー

SWEST/ACRi 共同企画

2021/9/3

38

40◼ コントロールパネル → 資格情報マネージャ→ Windows 資格情報の追加 から追加する

41

SWEST/ACRi 共同企画

2021/9/3

42

7

Python で動作確認 (1)Python で動作確認 (2)◆ Jupyter Notebook 上でスクリプトを作成◆ 点滅周期 CDIV を制御する◼ New → Python 3◼ ひとまず Overlay クラスのインスタンスを作成するだけのスクリプトを記述・実行してみる◼ LED がうっすら点灯する（しているように見える）◼ AXI GPIO に書き込みを行ってから一定時間待つ，という動作を行うスクリプトを記述・実行してみる◆ 実際には超高速で点滅している

点滅周期を 0.5 秒に設定
(100 MHz x 0.5 s = 50,000,000)

うっすら点灯しているように見える

SWEST/ACRi 共同企画

2021/9/3

43

SWEST/ACRi 共同企画

2021/9/3

Python で動作確認 (3)

参考情報◆ 点滅周期 CDIV を制御する◆ ここまでの内容（PYNQ-Z1 のセットアップ，
LED 点滅回路を含む設計例）と類似の例を，
ACRi ブログの以下の記事で説明している◼ 実行結果（動画）44

https://www.acri.c.titech.ac.jp/wordpress/archives/11224◆ ソースコードは GitHub にて公開中
https://github.com/nfproc/connect_with_pynq/
SWEST/ACRi 共同企画

2021/9/3

45

SWEST/ACRi 共同企画

2021/9/3

アウトライン

結局 HDL なの？

◆ PYNQ とは何か？ 何が嬉しいか？

◆ HDL が書けるに越したことはない46◼ クロックサイクル単位での細かい回路の動作の記述は，HDL でないと難しい◆ PYNQ-Z1 ボードのセットアップ◆ LED 点滅回路を含む設計例◆ C/C++ からの高位合成でも，最近は結構
なんとかなる◆ グラフィックパターン送信回路を含む設計例◼ 開発期間を格段に短くできる◼ HDL での設計前のプロトタイピングに使う手も◼ 書き方に多少のノウハウは必要

SWEST/ACRi 共同企画

2021/9/3

47

SWEST/ACRi 共同企画

2021/9/3

48

8

グラフィックパターン送信回路

通常の C 言語で書くと◆ 画面の一部分に表示されるカラーパターンを生成・送信する回路◆ 構造体 pixel_t の配列を用意◼ for ループで各画素の値を順番に書き込んでいく◼ 画面は HDMI で外部モニタに表示する◼ カラーパターンはスクロール可能とする◼ スクロール量は入力として与える

typedef struct {unsigned char r, b, g;} pixel_t;void pattern_sender(int frame, pixel_t pout[][800]){
int x, y, col_x, col_y;
col_y = (frame >> 1) & 0xff;
for (y = 0; y < 480; y++) {col_x = frame & 0x1ff;
for (x = 0; x < 800; x++) {pout[y][x].r = (col_x[8]) ? col_y : 0x00;
pout[y][x].b = (col_x[6]) ? col_y : 0x00;
pout[y][x].g = (col_x[7]) ? col_y : 0x00;
col_x++;}
col_y++;}}SWEST/ACRi 共同企画

2021/9/3

49

SWEST/ACRi 共同企画

2021/9/3

50

カラーパターンをストリームで送信

ストリームを使って書くと◆ 送信したカラーパターンの書き込みは
既存の AXI Video DMA (VDMA) に任せる

◆ hls::stream 型の参照渡し引数◼ << 演算子を使い，画素データを順番に書き込む◼ インタフェースには AXI Stream を用いる
◼ 面倒なメモリアドレスなどの管理が不要に

グラフィックパターン
送信回路

SWEST/ACRi 共同企画

AXI Stream#include <ap_int.h>#include <hls_stream.h>#include <ap_axi_sdata.h>
typedef ap_axiu<24,1,1,1> pixel_t;void pattern_sender(int frame, hls::stream<pixel_t> &pout) {// 中略
col_y = (frame >> 1) & 0xff;
for (y = 0; y < 480; y++) {col_x = frame & 0x1ff;
for (x = 0; x < 800; x++) {p.data.range(23, 16) = (col_x[8]) ? col_y : zero;
p.data.range(15, 8) = (col_x[6]) ? col_y : zero;
p.data.range( 7, 0) = (col_x[7]) ? col_y : zero;p.user[0] = (x == 0 && y == 0);p.last= (x == 799);
pout << p;col_x++;}
col_y++;}}AXI VDMA

2021/9/3

データ (data) 24 bit，
補助データ（user） 1 bitのストリームデータ型

51

SWEST/ACRi 共同企画

2021/9/3

高位合成ディレクティブ

テストベンチも C++ で◆ プログラム本体で表現しきれない付加情報は，#pragma HLS ディレクティブで◆ main 関数では，作成した関数の動作を確認するプログラム（テストベンチ）を記述する◼ 引数をどのように回路のインタフェースに変換するか◼ 回路のパイプライン化・ループアンローリングなどを適用するか etc.

◼ 今回は，送信されたパターンのチェックサムを求めて表示するプログラム

int main (){hls::stream<pixel_t> pdata;
unsigned int checksum;for (int i = 0; i < 30; i += 10) {pattern_sender(i, pdata);
checksum = pattern_checksum(pdata);
printf("frame %2d: checksum = %08x¥n", i, checksum);}
return 0;}

void pattern_sender(int frame, hls::stream<pixel_t> &pout) {#pragma HLS INTERFACE s_axilite port=return bundle=ctrl#pragma HLS INTERFACE s_axilite port=frame bundle=ctrl#pragma HLS INTERFACE axis port=pout// 中略
for (x = 0; x < 800; x++) {#pragma HLS PIPELINE
p.data.range(23, 16) = (col_x[8]) ? col_y : zero;// 中略}

SWEST/ACRi 共同企画

2021/9/3

52

53

SWEST/ACRi 共同企画

2021/9/3

54

9開発の流れVitis HLS のプロジェクト作成 (1)◆ 作成した関数を Vitis HLS でハードウェア化◆ Vitis HLS を起動して，プロジェクト作成◼ File → New Project◼ プロジェクト名と作業ディレクトリを指定（Vivado と同じ要領で）して，Next◆ Vivado でブロック図を作成◆ PYNQ にアップロードし，動作確認
ここの要領は点滅回路のときと同じ

SWEST/ACRi 共同企画

2021/9/3

55

SWEST/ACRi 共同企画

2021/9/3

56

Vitis HLS のプロジェクト作成 (2)Vitis HLS のプロジェクト作成 (3)◆ 回路記述のソースコードを指定する◆ テストベンチのソースコードを指定する◼ Add Files で回路記述のソースコードを追加◼ Top Function 横の Browse をクリック◼ pattern_sender 関数を選択して，OK◼ Top Function が pattern_sender に変わったことを確認して，Next

SWEST/ACRi 共同企画

2021/9/3◼ Add Files でテストベンチのソースコードを追加し，Next◆ 対象ボードの選択◼ Part の横の ... ボタンを押す◼ Boards → PYNQ-Z1 を選択して，OK◼ 最後に Finish ボタン

57

SWEST/ACRi 共同企画

2021/9/3

58

C/C++ による動作チェック

関数を高位合成◆ まずはソフトウェアとしてバグがないかの確認◆ 次に関数を高位合成でハードウェアに変換◼ Project → Run C Simulation◼ その後の設定はデフォルトのまま OK◼ しばらく待つと実行結果とともに「Finished C
Simulation」と表示される◼ Solution → Run C Synthesis → Active Solution◼ 1分程度待つと高位合成が完了し，
概要レポートが表示される

チェックサムSWEST/ACRi 共同企画

2021/9/3関数の実行に
384,003 サイクルかかる見積もり59

SWEST/ACRi 共同企画

2021/9/36010高位合成後の回路のチェック

高位合成後の回路のエクスポート◆ 関数が正しくハードウェア化されたか検証◆ 回路を Vivado で使える形式で出力◼ Solution → Run C/RTL Cosimulation◼ テストベンチ部分は C/C++ で，ハードウェア化した関数は論理シミュレーション◼ うまく行けば，実行結果とともに PASS と表示される◼ Solution → Export RTL◼ Format Selection が Vivado IP (.zip) であることを確認して，OK◼ プロジェクトのディレクトリの solution1/impl にexport.zip が作成されるチェックサムSWEST/ACRi 共同企画

2021/9/3

61

SWEST/ACRi 共同企画

2021/9/3

使用する回路の準備

リポジトリの追加◆ 適当な場所にフォルダを作成し，必要な回路のファイルを投入◆ Vivado のプロジェクトを作成したら……

62◼ Project Manager → Settings◼ IP → Repository◼ + を押して，先に作成したフォルダを追加◼ rgb2dvi: Digilent 社のビデオエンコーダ*◼ tmds_v1_0: TMDS インタフェースの定義*◼ sender: 先ほど作成したパターン送信回路

Digilent 社の GitHub リポジトリから DL
先の export.zip の中身をここに展開* https://github.com/Digilent/vivado-library/ からダウンロードできる．
SWEST/ACRi 共同企画

2021/9/3

63

SWEST/ACRi 共同企画

2021/9/364ブロック図の作成

ブロック図の作成: 相違点◆ ほぼ，以下の記事の「テストパターン表示
システムの構築」の節と同じ◆ PYNQ の場合，割込みの信号線の接続が必要◼ 割込みコントローラなどを追加し，接続する

https://www.acri.c.titech.ac.jp/wordpress/archives/8512

パターン送信回路

追加
追加

割込み出力
SWEST/ACRi 共同企画

2021/9/3

65

SWEST/ACRi 共同企画

2021/9/3

66

11

Python プログラム

動作確認の結果◆ 一定時間パターンの送信を定期的に行う◆ 外部モニタへと出力させた結果（動画）

フレーム番号（経過時刻 x 60）が増加するまで待つ
パターン送信回路を起動し，終了するのを待つ処理したフレーム数を出力
SWEST/ACRi 共同企画

2021/9/3

67

SWEST/ACRi 共同企画

2021/9/3

参考情報

まとめ

◆ PYNQ で高位合成により作成された回路を使用する別の例は，ACRi ブログの以下の記事で紹介している◆ PYNQ で FPGA システム開発をお手軽に始めてみよう68◼ ボードのセットアップ: ラズパイと同じ程度にはお手軽◼ HW オーバーレイ: 手順は多めだが慣れるとサクサク◼ 高位合成: C/C++ と Python で開発を始められる

https://www.acri.c.titech.ac.jp/wordpress/archives/12551◆ ソースコードは GitHub にて公開中
https://github.com/nfproc/connect_with_pynq/
画像出典: PYNQ: Python Productivity, http://www.pynq.io, retrieved 2021-07-08.
SWEST/ACRi 共同企画

2021/9/3

69

SWEST/ACRi 共同企画

2021/9/3

ACRi の各種サイト (1)ACRi の各種サイト (2)◆ ACRi ブログ◆ ACRi HLS Challenge (New!)◼ https://www.acri.c.titech.ac.jp/wordpress/◼ FPGA の使い方，応用などについて様々な記事が掲載されている（21年6月末時点で，34コース，175記事）◼ 「手を動かす系」の記事へのリンク集も70◼ （正式オープンしたら URL 更新する）◼ お題に沿ったハードウェアを高位合成で作成・提出◼ 高位合成によるハードウェア設計技術の習得に

https://gw.acri.c.titech.ac.jp/wp/manual/links-to-acriblog◆ ACRi ルーム◼ https://gw.acri.c.titech.ac.jp/wp/manual/welcome◼ FPGA 開発環境・ボードを遠隔利用可能◆ PYNQ-Z1 への対応も検討中（技術的課題多め）

SWEST/ACRi 共同企画

2021/9/3

71

SWEST/ACRi 共同企画

2021/9/3

72

12