SlideShare une entreprise Scribd logo
1  sur  41
Télécharger pour lire hors ligne
1 @ikwzmPYNQ 祭り(2017/3/4)
Python で FPGA プログラミング
PYNQ 祭り 2017 年 3 月 4 日
@ikwzm
2 @ikwzmPYNQ 祭り(2017/3/4)
自己紹介みたいなもの
・ハンドルネーム ikwzm
・現在隠居中
・52 才(けっこう年)
・主に論理回路設計(回路図~VHDL)
・たまにプログラム(アセンブラ~C/Ruby)
・Python 歴 1 ヶ月
3 @ikwzmPYNQ 祭り(2017/3/4)
Python で FPGA プログラミング?
4 @ikwzmPYNQ 祭り(2017/3/4)
PYNQ (Python Productivity for Zynq) とは
・ PYNQ = Python + Zynq
・ Zynq = PS(Processing System) + PL(Programmable Logic)
・ PL は HDL or Vivado-HLS で記述。
・ PL を PS で制御。 この制御を Python で記述。
・ Python で PL をプログラミングするわけじゃない
5 @ikwzmPYNQ 祭り(2017/3/4)
Python で FPGA プログラミング
本当に
する話
6 @ikwzmPYNQ 祭り(2017/3/4)
目次
・ Polyphony の紹介
・ Polyphony での記述例(fibonacci)とインターフェース
・ MessagePack-RPC Server on FPGA-SoC-Linux
・ Design Flow
・ PYNQ-Z1 での動作
・ 課題
7 @ikwzmPYNQ 祭り(2017/3/4)
Polyphony (本日の主役) の紹介(1)
・ Python ベースの高位合成コンパイラ
・ 作っているのは 有限会社シンビー
http://www.sinby.com/PolyPhony/index.html
・ github でも公開中
https://github.com/ktok07b6/polyphony
・ 高位合成友の会 第3回(2015/12/08) でのスライド
https://www.slideshare.net/ktok07b6/3-polyphony
8 @ikwzmPYNQ 祭り(2017/3/4)
Polyphony の紹介(2)
Polyphony はこんなツール(になる予定)
- 高位合成友の会 第3回(2015/12/08)のスライドより抜粋 -
・ 特徴
・ Python で書いたコードを Verilog-HDL に変換するための
コンパイラ
・ コードは Python インタープリタで動く普通の Python のコード
・ 特殊なクラスや言語拡張は基本的になし
・ ただし、 使える言語要素に制限有り
・ オープンソース
9 @ikwzmPYNQ 祭り(2017/3/4)
Polyphony の紹介(3)
Polyphony はこんなツール(になる予定)
- 高位合成友の会 第3回(2015/12/08)のスライドより抜粋 -
・ 得意なこと
・ 抽象度の高い処理記述
・ ソフトウェアのハードウェア化
・ 動くものを早く作る
・ 出来ないこと、 苦手なこと
・ クロック単位のタイミング制御
・ ハードウェアの制御
・ 性能の追求
10 @ikwzmPYNQ 祭り(2017/3/4)
良い悪い
Polyphony の紹介(4)
ハードウェア記述言語の生産性と性能
- 高位合成友の会 第3回(2015/12/08)のスライドより抜粋 -
生
産
性
高
低
性能
(速度,リソース...)
高位合成処理系
VHDL
Verilog-HDL
夢の
処理系
Polyphony
(目標)
・言語機能の充実
・コードの再利用
・最適化性能アップ
・バックエンドライブラリの充実
いまここ!
(2015/12 月時
11 @ikwzmPYNQ 祭り(2017/3/4)
Polyphony での記述例 - fib.py -
from polyphony import testbench
def fib(n):
if n <= 0: return 0
if n == 1: return 1
r0 = 0
r1 = 1
for i in range(n-1):
prev_r1 = r1
r1 = r0 + r1
r0 = prev_r1
return r1
@testbench
def test():
expect = [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610]
for i in range(len(expect)):
result = fib(i)
assert expect[i] == result
print(i, "=>", result)
test()
shell$ python3 fib.py
0 => 0
1 => 1
2 => 1
3 => 2
4 => 3
5 => 5
6 => 8
7 => 13
8 => 21
9 => 34
10 => 55
11 => 89
12 => 144
13 => 233
14 => 377
15 => 610
shell$
fib.py
12 @ikwzmPYNQ 祭り(2017/3/4)
polyphony_out_
test.v
polyphony_out.v
Polyphony で fib.py を高位合成
shell$ polyphony fib.py
shell$ 一見何も起きないようだが
shell$ ls -1
fib.py
polyphony_out.v
polyphony_out_fib.v
polyphony_out_test.v
shell$
なんかファイルが出来てる
python3
polyphony
polyphony_out_
fib.v
高位合成した回路
fib.py
シミュレーション用の
テストベンチ
Vivado
Behv Sim
13 @ikwzmPYNQ 祭り(2017/3/4)
Vivado で Behavioral Simulation
14 @ikwzmPYNQ 祭り(2017/3/4)
polyphony_out_fib.v の Interface(1)
module fib
(
input wire clk,
input wire rst,
input wire fib_ready,
input wire fib_accept,
output reg fib_valid,
input wire signed [31:0] fib_in_n,
output reg signed [31:0] fib_out_0
);
//localparams
localparam fib_b1_INIT = 0;
localparam fib_b1_S1 = 1;
localparam fib_ifthen3_S0 = 2;
localparam fib_ifelse4_S1 = 3;
localparam fib_ifthen6_S0 = 4;
localparam fib_ifelse7_S0 = 5;
:
(中略)
:
endmodule
polyphony_out_fib.v
clk
rst
fib_ready
fib_in_n
fib_valid
fib_out_0
fib_accept
fib
15 @ikwzmPYNQ 祭り(2017/3/4)
polyphony_out_fib.v の Interface(2)
clk
rst
fib_ready
fib_in_n
fib_valid
fib_out_0
fib_accept
n
return
fib
16 @ikwzmPYNQ 祭り(2017/3/4)
fib を PS(Processing System)から使うには?
clk
rst
fib_ready
fib_in_n
fib_valid
fib_out_0
fib_accept
def test():
for i in range(8):
result = fib(i)
print(i, "=>", result)
test()
fib_test.py
shell$ python3 fib_test.py
0 => 0
1 => 1
2 => 1
3 => 2
4 => 3
5 => 5
6 => 8
7 => 13
shell$
?
fib
17 @ikwzmPYNQ 祭り(2017/3/4)
MessagePack-RPC (Remote Procedure Call)
import msgpackrpc
cli = msgpackrpc.Client(
msgpackrpc.Address(
'localhost',18800))
def fib(n):
return cli.call('fib', n)
def test():
for i in range(5):
result = fib(i)
print(i, "=>", result)
test()
fib_client.py fib_server.py
import msgpackrpc
class FibServer(object):
def fib(self, n):
if n <= 0: return 0
if n == 1: return 1
r0 = 0
r1 = 1
for i in range(n-1):
prev_r1 = r1
r1 = r0 + r1
r0 = prev_r1
return r1
svr=msgpackrpc.Server(FibServer())
svr.listen(msgpackrpc.Address(
'localhost',18800))
svr.start()shell$ python3 fib_client.py
0 => 0
1 => 1
2 => 1
3 => 2
4 => 3
shell$
shell$ python3 fib_server.py &
shell$
94 00 05 A366 69 62 91 03
[ 0, 5, "fib", [ 3 ] ]
94 01 05 C0 02
[ 1, 5, nil, 2 ]
Request Message
Response Message
18 @ikwzmPYNQ 祭り(2017/3/4)
MessagePack-RPC Server on FPGA-SoC-Linux(1)
PTTY_AXI
Fib_Interface fib
Fib_Server
fib_ready
fib_in_n
fib_valid
fib_out_0
fib_accept
ZPTTY.ko
socat fib_client.py
FPGA
Manager
Clk/Reset
/dev
/fpga0
/dev
/fpgaclk0
/dev/zptty0 network
interface
from polyphony import testbench
def fib(n):
if n <= 0: return 0
if n == 1: return 1
r0 = 0
r1 = 1
for i in range(n-1):
prev_r1 = r1
r1 = r0 + r1
r0 = prev_r1
return r1
fib.py
polyphony_out_
fib.v
polyphony
Device
Tree
Overlay
/config
/device-
tree
PS(Processing System)
PL(Programmable Logic)
19 @ikwzmPYNQ 祭り(2017/3/4)
MessagePack-RPC Server on FPGA-SoC-Linux(2)
import msgpackrpc
cli = msgpackrpc.Client(
msgpackrpc.Address(
'localhost',54321))
def fib(n):
return cli.call('fib', n)
def test():
for i in range(5):
result = fib(i)
print(i, "=>", result)
test()
fib_client.py
PTTY_AXI
Fib_Interface fib
Fib_Server
fib_ready
fib_in_n
fib_valid
fib_out_0
fib_accept
ZPTTY.ko
socat fib_client.py
FPGA
Manager
Clk/Reset
/dev
/fpga0
/dev
/fpgaclk0
/dev/zptty0 network
interface
Device
Tree
Overlay
/config
/device-
tree
PS(Processing System)
PL(Programmable Logic)
20 @ikwzmPYNQ 祭り(2017/3/4)
MessagePack-RPC Server on FPGA-SoC-Linux(3)
PTTY_AXI
Fib_Interface fib
Fib_Server
fib_ready
fib_in_n
fib_valid
fib_out_0
fib_accept
ZPTTY.ko
socat fib_client.py
FPGA
Manager
Clk/Reset
/dev
/fpga0
/dev
/fpgaclk0
/dev/zptty0 network
interface
Device
Tree
Overlay
/config
/device-
tree
PS(Processing System)
PL(Programmable Logic)
94 00 05 A3 66 69 62 91 03
[ 0, 5, "fib", [ 3 ] ]
Request Message を生成
3
2
Fib_Interface が Request
Message を unpack して fib
のインターフェース信号に変換
21 @ikwzmPYNQ 祭り(2017/3/4)
MessagePack-RPC Server on FPGA-SoC-Linux(4)
PTTY_AXI
Fib_Interface fib
Fib_Server
fib_ready
fib_in_n
fib_valid
fib_out_0
fib_accept
ZPTTY.ko
socat fib_client.py
FPGA
Manager
Clk/Reset
/dev
/fpga0
/dev
/fpgaclk0
/dev/zptty0 network
interface
Device
Tree
Overlay
/config
/device-
tree
PS(Processing System)
PL(Programmable Logic)
94 01 05 C0 02
[ 1, 5, nil, 2 ]
Response Message
Fib_Interface が fib からのリタ
ーン値を Response Message
に pack
3
2
22 @ikwzmPYNQ 祭り(2017/3/4)
polyphony_out_
test.v
polyphony_out.v
Design Flow
python3
polyphony
polyphony_out_
fib.v
fib.py
Vivado
Behv Sim
Fib_Interface.vhd
Fib_Server.vhd
msgpack-
if-gen.rb
fib.yml
Fib_Server.zip
(IP for Vivado)
Vivado IP Integrator
Synthesis Implementation
design_1_
wrapper.bit
design_1_bd
.tcl
MsgPack.vhd
Vivado IP Packager
vhdl-
archiver.rb
23 @ikwzmPYNQ 祭り(2017/3/4)
polyphony_out_
test.v
polyphony_out.v
msgpack-if-gen
python3
polyphony
polyphony_out_
fib.v
fib.py
Vivado
Behv Sim
Fib_Interface.vhd
Fib_Server.vhd
msgpack-
if-gen.rb
fib.yml
Fib_Server.zip
(IP for Vivado)
Vivado IP Integrator
Synthesis Implementation
design_1_
wrapper.bit
design_1_bd
.tcl
MsgPack.vhd
Vivado IP Packager
fib.yml
---
name: fib
generate :
interface: {name: Fib_Interface, file: Fib_Interface.vhd}
server: {name: Fib_Server , file: Fib_Server.vhd }
port: {clock: clk, reset: rst, clear: }
methods:
- name: fib
interface: {type: polyphony}
arguments:
- name: n
type: Integer
interface: {name: Signal , type: {name: Signed, width: 32}, port: {data: fib_in_n}}
returns:
- name: o
type: Integer
interface: {name: Signal , type: {name: Signed, width: 32}, port: {data: fib_out_0}}
---
vhdl-
archiver.rb
24 @ikwzmPYNQ 祭り(2017/3/4)
polyphony_out_
test.v
polyphony_out.v
Vivado IP Packager (1)
python3
polyphony
polyphony_out_
fib.v
fib.py
Vivado
Behv Sim
Fib_Interface.vhd
Fib_Server.vhd
msgpack-
if-gen.rb
fib.yml
Fib_Server.zip
(IP for Vivado)
design_1_
wrapper.bit
design_1_bd
.tcl
MsgPack.vhd
Vivado IP Packager
Vivado IP Integrator
Synthesis Implementation
vhdl-
archiver.rb
25 @ikwzmPYNQ 祭り(2017/3/4)
Vivado IP Packager (2)
26 @ikwzmPYNQ 祭り(2017/3/4)
polyphony_out_
test.v
polyphony_out.v
Vivado IP Integrator (1)
python3
polyphony
polyphony_out_
fib.v
fib.py
Vivado
Behv Sim
Fib_Interface.vhd
Fib_Server.vhd
msgpack-
if-gen.rb
fib.yml
Fib_Server.zip
(IP for Vivado)
design_1_
wrapper.bit
design_1_bd
.tcl
MsgPack.vhd
Vivado IP Packager
Vivado IP Integrator
Synthesis Implementation
vhdl-
archiver.rb
27 @ikwzmPYNQ 祭り(2017/3/4)
Vivado IP Integrator (2)
28 @ikwzmPYNQ 祭り(2017/3/4)
polyphony_out_
test.v
polyphony_out.v
Vivado Synthesis & Implementation (1)
python3
polyphony
polyphony_out_
fib.v
fib.py
Vivado
Behv Sim
Fib_Interface.vhd
Fib_Server.vhd
msgpack-
if-gen.rb
fib.yml
Fib_Server.zip
(IP for Vivado)
design_1_
wrapper.bit
design_1_bd
.tcl
MsgPack.vhd
Vivado IP Packager
Vivado IP Integrator
Synthesis Implementation
vhdl-
archiver.rb
29 @ikwzmPYNQ 祭り(2017/3/4)
Vivado Synthesis & Implementation (2)
30 @ikwzmPYNQ 祭り(2017/3/4)
Load and start fib server on PL(Programmable Logic)
shell# echo 1 >/sys/class/fpgacfg/fpgacfg0/data_format
shell# echo 1 >/sys/class/fpgacfg/fpgacfg0/load_start
shell# dd if=design_1_wrapper.bit of=/dev/fpgacfg0 bs=1M
3+1 records in
3+1 records out
4045676 bytes (4.0 MB) copied, 0.296939 s, 13.6 MB/s
1. Download "design_1_wrapper.bit" to PL
2. Load "zptty" device driver and overlay device-tree
shell# modprobe zptty
shell# dtbocfg.rb --install zptty0 --dts zptty0-zynq-zybo.dts
3. Start socat (background)
shell# socat -d -d tcp-listen:54321,fork /dev/zptty0,raw,nonblock,echo=0 &
[2] 2145
2017/03/01 09:34:13 socat[2145] N listening on AF=2 0.0.0.0:54321
FPGA-SoC-Linux(https://github.com/ikwzm/FPGA-SoC-Linux)の場合
31 @ikwzmPYNQ 祭り(2017/3/4)
32 @ikwzmPYNQ 祭り(2017/3/4)
課題
1. Design Flow が複雑
・ すぐに切れそうな Tool Chain
・ msgpack-if-gen.rb 用の設定ファイル(fib.yml)が必要
2. MessagePack-RPC のオーバーヘッド
・ レイテンシーの増大
・ スループットの悪化
3. Polyphony の言語的な制約
33 @ikwzmPYNQ 祭り(2017/3/4)
polyphony_out_
test.v
polyphony_out.v
課題 1.1 Design Flow が複雑 - すぐに切れそうな Tool Chain
python3
polyphony
polyphony_out_
fib.v
fib.py
Vivado
Behv Sim
Fib_Interface.vhd
Fib_Server.vhd
msgpack-
if-gen.rb
fib.yml
Fib_Server.zip
(IP for Vivado)
Vivado IP Integrator
Synthesis Implementation
design_1_
wrapper.bit
design_1_bd
.tcl
MsgPack.vhd
Vivado IP Packager
複数のツールの組み合わせで
各ツールが独自の進化
1. python
2. polyphony
3. msgpack-vhdl
4. Vivado
vhdl-
archiver.rb
34 @ikwzmPYNQ 祭り(2017/3/4)
polyphony_out_
test.v
polyphony_out.v
課題 1.2 Design Flow が複雑 - msgpack-if-gen.rb 用設定ファイル必要
python3
polyphonyfib.py
Vivado
Behv Sim
Fib_Interface.vhd
Fib_Server.vhd
msgpack-
if-gen.rb
fib.yml
Fib_Server.zip
(IP for Vivado)
Vivado IP Integrator
Synthesis Implementation
design_1_
wrapper.bit
design_1_bd
.tcl
MsgPack.vhd
Vivado IP Packager
現状
polyphony_out_
fib.v
今後の
予定
vhdl-
archiver.rb
35 @ikwzmPYNQ 祭り(2017/3/4)
課題 2. MessagePack-RPC のオーバーヘッド
PTTY_AXI
Fib_Interface fib
Fib_Server
fib_ready
fib_in_n
fib_valid
fib_out_0
fib_accept
ZPTTY.ko
socat fib_client.py
FPGA
Manager
Clk/Reset
/dev
/fpga0
/dev
/fpgaclk0
/dev/zptty0 network
interface
Device
Tree
Overlay
/config
/device-
tree
PS(Processing System)
PL(Programmable Logic)
やたら長いパス
レイテンシーの増大
(片道 数十 msec~数百 msec)
低速な TTY I/F
スループットの悪化
(数十 MByte/sec)
36 @ikwzmPYNQ 祭り(2017/3/4)
課題 3. Polyphony の言語的な制約
・ もともと論理回路は動的型付けが苦手(というかムチャブリです)
ところが Python は動的型付け言語
Polyphony では変数の型を限定することで対応
使えるのは 32bit 整数、 True、 False だけ(2015/12 時点)
・ 最近は List (1次元かつ中身は整数のみ)やタプルも追加
・ さらにクラスも使えるようになった(次頁参照)
・ Polyphony は現在絶賛開発中
今後いろいろと出来る様になるかも
(多倍長整数、 浮動小数点、 文字列、 辞書、 多次元配列...)
37 @ikwzmPYNQ 祭り(2017/3/4)
Polyphony の進化 - mmult.py -
from polyphony import testbench
class StreamIn:
def __init__(self, buf, size):
self.size = size
self.buf = buf
def read(self, addr):
return self.buf[addr]
class StreamOut:
def __init__(self, buf, size):
self.size = size
self.buf = buf
def write(self, addr, data):
self.buf[addr] = data
def mmult(a_buf:list, b_buf:list, o_buf:list, size):
a = StreamIn(a_buf, size)
b = StreamIn(b_buf, size)
o = StreamOut(o_buf, size)
for i in range(size):
o.write(i, a.read(i) * b.read(i))
@testbench
def test():
a = [0,1,2,3,4,5,6,7]
b = [0,1,2,3,4,5,6,7]
o = [0,0,0,0,0,0,0,0]
size = 8
mmult(a, b, o, size)
for i in range(size):
print(i, ":", a[i], "*", b[i], "=>", o[i])
assert o[i] == a[i]*b[i]
test()
shell$ python3 mmult.py
0 : 0 * 0 => 0
1 : 1 * 1 => 1
2 : 2 * 2 => 4
3 : 3 * 3 => 9
4 : 4 * 4 => 16
5 : 5 * 5 => 25
6 : 6 * 6 => 36
7 : 7 * 7 => 49
shell$
mmult.py
・ 2017 年 2 月現在
・ List と Class が使える。
・ テストベンチ(polyphony_out_
test.v)は上手く動かなかった。
・ List へのアクセスはウェイトが固定な
ので BlockRAM 限定。 AXI マスタ
ー等は使えない。
・ MessagePack-RPC は未対応。
38 @ikwzmPYNQ 祭り(2017/3/4)
参考 - PYNQ-Festival
・ 以下の資料やバイナリイメージ
・ 本日説明したスライド
・ u-boot
・ Linux Kernel 4.8.17 (FPGA manager+Device Tree Overlay)
・ Debian 8 Root File System
・ design_1_wrapper.bit (PYNQ-Z1 用 bitstream)
・ fibonacci_client.ipynb
 はこちらにあります。
https://github.com/ikwzm/PYNQ-Festival
39 @ikwzmPYNQ 祭り(2017/3/4)
参考 - Polyphony
・ Python ベースの高位合成コンパイラ
・ 作っているのは 有限会社シンビー
http://www.sinby.com/PolyPhony/index.html
・ github でも公開中
https://github.com/ktok07b6/polyphony
・ 高位合成友の会 第3回(2015/12/08) でのスライド
https://www.slideshare.net/ktok07b6/3-polyphony
40 @ikwzmPYNQ 祭り(2017/3/4)
参考 - MessagePack-VHDL
・ MessagePack-RPC を使って FPGA を制御 @Qiita
http://qiita.com/ikwzm/items/2644c6e50a7049c75d49
・ github で公開中
https://github.com/ikwzm/msgpack-vhdl
https://github.com/ikwzm/msgpack-vhdl-examples
41 @ikwzmPYNQ 祭り(2017/3/4)
参考 - FPGA-SoC-Linux
・ FPGA+SoC+Linux+Device Tree Overlay+FPGA
Manager(PYNQ-Z1 対応) @Qiita
http://qiita.com/ikwzm/items/d6fdaa859906252fd8b0
・ github で公開中
https://github.com/ikwzm/FPGA-SoC-Linux

Contenu connexe

Tendances

FPGAX6_hayashi
FPGAX6_hayashiFPGAX6_hayashi
FPGAX6_hayashi愛美 林
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応marsee101
 
15.06.27 実録 ソフトウェア開発者が FPGAを独習した最初の3歩@RTLを語る会(9)
15.06.27 実録 ソフトウェア開発者が FPGAを独習した最初の3歩@RTLを語る会(9)15.06.27 実録 ソフトウェア開発者が FPGAを独習した最初の3歩@RTLを語る会(9)
15.06.27 実録 ソフトウェア開発者が FPGAを独習した最初の3歩@RTLを語る会(9)Kei Nakazawa
 
増え続ける情報に対応するためのFPGA基礎知識
増え続ける情報に対応するためのFPGA基礎知識増え続ける情報に対応するためのFPGA基礎知識
増え続ける情報に対応するためのFPGA基礎知識なおき きしだ
 
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームVivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームmarsee101
 
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6Kentaro Ebisawa
 
Analog Devices の IP コアを使う
Analog Devices の IP コアを使うAnalog Devices の IP コアを使う
Analog Devices の IP コアを使うryos36
 
ソフトウェア技術者はFPGAをどのように使うか
ソフトウェア技術者はFPGAをどのように使うかソフトウェア技術者はFPGAをどのように使うか
ソフトウェア技術者はFPGAをどのように使うかなおき きしだ
 
2017年のFPGA Community活動について
2017年のFPGA Community活動について2017年のFPGA Community活動について
2017年のFPGA Community活動についてMr. Vengineer
 
ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)
ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)
ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)marsee101
 
FPGAによるHDMI to LVDS変換器
FPGAによるHDMI to LVDS変換器FPGAによるHDMI to LVDS変換器
FPGAによるHDMI to LVDS変換器I_HaL
 
コンピュータアーキテクチャ研究の最新動向〜ISCA2015参加報告〜 @FPGAエクストリーム・コンピューティング 第7回 (#fpgax #7)
コンピュータアーキテクチャ研究の最新動向〜ISCA2015参加報告〜 @FPGAエクストリーム・コンピューティング 第7回 (#fpgax #7)コンピュータアーキテクチャ研究の最新動向〜ISCA2015参加報告〜 @FPGAエクストリーム・コンピューティング 第7回 (#fpgax #7)
コンピュータアーキテクチャ研究の最新動向〜ISCA2015参加報告〜 @FPGAエクストリーム・コンピューティング 第7回 (#fpgax #7)Shinya Takamaeda-Y
 
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発Shinya Takamaeda-Y
 
FPGA startup 第一回 LT
FPGA startup 第一回 LTFPGA startup 第一回 LT
FPGA startup 第一回 LTYamato Kazuhiro
 

Tendances (20)

FPGAX6_hayashi
FPGAX6_hayashiFPGAX6_hayashi
FPGAX6_hayashi
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
 
20140310 fpgax
20140310 fpgax20140310 fpgax
20140310 fpgax
 
15.06.27 実録 ソフトウェア開発者が FPGAを独習した最初の3歩@RTLを語る会(9)
15.06.27 実録 ソフトウェア開発者が FPGAを独習した最初の3歩@RTLを語る会(9)15.06.27 実録 ソフトウェア開発者が FPGAを独習した最初の3歩@RTLを語る会(9)
15.06.27 実録 ソフトウェア開発者が FPGAを独習した最初の3歩@RTLを語る会(9)
 
増え続ける情報に対応するためのFPGA基礎知識
増え続ける情報に対応するためのFPGA基礎知識増え続ける情報に対応するためのFPGA基礎知識
増え続ける情報に対応するためのFPGA基礎知識
 
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームVivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリーム
 
FPGAって、何?
FPGAって、何?FPGAって、何?
FPGAって、何?
 
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
 
Analog Devices の IP コアを使う
Analog Devices の IP コアを使うAnalog Devices の IP コアを使う
Analog Devices の IP コアを使う
 
ソフトウェア技術者はFPGAをどのように使うか
ソフトウェア技術者はFPGAをどのように使うかソフトウェア技術者はFPGAをどのように使うか
ソフトウェア技術者はFPGAをどのように使うか
 
2017年のFPGA Community活動について
2017年のFPGA Community活動について2017年のFPGA Community活動について
2017年のFPGA Community活動について
 
ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)
ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)
ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)
 
Linux : PSCI
Linux : PSCILinux : PSCI
Linux : PSCI
 
PYNQ祭り
PYNQ祭りPYNQ祭り
PYNQ祭り
 
FPGAによるHDMI to LVDS変換器
FPGAによるHDMI to LVDS変換器FPGAによるHDMI to LVDS変換器
FPGAによるHDMI to LVDS変換器
 
Zynq+PyCoRAM(+Debian)入門
Zynq+PyCoRAM(+Debian)入門Zynq+PyCoRAM(+Debian)入門
Zynq+PyCoRAM(+Debian)入門
 
コンピュータアーキテクチャ研究の最新動向〜ISCA2015参加報告〜 @FPGAエクストリーム・コンピューティング 第7回 (#fpgax #7)
コンピュータアーキテクチャ研究の最新動向〜ISCA2015参加報告〜 @FPGAエクストリーム・コンピューティング 第7回 (#fpgax #7)コンピュータアーキテクチャ研究の最新動向〜ISCA2015参加報告〜 @FPGAエクストリーム・コンピューティング 第7回 (#fpgax #7)
コンピュータアーキテクチャ研究の最新動向〜ISCA2015参加報告〜 @FPGAエクストリーム・コンピューティング 第7回 (#fpgax #7)
 
Gpu vs fpga
Gpu vs fpgaGpu vs fpga
Gpu vs fpga
 
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
 
FPGA startup 第一回 LT
FPGA startup 第一回 LTFPGA startup 第一回 LT
FPGA startup 第一回 LT
 

En vedette

APACHE TOREE: A JUPYTER KERNEL FOR SPARK by Marius van Niekerk
APACHE TOREE: A JUPYTER KERNEL FOR SPARK by Marius van NiekerkAPACHE TOREE: A JUPYTER KERNEL FOR SPARK by Marius van Niekerk
APACHE TOREE: A JUPYTER KERNEL FOR SPARK by Marius van NiekerkSpark Summit
 
[db analytics showcase Sapporo 2017] A15: Pythonでの分散処理再入門 by 株式会社HPCソリューションズ ...
[db analytics showcase Sapporo 2017] A15: Pythonでの分散処理再入門 by 株式会社HPCソリューションズ ...[db analytics showcase Sapporo 2017] A15: Pythonでの分散処理再入門 by 株式会社HPCソリューションズ ...
[db analytics showcase Sapporo 2017] A15: Pythonでの分散処理再入門 by 株式会社HPCソリューションズ ...Insight Technology, Inc.
 
PYNQ単体でUIを表示してみる(PYNQまつり)
PYNQ単体でUIを表示してみる(PYNQまつり)PYNQ単体でUIを表示してみる(PYNQまつり)
PYNQ単体でUIを表示してみる(PYNQまつり)Kenta IDA
 
Presto in my_use_case
Presto in my_use_casePresto in my_use_case
Presto in my_use_casewyukawa
 
PYNQで○○してみた!
PYNQで○○してみた!PYNQで○○してみた!
PYNQで○○してみた!aster_ism
 
20171012 found IT #9 PySparkの勘所
20171012 found  IT #9 PySparkの勘所20171012 found  IT #9 PySparkの勘所
20171012 found IT #9 PySparkの勘所Ryuji Tamagawa
 
20170927 pydata tokyo データサイエンスな皆様に送る分散処理の基礎の基礎、そしてPySparkの勘所
20170927 pydata tokyo データサイエンスな皆様に送る分散処理の基礎の基礎、そしてPySparkの勘所20170927 pydata tokyo データサイエンスな皆様に送る分散処理の基礎の基礎、そしてPySparkの勘所
20170927 pydata tokyo データサイエンスな皆様に送る分散処理の基礎の基礎、そしてPySparkの勘所Ryuji Tamagawa
 
20170210 sapporotechbar7
20170210 sapporotechbar720170210 sapporotechbar7
20170210 sapporotechbar7Ryuji Tamagawa
 
コンピュータエンジニアへのFPGAのすすめ
コンピュータエンジニアへのFPGAのすすめコンピュータエンジニアへのFPGAのすすめ
コンピュータエンジニアへのFPGAのすすめTakeshi HASEGAWA
 

En vedette (9)

APACHE TOREE: A JUPYTER KERNEL FOR SPARK by Marius van Niekerk
APACHE TOREE: A JUPYTER KERNEL FOR SPARK by Marius van NiekerkAPACHE TOREE: A JUPYTER KERNEL FOR SPARK by Marius van Niekerk
APACHE TOREE: A JUPYTER KERNEL FOR SPARK by Marius van Niekerk
 
[db analytics showcase Sapporo 2017] A15: Pythonでの分散処理再入門 by 株式会社HPCソリューションズ ...
[db analytics showcase Sapporo 2017] A15: Pythonでの分散処理再入門 by 株式会社HPCソリューションズ ...[db analytics showcase Sapporo 2017] A15: Pythonでの分散処理再入門 by 株式会社HPCソリューションズ ...
[db analytics showcase Sapporo 2017] A15: Pythonでの分散処理再入門 by 株式会社HPCソリューションズ ...
 
PYNQ単体でUIを表示してみる(PYNQまつり)
PYNQ単体でUIを表示してみる(PYNQまつり)PYNQ単体でUIを表示してみる(PYNQまつり)
PYNQ単体でUIを表示してみる(PYNQまつり)
 
Presto in my_use_case
Presto in my_use_casePresto in my_use_case
Presto in my_use_case
 
PYNQで○○してみた!
PYNQで○○してみた!PYNQで○○してみた!
PYNQで○○してみた!
 
20171012 found IT #9 PySparkの勘所
20171012 found  IT #9 PySparkの勘所20171012 found  IT #9 PySparkの勘所
20171012 found IT #9 PySparkの勘所
 
20170927 pydata tokyo データサイエンスな皆様に送る分散処理の基礎の基礎、そしてPySparkの勘所
20170927 pydata tokyo データサイエンスな皆様に送る分散処理の基礎の基礎、そしてPySparkの勘所20170927 pydata tokyo データサイエンスな皆様に送る分散処理の基礎の基礎、そしてPySparkの勘所
20170927 pydata tokyo データサイエンスな皆様に送る分散処理の基礎の基礎、そしてPySparkの勘所
 
20170210 sapporotechbar7
20170210 sapporotechbar720170210 sapporotechbar7
20170210 sapporotechbar7
 
コンピュータエンジニアへのFPGAのすすめ
コンピュータエンジニアへのFPGAのすすめコンピュータエンジニアへのFPGAのすすめ
コンピュータエンジニアへのFPGAのすすめ
 

Similaire à Pynq祭り資料

Androidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうAndroidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうksk sue
 
「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of PythonTakanori Suzuki
 
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12Takanori Suzuki
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
Polyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGAPolyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGAryos36
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料一路 川染
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。Kazuki Onishi
 
PyCoRAM: Python-Verilog高位合成とメモリ抽象化によるFPGAアクセラレータ向けIPコア開発フレームワーク (FPGAX #05)
PyCoRAM: Python-Verilog高位合成とメモリ抽象化によるFPGAアクセラレータ向けIPコア開発フレームワーク (FPGAX #05)PyCoRAM: Python-Verilog高位合成とメモリ抽象化によるFPGAアクセラレータ向けIPコア開発フレームワーク (FPGAX #05)
PyCoRAM: Python-Verilog高位合成とメモリ抽象化によるFPGAアクセラレータ向けIPコア開発フレームワーク (FPGAX #05)Shinya Takamaeda-Y
 
C83 λカ娘の販促にやってきました
C83 λカ娘の販促にやってきましたC83 λカ娘の販促にやってきました
C83 λカ娘の販促にやってきましたKiwamu Okabe
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cythonfuzzysphere
 
Rubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりRubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりYuya Rin
 
MicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみるMicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみるKenta IDA
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23Masashi Shibata
 
Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Kazuo Asano (@kazuo_asa)
 

Similaire à Pynq祭り資料 (20)

Androidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうAndroidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃう
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python
 
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
Polyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGAPolyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGA
 
210728 mpy
210728 mpy210728 mpy
210728 mpy
 
IKEv2-VPN PyHackCon2023
IKEv2-VPN PyHackCon2023IKEv2-VPN PyHackCon2023
IKEv2-VPN PyHackCon2023
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料
 
Inside winnyp
Inside winnypInside winnyp
Inside winnyp
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
Pdp11 on-fpga
Pdp11 on-fpgaPdp11 on-fpga
Pdp11 on-fpga
 
PyCoRAM: Python-Verilog高位合成とメモリ抽象化によるFPGAアクセラレータ向けIPコア開発フレームワーク (FPGAX #05)
PyCoRAM: Python-Verilog高位合成とメモリ抽象化によるFPGAアクセラレータ向けIPコア開発フレームワーク (FPGAX #05)PyCoRAM: Python-Verilog高位合成とメモリ抽象化によるFPGAアクセラレータ向けIPコア開発フレームワーク (FPGAX #05)
PyCoRAM: Python-Verilog高位合成とメモリ抽象化によるFPGAアクセラレータ向けIPコア開発フレームワーク (FPGAX #05)
 
C83 λカ娘の販促にやってきました
C83 λカ娘の販促にやってきましたC83 λカ娘の販促にやってきました
C83 λカ娘の販促にやってきました
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
Rubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりRubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつり
 
MicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみるMicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみる
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
 
Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6
 

Pynq祭り資料

  • 1. 1 @ikwzmPYNQ 祭り(2017/3/4) Python で FPGA プログラミング PYNQ 祭り 2017 年 3 月 4 日 @ikwzm
  • 2. 2 @ikwzmPYNQ 祭り(2017/3/4) 自己紹介みたいなもの ・ハンドルネーム ikwzm ・現在隠居中 ・52 才(けっこう年) ・主に論理回路設計(回路図~VHDL) ・たまにプログラム(アセンブラ~C/Ruby) ・Python 歴 1 ヶ月
  • 3. 3 @ikwzmPYNQ 祭り(2017/3/4) Python で FPGA プログラミング?
  • 4. 4 @ikwzmPYNQ 祭り(2017/3/4) PYNQ (Python Productivity for Zynq) とは ・ PYNQ = Python + Zynq ・ Zynq = PS(Processing System) + PL(Programmable Logic) ・ PL は HDL or Vivado-HLS で記述。 ・ PL を PS で制御。 この制御を Python で記述。 ・ Python で PL をプログラミングするわけじゃない
  • 5. 5 @ikwzmPYNQ 祭り(2017/3/4) Python で FPGA プログラミング 本当に する話
  • 6. 6 @ikwzmPYNQ 祭り(2017/3/4) 目次 ・ Polyphony の紹介 ・ Polyphony での記述例(fibonacci)とインターフェース ・ MessagePack-RPC Server on FPGA-SoC-Linux ・ Design Flow ・ PYNQ-Z1 での動作 ・ 課題
  • 7. 7 @ikwzmPYNQ 祭り(2017/3/4) Polyphony (本日の主役) の紹介(1) ・ Python ベースの高位合成コンパイラ ・ 作っているのは 有限会社シンビー http://www.sinby.com/PolyPhony/index.html ・ github でも公開中 https://github.com/ktok07b6/polyphony ・ 高位合成友の会 第3回(2015/12/08) でのスライド https://www.slideshare.net/ktok07b6/3-polyphony
  • 8. 8 @ikwzmPYNQ 祭り(2017/3/4) Polyphony の紹介(2) Polyphony はこんなツール(になる予定) - 高位合成友の会 第3回(2015/12/08)のスライドより抜粋 - ・ 特徴 ・ Python で書いたコードを Verilog-HDL に変換するための コンパイラ ・ コードは Python インタープリタで動く普通の Python のコード ・ 特殊なクラスや言語拡張は基本的になし ・ ただし、 使える言語要素に制限有り ・ オープンソース
  • 9. 9 @ikwzmPYNQ 祭り(2017/3/4) Polyphony の紹介(3) Polyphony はこんなツール(になる予定) - 高位合成友の会 第3回(2015/12/08)のスライドより抜粋 - ・ 得意なこと ・ 抽象度の高い処理記述 ・ ソフトウェアのハードウェア化 ・ 動くものを早く作る ・ 出来ないこと、 苦手なこと ・ クロック単位のタイミング制御 ・ ハードウェアの制御 ・ 性能の追求
  • 10. 10 @ikwzmPYNQ 祭り(2017/3/4) 良い悪い Polyphony の紹介(4) ハードウェア記述言語の生産性と性能 - 高位合成友の会 第3回(2015/12/08)のスライドより抜粋 - 生 産 性 高 低 性能 (速度,リソース...) 高位合成処理系 VHDL Verilog-HDL 夢の 処理系 Polyphony (目標) ・言語機能の充実 ・コードの再利用 ・最適化性能アップ ・バックエンドライブラリの充実 いまここ! (2015/12 月時
  • 11. 11 @ikwzmPYNQ 祭り(2017/3/4) Polyphony での記述例 - fib.py - from polyphony import testbench def fib(n): if n <= 0: return 0 if n == 1: return 1 r0 = 0 r1 = 1 for i in range(n-1): prev_r1 = r1 r1 = r0 + r1 r0 = prev_r1 return r1 @testbench def test(): expect = [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610] for i in range(len(expect)): result = fib(i) assert expect[i] == result print(i, "=>", result) test() shell$ python3 fib.py 0 => 0 1 => 1 2 => 1 3 => 2 4 => 3 5 => 5 6 => 8 7 => 13 8 => 21 9 => 34 10 => 55 11 => 89 12 => 144 13 => 233 14 => 377 15 => 610 shell$ fib.py
  • 12. 12 @ikwzmPYNQ 祭り(2017/3/4) polyphony_out_ test.v polyphony_out.v Polyphony で fib.py を高位合成 shell$ polyphony fib.py shell$ 一見何も起きないようだが shell$ ls -1 fib.py polyphony_out.v polyphony_out_fib.v polyphony_out_test.v shell$ なんかファイルが出来てる python3 polyphony polyphony_out_ fib.v 高位合成した回路 fib.py シミュレーション用の テストベンチ Vivado Behv Sim
  • 13. 13 @ikwzmPYNQ 祭り(2017/3/4) Vivado で Behavioral Simulation
  • 14. 14 @ikwzmPYNQ 祭り(2017/3/4) polyphony_out_fib.v の Interface(1) module fib ( input wire clk, input wire rst, input wire fib_ready, input wire fib_accept, output reg fib_valid, input wire signed [31:0] fib_in_n, output reg signed [31:0] fib_out_0 ); //localparams localparam fib_b1_INIT = 0; localparam fib_b1_S1 = 1; localparam fib_ifthen3_S0 = 2; localparam fib_ifelse4_S1 = 3; localparam fib_ifthen6_S0 = 4; localparam fib_ifelse7_S0 = 5; : (中略) : endmodule polyphony_out_fib.v clk rst fib_ready fib_in_n fib_valid fib_out_0 fib_accept fib
  • 15. 15 @ikwzmPYNQ 祭り(2017/3/4) polyphony_out_fib.v の Interface(2) clk rst fib_ready fib_in_n fib_valid fib_out_0 fib_accept n return fib
  • 16. 16 @ikwzmPYNQ 祭り(2017/3/4) fib を PS(Processing System)から使うには? clk rst fib_ready fib_in_n fib_valid fib_out_0 fib_accept def test(): for i in range(8): result = fib(i) print(i, "=>", result) test() fib_test.py shell$ python3 fib_test.py 0 => 0 1 => 1 2 => 1 3 => 2 4 => 3 5 => 5 6 => 8 7 => 13 shell$ ? fib
  • 17. 17 @ikwzmPYNQ 祭り(2017/3/4) MessagePack-RPC (Remote Procedure Call) import msgpackrpc cli = msgpackrpc.Client( msgpackrpc.Address( 'localhost',18800)) def fib(n): return cli.call('fib', n) def test(): for i in range(5): result = fib(i) print(i, "=>", result) test() fib_client.py fib_server.py import msgpackrpc class FibServer(object): def fib(self, n): if n <= 0: return 0 if n == 1: return 1 r0 = 0 r1 = 1 for i in range(n-1): prev_r1 = r1 r1 = r0 + r1 r0 = prev_r1 return r1 svr=msgpackrpc.Server(FibServer()) svr.listen(msgpackrpc.Address( 'localhost',18800)) svr.start()shell$ python3 fib_client.py 0 => 0 1 => 1 2 => 1 3 => 2 4 => 3 shell$ shell$ python3 fib_server.py & shell$ 94 00 05 A366 69 62 91 03 [ 0, 5, "fib", [ 3 ] ] 94 01 05 C0 02 [ 1, 5, nil, 2 ] Request Message Response Message
  • 18. 18 @ikwzmPYNQ 祭り(2017/3/4) MessagePack-RPC Server on FPGA-SoC-Linux(1) PTTY_AXI Fib_Interface fib Fib_Server fib_ready fib_in_n fib_valid fib_out_0 fib_accept ZPTTY.ko socat fib_client.py FPGA Manager Clk/Reset /dev /fpga0 /dev /fpgaclk0 /dev/zptty0 network interface from polyphony import testbench def fib(n): if n <= 0: return 0 if n == 1: return 1 r0 = 0 r1 = 1 for i in range(n-1): prev_r1 = r1 r1 = r0 + r1 r0 = prev_r1 return r1 fib.py polyphony_out_ fib.v polyphony Device Tree Overlay /config /device- tree PS(Processing System) PL(Programmable Logic)
  • 19. 19 @ikwzmPYNQ 祭り(2017/3/4) MessagePack-RPC Server on FPGA-SoC-Linux(2) import msgpackrpc cli = msgpackrpc.Client( msgpackrpc.Address( 'localhost',54321)) def fib(n): return cli.call('fib', n) def test(): for i in range(5): result = fib(i) print(i, "=>", result) test() fib_client.py PTTY_AXI Fib_Interface fib Fib_Server fib_ready fib_in_n fib_valid fib_out_0 fib_accept ZPTTY.ko socat fib_client.py FPGA Manager Clk/Reset /dev /fpga0 /dev /fpgaclk0 /dev/zptty0 network interface Device Tree Overlay /config /device- tree PS(Processing System) PL(Programmable Logic)
  • 20. 20 @ikwzmPYNQ 祭り(2017/3/4) MessagePack-RPC Server on FPGA-SoC-Linux(3) PTTY_AXI Fib_Interface fib Fib_Server fib_ready fib_in_n fib_valid fib_out_0 fib_accept ZPTTY.ko socat fib_client.py FPGA Manager Clk/Reset /dev /fpga0 /dev /fpgaclk0 /dev/zptty0 network interface Device Tree Overlay /config /device- tree PS(Processing System) PL(Programmable Logic) 94 00 05 A3 66 69 62 91 03 [ 0, 5, "fib", [ 3 ] ] Request Message を生成 3 2 Fib_Interface が Request Message を unpack して fib のインターフェース信号に変換
  • 21. 21 @ikwzmPYNQ 祭り(2017/3/4) MessagePack-RPC Server on FPGA-SoC-Linux(4) PTTY_AXI Fib_Interface fib Fib_Server fib_ready fib_in_n fib_valid fib_out_0 fib_accept ZPTTY.ko socat fib_client.py FPGA Manager Clk/Reset /dev /fpga0 /dev /fpgaclk0 /dev/zptty0 network interface Device Tree Overlay /config /device- tree PS(Processing System) PL(Programmable Logic) 94 01 05 C0 02 [ 1, 5, nil, 2 ] Response Message Fib_Interface が fib からのリタ ーン値を Response Message に pack 3 2
  • 22. 22 @ikwzmPYNQ 祭り(2017/3/4) polyphony_out_ test.v polyphony_out.v Design Flow python3 polyphony polyphony_out_ fib.v fib.py Vivado Behv Sim Fib_Interface.vhd Fib_Server.vhd msgpack- if-gen.rb fib.yml Fib_Server.zip (IP for Vivado) Vivado IP Integrator Synthesis Implementation design_1_ wrapper.bit design_1_bd .tcl MsgPack.vhd Vivado IP Packager vhdl- archiver.rb
  • 23. 23 @ikwzmPYNQ 祭り(2017/3/4) polyphony_out_ test.v polyphony_out.v msgpack-if-gen python3 polyphony polyphony_out_ fib.v fib.py Vivado Behv Sim Fib_Interface.vhd Fib_Server.vhd msgpack- if-gen.rb fib.yml Fib_Server.zip (IP for Vivado) Vivado IP Integrator Synthesis Implementation design_1_ wrapper.bit design_1_bd .tcl MsgPack.vhd Vivado IP Packager fib.yml --- name: fib generate : interface: {name: Fib_Interface, file: Fib_Interface.vhd} server: {name: Fib_Server , file: Fib_Server.vhd } port: {clock: clk, reset: rst, clear: } methods: - name: fib interface: {type: polyphony} arguments: - name: n type: Integer interface: {name: Signal , type: {name: Signed, width: 32}, port: {data: fib_in_n}} returns: - name: o type: Integer interface: {name: Signal , type: {name: Signed, width: 32}, port: {data: fib_out_0}} --- vhdl- archiver.rb
  • 24. 24 @ikwzmPYNQ 祭り(2017/3/4) polyphony_out_ test.v polyphony_out.v Vivado IP Packager (1) python3 polyphony polyphony_out_ fib.v fib.py Vivado Behv Sim Fib_Interface.vhd Fib_Server.vhd msgpack- if-gen.rb fib.yml Fib_Server.zip (IP for Vivado) design_1_ wrapper.bit design_1_bd .tcl MsgPack.vhd Vivado IP Packager Vivado IP Integrator Synthesis Implementation vhdl- archiver.rb
  • 26. 26 @ikwzmPYNQ 祭り(2017/3/4) polyphony_out_ test.v polyphony_out.v Vivado IP Integrator (1) python3 polyphony polyphony_out_ fib.v fib.py Vivado Behv Sim Fib_Interface.vhd Fib_Server.vhd msgpack- if-gen.rb fib.yml Fib_Server.zip (IP for Vivado) design_1_ wrapper.bit design_1_bd .tcl MsgPack.vhd Vivado IP Packager Vivado IP Integrator Synthesis Implementation vhdl- archiver.rb
  • 28. 28 @ikwzmPYNQ 祭り(2017/3/4) polyphony_out_ test.v polyphony_out.v Vivado Synthesis & Implementation (1) python3 polyphony polyphony_out_ fib.v fib.py Vivado Behv Sim Fib_Interface.vhd Fib_Server.vhd msgpack- if-gen.rb fib.yml Fib_Server.zip (IP for Vivado) design_1_ wrapper.bit design_1_bd .tcl MsgPack.vhd Vivado IP Packager Vivado IP Integrator Synthesis Implementation vhdl- archiver.rb
  • 29. 29 @ikwzmPYNQ 祭り(2017/3/4) Vivado Synthesis & Implementation (2)
  • 30. 30 @ikwzmPYNQ 祭り(2017/3/4) Load and start fib server on PL(Programmable Logic) shell# echo 1 >/sys/class/fpgacfg/fpgacfg0/data_format shell# echo 1 >/sys/class/fpgacfg/fpgacfg0/load_start shell# dd if=design_1_wrapper.bit of=/dev/fpgacfg0 bs=1M 3+1 records in 3+1 records out 4045676 bytes (4.0 MB) copied, 0.296939 s, 13.6 MB/s 1. Download "design_1_wrapper.bit" to PL 2. Load "zptty" device driver and overlay device-tree shell# modprobe zptty shell# dtbocfg.rb --install zptty0 --dts zptty0-zynq-zybo.dts 3. Start socat (background) shell# socat -d -d tcp-listen:54321,fork /dev/zptty0,raw,nonblock,echo=0 & [2] 2145 2017/03/01 09:34:13 socat[2145] N listening on AF=2 0.0.0.0:54321 FPGA-SoC-Linux(https://github.com/ikwzm/FPGA-SoC-Linux)の場合
  • 32. 32 @ikwzmPYNQ 祭り(2017/3/4) 課題 1. Design Flow が複雑 ・ すぐに切れそうな Tool Chain ・ msgpack-if-gen.rb 用の設定ファイル(fib.yml)が必要 2. MessagePack-RPC のオーバーヘッド ・ レイテンシーの増大 ・ スループットの悪化 3. Polyphony の言語的な制約
  • 33. 33 @ikwzmPYNQ 祭り(2017/3/4) polyphony_out_ test.v polyphony_out.v 課題 1.1 Design Flow が複雑 - すぐに切れそうな Tool Chain python3 polyphony polyphony_out_ fib.v fib.py Vivado Behv Sim Fib_Interface.vhd Fib_Server.vhd msgpack- if-gen.rb fib.yml Fib_Server.zip (IP for Vivado) Vivado IP Integrator Synthesis Implementation design_1_ wrapper.bit design_1_bd .tcl MsgPack.vhd Vivado IP Packager 複数のツールの組み合わせで 各ツールが独自の進化 1. python 2. polyphony 3. msgpack-vhdl 4. Vivado vhdl- archiver.rb
  • 34. 34 @ikwzmPYNQ 祭り(2017/3/4) polyphony_out_ test.v polyphony_out.v 課題 1.2 Design Flow が複雑 - msgpack-if-gen.rb 用設定ファイル必要 python3 polyphonyfib.py Vivado Behv Sim Fib_Interface.vhd Fib_Server.vhd msgpack- if-gen.rb fib.yml Fib_Server.zip (IP for Vivado) Vivado IP Integrator Synthesis Implementation design_1_ wrapper.bit design_1_bd .tcl MsgPack.vhd Vivado IP Packager 現状 polyphony_out_ fib.v 今後の 予定 vhdl- archiver.rb
  • 35. 35 @ikwzmPYNQ 祭り(2017/3/4) 課題 2. MessagePack-RPC のオーバーヘッド PTTY_AXI Fib_Interface fib Fib_Server fib_ready fib_in_n fib_valid fib_out_0 fib_accept ZPTTY.ko socat fib_client.py FPGA Manager Clk/Reset /dev /fpga0 /dev /fpgaclk0 /dev/zptty0 network interface Device Tree Overlay /config /device- tree PS(Processing System) PL(Programmable Logic) やたら長いパス レイテンシーの増大 (片道 数十 msec~数百 msec) 低速な TTY I/F スループットの悪化 (数十 MByte/sec)
  • 36. 36 @ikwzmPYNQ 祭り(2017/3/4) 課題 3. Polyphony の言語的な制約 ・ もともと論理回路は動的型付けが苦手(というかムチャブリです) ところが Python は動的型付け言語 Polyphony では変数の型を限定することで対応 使えるのは 32bit 整数、 True、 False だけ(2015/12 時点) ・ 最近は List (1次元かつ中身は整数のみ)やタプルも追加 ・ さらにクラスも使えるようになった(次頁参照) ・ Polyphony は現在絶賛開発中 今後いろいろと出来る様になるかも (多倍長整数、 浮動小数点、 文字列、 辞書、 多次元配列...)
  • 37. 37 @ikwzmPYNQ 祭り(2017/3/4) Polyphony の進化 - mmult.py - from polyphony import testbench class StreamIn: def __init__(self, buf, size): self.size = size self.buf = buf def read(self, addr): return self.buf[addr] class StreamOut: def __init__(self, buf, size): self.size = size self.buf = buf def write(self, addr, data): self.buf[addr] = data def mmult(a_buf:list, b_buf:list, o_buf:list, size): a = StreamIn(a_buf, size) b = StreamIn(b_buf, size) o = StreamOut(o_buf, size) for i in range(size): o.write(i, a.read(i) * b.read(i)) @testbench def test(): a = [0,1,2,3,4,5,6,7] b = [0,1,2,3,4,5,6,7] o = [0,0,0,0,0,0,0,0] size = 8 mmult(a, b, o, size) for i in range(size): print(i, ":", a[i], "*", b[i], "=>", o[i]) assert o[i] == a[i]*b[i] test() shell$ python3 mmult.py 0 : 0 * 0 => 0 1 : 1 * 1 => 1 2 : 2 * 2 => 4 3 : 3 * 3 => 9 4 : 4 * 4 => 16 5 : 5 * 5 => 25 6 : 6 * 6 => 36 7 : 7 * 7 => 49 shell$ mmult.py ・ 2017 年 2 月現在 ・ List と Class が使える。 ・ テストベンチ(polyphony_out_ test.v)は上手く動かなかった。 ・ List へのアクセスはウェイトが固定な ので BlockRAM 限定。 AXI マスタ ー等は使えない。 ・ MessagePack-RPC は未対応。
  • 38. 38 @ikwzmPYNQ 祭り(2017/3/4) 参考 - PYNQ-Festival ・ 以下の資料やバイナリイメージ ・ 本日説明したスライド ・ u-boot ・ Linux Kernel 4.8.17 (FPGA manager+Device Tree Overlay) ・ Debian 8 Root File System ・ design_1_wrapper.bit (PYNQ-Z1 用 bitstream) ・ fibonacci_client.ipynb  はこちらにあります。 https://github.com/ikwzm/PYNQ-Festival
  • 39. 39 @ikwzmPYNQ 祭り(2017/3/4) 参考 - Polyphony ・ Python ベースの高位合成コンパイラ ・ 作っているのは 有限会社シンビー http://www.sinby.com/PolyPhony/index.html ・ github でも公開中 https://github.com/ktok07b6/polyphony ・ 高位合成友の会 第3回(2015/12/08) でのスライド https://www.slideshare.net/ktok07b6/3-polyphony
  • 40. 40 @ikwzmPYNQ 祭り(2017/3/4) 参考 - MessagePack-VHDL ・ MessagePack-RPC を使って FPGA を制御 @Qiita http://qiita.com/ikwzm/items/2644c6e50a7049c75d49 ・ github で公開中 https://github.com/ikwzm/msgpack-vhdl https://github.com/ikwzm/msgpack-vhdl-examples
  • 41. 41 @ikwzmPYNQ 祭り(2017/3/4) 参考 - FPGA-SoC-Linux ・ FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1 対応) @Qiita http://qiita.com/ikwzm/items/d6fdaa859906252fd8b0 ・ github で公開中 https://github.com/ikwzm/FPGA-SoC-Linux