SlideShare une entreprise Scribd logo
1  sur  58
Télécharger pour lire hors ligne
Synthesijerの進捗報告とSynthesijerの進捗報告と
Synthesijer.Scalaの紹介
1
わさらぼ みよしたけふみ
2015.12.8
Synthesijer とは
 JavaプログラムをFPGA上のハードウェアに変換
 複雑なアルゴリズムのハードウェア実装を楽に
 オブクジェクト指向設計による再利用性の向上
 特殊な記法,追加構文はない
 ソフトウェアとして実行可能.動作の確認、検証が容易
Open-source
 ソフトウェアとして実行可能.動作の確認、検証が容易
 書けるプログラムに制限は加える
 (動的なnew,再帰は不可など)
 HDLモジュールのJavaからのインスタンス生成
(ハード屋に読めるようにJavaをゆがめている…だけ…かも)
while(…){
if(...){
2
if(...){
…
}else{
…
…
}
….
}
複雑な状態遷移も,Javaの制御構文を使って楽に設計できる
同じJavaプログラムをソフトウェアとしても
FPGA上のハードウェアとしても実行可能
使ってみる
•高位合成ツール「Synthesijer」を使う
•http://cellspe.matrix.jp/zerofpga/synthesijer.html
•Javaベース高位合成系 Synthesijer による回路モジュール設計例•Javaベース高位合成系 Synthesijer による回路モジュール設計例
•http://www.ritsumei.ac.jp/se/re/izumilab/lecture/15ZyboLedSjr/
•Synthesijer - BC::labs
•http://labs.beatcraft.com/ja/index.php?Synthesijer
•Synthesijer関連まとめ@Qiita
3
•http://qiita.com/kazunori279/items/4951ca5f6164040878ce
デザインコストは問題!!
4
Ivo Bolsens,
“FPGA2032 Roadmap:A Personal Perspective", FPGAs in 2032: Challenges and Opportunities in the next 20 years,”
Feb. 2012
Synthesijer オーバービュー
Javaコード
Javaプログラムの解析Javaコード
フロントエンド
スケジューリング表を作成
最適化
VHDL/
Verilog HDL
コード
中間表現
(S式)
ミドルエンド
5
HDL構文の組み立て
VHDL/
Verilog HDL
コード
VHDL/
Verilog HDL
コード
バックエンド
すごくべたなプログラムにみるコード生成の例
べたなプログラムを用意
public class SimpleProgram{
public int sum(int a, int b, int c,public int sum(int a, int b, int c,
int d, int e, int f,
int g, int h, int i,
int j, int k, int l){
c = a + b;
f = d + e;
i = g + h;
l = j + k;
c = c + f;
6
c = c + f;
l = l + i;
c = c + l;
return c;
}
}
最適化の例
内部表現
sum_0000: op=METHOD_EXIT, src=, dest=, next=0001
sum_0001: op=METHOD_ENTRY, src=, dest=, next=0002 (name=sum)
sum_0002: op=ADD, src=sum_a_0000:INT, sum_b_0001:INT, dest=binary_expr_00012:INT, next=0003
sum_0003: op=ASSIGN, src=binary_expr_00012:INT, dest=sum_c_0002:INT, next=0004
sum_0004: op=ADD, src=sum_d_0003:INT, sum_e_0004:INT, dest=binary_expr_00013:INT, next=0005
sum_0005: op=ASSIGN, src=binary_expr_00013:INT, dest=sum_f_0005:INT, next=0006
sum_0006: op=ADD, src=sum_g_0006:INT, sum_h_0007:INT, dest=binary_expr_00014:INT, next=0007
sum_0007: op=ASSIGN, src=binary_expr_00014:INT, dest=sum_i_0008:INT, next=0008
sum_0008: op=ADD, src=sum_j_0009:INT, sum_k_0010:INT, dest=binary_expr_00015:INT, next=0009
sum_0009: op=ASSIGN, src=binary_expr_00015:INT, dest=sum_l_0011:INT, next=0010
sum_0010: op=ADD, src=sum_c_0002:INT, sum_f_0005:INT, dest=binary_expr_00016:INT, next=0011
sum_0011: op=ASSIGN, src=binary_expr_00016:INT, dest=sum_c_0002:INT, next=0012
sum_0012: op=ADD, src=sum_l_0011:INT, sum_i_0008:INT, dest=binary_expr_00017:INT, next=0013
sum_0013: op=ASSIGN, src=binary_expr_00017:INT, dest=sum_l_0011:INT, next=0014
7
sum_0013: op=ASSIGN, src=binary_expr_00017:INT, dest=sum_l_0011:INT, next=0014
sum_0014: op=ADD, src=sum_c_0002:INT, sum_l_0011:INT, dest=binary_expr_00018:INT, next=0015
sum_0015: op=ASSIGN, src=binary_expr_00018:INT, dest=sum_c_0002:INT, next=0016
sum_0016: op=RETURN, src=sum_c_0002:INT, dest=, next=0000
sum_0017: op=JP, src=, dest=, next=0000
最適化の例
同時実行可能な命令をセットにする
sum_0000: op=METHOD_EXIT, src=, dest=, next=0001
sum_0001: op=METHOD_ENTRY, src=, dest=, next=0002 (name=sum)
sum_0002: op=ADD, src=sum_a_0000:INT, sum_b_0001:INT, dest=binary_expr_00012:INT, next=0003
sum_0002: op=ADD, src=sum_d_0003:INT, sum_e_0004:INT, dest=binary_expr_00013:INT, next=0003
sum_0002: op=ADD, src=sum_g_0006:INT, sum_h_0007:INT, dest=binary_expr_00014:INT, next=0003
sum_0002: op=ADD, src=sum_j_0009:INT, sum_k_0010:INT, dest=binary_expr_00015:INT, next=0003
sum_0003: op=ASSIGN, src=binary_expr_00012:INT, dest=sum_c_0002:INT, next=0010
sum_0003: op=ASSIGN, src=binary_expr_00013:INT, dest=sum_f_0005:INT, next=0010
sum_0003: op=ASSIGN, src=binary_expr_00014:INT, dest=sum_i_0008:INT, next=0010
sum_0003: op=ASSIGN, src=binary_expr_00015:INT, dest=sum_l_0011:INT, next=0010
sum_0010: op=ADD, src=sum_c_0002:INT, sum_f_0005:INT, dest=binary_expr_00016:INT, next=0011
sum_0010: op=ADD, src=sum_l_0011:INT, sum_i_0008:INT, dest=binary_expr_00017:INT, next=0011
sum_0011: op=ASSIGN, src=binary_expr_00016:INT, dest=sum_c_0002:INT, next=0014
sum_0011: op=ASSIGN, src=binary_expr_00017:INT, dest=sum_l_0011:INT, next=0014
8
sum_0011: op=ASSIGN, src=binary_expr_00017:INT, dest=sum_l_0011:INT, next=0014
sum_0014: op=ADD, src=sum_c_0002:INT, sum_l_0011:INT, dest=binary_expr_00018:INT, next=0015
sum_0015: op=ASSIGN, src=binary_expr_00018:INT, dest=sum_c_0002:INT, next=0016
sum_0016: op=RETURN, src=sum_c_0002:INT, dest=, next=0000
sum_0017: op=JP, src=, dest=, next=0000
最適化の例
依存関係にある命令群を専用命令にまとめる
sum_0000: op=METHOD_EXIT, src=, dest=, next=0001
sum_0001: op=METHOD_ENTRY, src=, dest=, next=0002 (name=sum)
sum_0002: op=ADD, src=sum_a_0000:INT, sum_b_0001:INT, dest=binary_expr_00012:INT, next=0016
sum_0002: op=ADD, src=sum_d_0003:INT, sum_e_0004:INT, dest=binary_expr_00013:INT, next=0016
sum_0002: op=ADD, src=sum_g_0006:INT, sum_h_0007:INT, dest=binary_expr_00014:INT, next=0016
sum_0002: op=ADD, src=sum_j_0009:INT, sum_k_0010:INT, dest=binary_expr_00015:INT, next=0016
sum_0002: op=ASSIGN, src=binary_expr_00012:INT:chain, dest=sum_c_0002:INT, next=0016
sum_0002: op=ASSIGN, src=binary_expr_00013:INT:chain, dest=sum_f_0005:INT, next=0016
sum_0002: op=ASSIGN, src=binary_expr_00014:INT:chain, dest=sum_i_0008:INT, next=0016
sum_0002: op=ASSIGN, src=binary_expr_00015:INT:chain, dest=sum_l_0011:INT, next=0016
sum_0002: op=ADD, src=sum_c_0002:INT:chain, sum_f_0005:INT:chain,
dest=binary_expr_00016:INT, sum_0002: op=ADD, src=sum_l_0011:INT:chain,
sum_i_0008:INT:chain, dest=binary_expr_00017:INT, sum_0002: op=ASSIGN,
src=binary_expr_00016:INT:chain, dest=sum_c_0002:INT, next=0016
9
src=binary_expr_00016:INT:chain, dest=sum_c_0002:INT, next=0016
sum_0002: op=ASSIGN, src=binary_expr_00017:INT:chain, dest=sum_l_0011:INT, next=0016
sum_0002: op=ADD, src=sum_c_0002:INT:chain, sum_l_0011:INT:chain, dest=binary_expr_00018:INT
sum_0002: op=ASSIGN, src=binary_expr_00018:INT:chain, dest=sum_c_0002:INT, next=0016
sum_0016: op=RETURN, src=sum_c_0002:INT, dest=, next=0000
sum_0017: op=JP, src=, dest=, next=0000
内部情報のダンプと利用
内部はS式.S式を外でいじって処理系に戻すことも可
(SEQUENCER sum
(SLOT 0
(METHOD_EXIT :next (1))
)
(SLOT 1(SLOT 1
(METHOD_ENTRY :next (2))
)
(SLOT 2
(SET binary_expr_00012 (ADD sum_a_0000 sum_b_0001) :next (16))
(SET binary_expr_00013 (ADD sum_d_0003 sum_e_0004) :next (16))
(SET binary_expr_00014 (ADD sum_g_0006 sum_h_0007) :next (16))
(SET binary_expr_00015 (ADD sum_j_0009 sum_k_0010) :next (16))
(SET sum_c_0002 (ASSIGN binary_expr_00012) :next (16))
... ...
(SET sum_c_0002 (ASSIGN binary_expr_00016) :next (16))
(SET sum_l_0011 (ASSIGN binary_expr_00017) :next (16))
(SET binary_expr_00018 (ADD sum_c_0002 sum_l_0011) :next (16))
10
(SET binary_expr_00018 (ADD sum_c_0002 sum_l_0011) :next (16))
(SET sum_c_0002 (ASSIGN binary_expr_00018) :next (16))
)
(SLOT 16
(RETURN sum_c_0002 :next (0))
)
(SLOT 17
(JP :next (0))
)
)
内部情報のダンプと利用
11
内部情報のダンプと利用
12
Synthesijer はJavaベースなので...
オブジェクト指向的プログラミング!!
… … …
13
インスタンス生成
クラスのインスタンスを生成/利用できる
public class Test002 {
public static final int DEFAULT_VALUE = 0x20;
ex. sample/test/Test002.javaとsample/test/Test003.java
public static final int DEFAULT_VALUE = 0x20;
public int[] a = new int[128];
public int x, y;
public void init(){
for(int i = 0; i < a.length; i++){
a[i] = 0;
}
}
public class Test003 {
private final Test002 t = new Test002();
14
public void set(int i, int v){
a[i] = v;
}
…
}
public void test(){
t.init();
t.set(0, 100); // 0 <- 100
…
}
…
}
インスタンス生成
クラスのインスタンスを生成/利用できる
ex. sample/test/Test002.javaとsample/test/Test003.java
Test002 class_t_0000 (
.clk(class_t_0000_clk),.clk(class_t_0000_clk),
.reset(class_t_0000_reset),
.a_address(class_t_0000_a_address),
.a_we(class_t_0000_a_we),
.a_oe(class_t_0000_a_oe),
.a_din(class_t_0000_a_adin),
.a_dout(class_t_0000_a_dout),
.a_length(class_t_0000_a_length),
…
.set_i(class_t_0000_set_i),
.set_v(class_t_0000_set_v),
15
…
.init_req(class_t_0000_init_req),
.init_busy(class_t_0000_init_busy),
…
.set_req(class_t_0000_set_req),
.set_busy(class_t_0000_set_busy),
…
);
インスタンス生成・拡張モジュール
VHDL/Verilog HDLで書いたモジュールのインスタンス化
module hoge(
input wire clk,
ex. Verilog HDLで書いたhogeをJavaから呼び出す
input wire clk,
input wire reset,
input signed [31:0] a_address,
input signed [31:0] a_din,
input wire we,
input wire oe,
output signed [31:0] a_dout,
output signed [31:0] a_length,
input wire func_req,
clk
reset
a_address
a_din
hoge q
16
input wire func_req,
output wire func_busy,
output wire [31:0] q
);
…
endmodule
a_we
a_oe
a_din
a_dout
func_req
func_busy
a_length
インスタンス生成・拡張モジュール
VHDL/Verilog HDLで書いたモジュールのインスタンス化
class HogeIface extends HDLModule{
↓のようなJava用のダミーコードを書く
…
private final HogeIface obj = new HogeIface();
…
class HogeIface extends HDLModule{
int[] a;
void func(){}
public HogeIface(String... args){
newPort("a_address", HDLPort.DIR.IN, genSignedType(32));
newPort("a_din", HDLPort.DIR.IN, genSignedType(32));
newPort("a_we", HDLPort.DIR.IN, genBitType());
newPort("a_oe", HDLPort.DIR.IN, genBitType());
newPort("a_dout", HDLPort.DIR.OUT, genSignedType(32));
private void func(){
obj.a[10] = 100;
obj.func();
…
a[]
17
newPort("a_dout", HDLPort.DIR.OUT, genSignedType(32));
newPort("a_length", HDLPort.DIR.OUT, genSignedType(32));
newPort("func_req", HDLPort.DIR.IN, genBitType());
newPort("func_busy", HDLPort.DIR.OUT, genBitType());
newPort("q", HDLPort.DIR.OUT, genVectorType(32), Enum.of(OPTION.EXPORT));
}
…
}
func()
これはJavaでは使わない,という印
インスタンス生成の例
乱数生成のハードウェアをJavaから使う
// xorshift RNG, period 2^128-1
// cf. http://www.jstatsoft.org/v08/i14/paper
module xor128
((
input wire clk, input wire reset, output reg [63:0] q
);
reg[31:0] x = 123456789, y = 362436069, z = 521288629, w = 88675123;
reg[31:0] t;
always @(posedge clk) begin
q[63:32] <= 32'h0;
if(reset == 1'b1) begin
x <= 123456789; y <= 362436069;
z <= 521288629; w <= 88675123;
18
z <= 521288629; w <= 88675123;
end else begin
t = x ^ (x << 11); x = y; y = z; z = w;
w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
q[31:0] <= w;
end
end
endmodule
インスタンス生成の例
乱数生成のハードウェアをJavaから使う
/**
* リスト15: XOR128.java
* xor128をJavaから利用するためのダミークラス
*/
import synthesijer.hdl.HDLModule;import synthesijer.hdl.HDLModule;
import synthesijer.hdl.HDLPort;
import synthesijer.hdl.HDLPrimitiveType;
public class XOR128Iface extends HDLModule{
// Javaプログラムのためのダミー変数
// xor128の出力qに相当する
public long q;
public XOR128Iface(String... args){
// - 実際に使用するモジュール名
19
// - 実際に使用するモジュール名
// - クロック信号名
// - リセット信号名
// の順に指定する.
super("xor128", "clk", "reset");
// メンバ変数"q"に相当する64bit幅の出力ポートを生成する
newPort("q", HDLPort.DIR.OUT, HDLPrimitiveType.genSignedType(64));
}
}
インスタンス生成の例
乱数生成のハードウェアをJavaから使う
/**
* リスト16: XOR128Test.java
* xor128をJavaから利用する例* xor128をJavaから利用する例
*/
public class XOR128Test{
// XOR128モジュールのインスタンスを生成
private final XOR128Iface rng = new XOR128Iface();
public boolean test(){
long v = rng.q; // 乱数を読み出す
// 処理の例.たとえば1000より大きければ真,とか.
if(v > 1000){
20
if(v > 1000){
return true;
}else{
return false;
}
}
}
インスタンス生成の例
乱数生成のハードウェアをJavaから使う
21
HDLモジュールをインスタンスとして使う
•ライブラリとしていくつか用意
•UART
•FIFO,キャッシュメモリ
•AXIマスタ,スレーブ
•簡単なI2Cマスタ
•音声出力モジュール
22
クラスの継承も可
public class Test010{
public void test(){
int a = 20;
int b = 30;
int c = 0;
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
int c = 0;
c = a & b;
c = a | b;
c = a ^ b;
}
}
public class Test012 extends Test010{
public void run(){
test();
use IEEE.numeric_std.all;
entity Test012 is
port (
clk : in std_logic;
reset : in std_logic;
run_busy : out std_logic;
run_req : in std_logic;
test_busy : out std_logic;
test_req : in std_logic
23
test();
}
}
);
end Test012;
architecture RTL of Test012 is
…
クラスの継承も可
public abstract class Test013_A{
abstract public int hoge();
}
public class Test013_B extends Test013_A{public class Test013_B extends Test013_A{
public int hoge(){
return 10;
}
}
public class Test013_C extends Test013_A{
public int hoge(){
return 20;
}
public class Test013{
private final Test013_A obj0 = new Test013_B();
24
}
}
private final Test013_A obj0 = new Test013_B();
private final Test013_A obj1 = new Test013_C();
public void test(){
int a = obj0.hoge();
int b = obj1.hoge();
}
}
Synthesijer はJavaベースなので...
Threadを使って並列化できる
… … …
25
スレッドの利用例
JavaではThreadクラスを継承して並列動作を記述
/*
* リスト11: ThreadCounter.java
* Threadの活用例
*/
// JavaではThreadクラスを継承したクラスを作る
public class ThreadCounter extends Thread{
public int counter = 0;
// Threadの処理はrunメソッドで実装する
public void run(){
while(true){
26
while(true){
// 変数をインクリメントする無限ループ
counter++;
}
}
}
スレッドの利用例
JavaではThreadクラスを継承して並列動作を記述
import synthesijer.rt.unsynthesizable;
public class ThreadTest{
private final ThreadCounter t0 = new ThreadCounter();
private final ThreadCounter t1 = new ThreadCounter();
public void test(){public void test(){
t0.start();
t1.start();
}
// このメソッドはSynthesijerでは無視する
@unsynthesizable
public static void main(String... args){
ThreadTest t = new ThreadTest();
t.test();
while(true){
System.out.println("t0:" + t.t0.counter);
27
System.out.println("t0:" + t.t0.counter);
System.out.println("t1:" + t.t1.counter);
try{
Thread.sleep(1);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
スレッドの利用例
PCで実行したところ
28
スレッドの利用例
シミュレーションで確認したところ
29
ここまでのまとめ
•Synthesijer = Java→VHDL/Verilog HDL変換ツールです
•継承とかスレッドとかサポートしてます
•HDLなモジュールもクラスにしてインスタンス生成します
•内部表現を出力したり,再利用したりできます
•しゃべってないけど
30
•再帰呼び出しの実装をしてみたり
•もっとJavaっぽいコードのサポートをしたいなあとか
もう一つの開発コスト軽減のアプローチ
31
RTL設計の辛さ
 “信号の流れ”を記述する
 “処理の流れ”を“信号の流れ”に変換
本質としては
 “処理の流れ”を“信号の流れ”に変換
 ↔ 書きたいのは“処理の流れ”


たくさんの似たような構造
 たくさんの似たような名前
実務的には
32
 たくさんの似たような名前

 記述の再利用をしたいが難しい
手軽なFPGA開発のための取り組み
 高位合成言語処理系
 DSL DSL
33
高位合成処理系
 CやJava,C#などを入力言語とした開発環境
 開発コストを小さくできる
 生成したHWの質は処理系依存
 良いHW生成にはコツが必要
 ディレクティブの活用
 書き方を考える必要がある
34
DSLベースの設計手法
 RTL設計を楽にするためのDSL
 実装したいアプリケーション別のDSL
 プログラミングモデルに特化したDSL
35
様々なDSLベースのシステム開発(1)
MyHDL (Pythonベース)
RTL設計(あるいは少し抽象的なHW設計)を
より楽にするためのDSL
 MyHDL (Pythonベース)
 JHDL (Javaベース)
 Chisel (Scalaベース)
 PyVerilog (Pythonベース)
36

などなどなど
様々なDSLベースのシステム開発(2)
 Spiral ←Linear Digital Processing
実装したいアプリケーションに特化したDSL
 HDL Coder ← 信号処理(Matlab)
 Optimus ← ストリーム処理
 LINQ ← クエリプロセッシング
などなどなど
37

 DSLを作るツールも.(たとえば,LMS/Scala)
様々なDSLベースのシステム開発(3)
 Bluespec (並行プログラミング)
使用するプログラミングモデルに特化したDSL
 MaxCompiler (データフロープログラミング)
 FloPoCo (浮動小数点数パイプライン)
 SPGen (パイプライン)
などなどなど
38


欲しいDSL
 Bluespec (並行プログラミング)
使用するプログラミングモデルに特化したDSL
 MaxCompiler (データフロープログラミング)
 FloPoCo (浮動小数点数パイプライン)
などなどなど

状態遷移および各状態での処理設計がやりやすく
39

状態遷移および各状態での処理設計がやりやすく
組み合わせ回路が書きやすい言語
モデル
モジュールの設計単位組み合わせ回路.
状態は持たない
出力
40
入力
クロック単位での状態保持
状態遷移マシン
Synthesijer.Scalaの立ち位置
Javaコード
Javaプログラムの解析Javaコード
フロントエンド
スケジューリング表を作成
最適化
VHDL/
Verilog HDL
コード
中間表現
(S式)
ミドルエンド
41
HDL構文の組み立て
VHDL/
Verilog HDL
コード
VHDL/
Verilog HDL
コード
バックエンド
Scalaで
自分で組立て
はじめてのSynthesijer.scala
 Lチカの例
def generate_led() : Module = {
val m = new Module("led")
val q = m.outP("q")
val counter = m.signal(32)
def main(args:Array[String]) = {
val led = generate_led(5)
val sim = generate_sim(led, "led_sim")
led.genVHDL()
led.genVerilog()
sim.genVHDL()val counter = m.signal(32)
q <= counter.ref(5)
val seq = m.sequencer("main")
counter <= (seq.idle, VECTOR_ZERO)
val s0 = seq.idle -> seq.add()
counter <= s0 * (counter + 1)
return m
}
sim.genVHDL()
led.portFor("q").setPinID("M14");
led.portFor("q").setIoAttr("LVCMOS33");
led.sysClk.setPinID("L16");
led.sysClk.setIoAttr("LVCMOS33");
led.sysReset.setPinID("G15");
led.sysReset.setIoAttr("LVCMOS33");
println(led.genUCF())
println(led.genXDC())
}
42
def generate_sim(target:Module, name:String) : SimModule = {
val sim = new SimModule(name)
val inst = sim.instance(target)
val (clk, reset, counter) = sim.system(10)
inst.sysClk <= clk
inst.sysReset <= reset
return sim
}
はじめてのSynthesijer.scala
43
ベンディングマシンの例
¢5
自動販売機
¢5
¢10
ドリンク一杯¢20
お釣りは出ません
44
ドリンク
お釣りは出ません
RTLでの設計の場合
…
type stateType is (NONE, CHARGE_5, CHARGE_10, CHARGE_15, OK)
signal state, next_state: stateType := NONE;
…
case (state) is
when NONE =>
if nickel then
next_state <= CHARGE_5;
elsif dime then
next_state <= CHARGE_10;
else
next_state <= NONE;
end if;
when CHARGE_5 =>
if nickel then
next_state <= CHARGE_10;
45
next_state <= CHARGE_10;
elsif dime then
next_state <= CHARGE_15;
else
next_state <= NONE;
end if;
…
ベンディングマシンの例
class VendingMachine(n:String,c:String,r:String) extends Module(n,c,r){
val nickel = inP("nickel")
val dime = inP("dime")
val rdy = outP("rdy")
val seq = sequencer("main")val seq = sequencer("main")
val s5,s10,s15,s_ok = seq.add()
rdy <= (seq.idle, LOW)
rdy <= (s_ok, HIGH)
seq.idle -> (nickel, s5)
seq.idle -> (dime, s10)
s5 -> (nickel,s10)
s5 -> (dime, s15)
46
s10 -> (nickel, s15)
s10 -> (dime, s_ok)
s15 -> (nickel, s_ok)
s15 -> (dime, s_ok)
s_ok -> seq.idle
}
val m = new VendingMachine("machine", "clk", "reset")
m.genVHDL()
m.visuallize_statemachine()
ベンディングマシンのステートマシン
47
Scalaの機能を使った設計効率化の向上
 設計資産をメソッドやクラスとして保存,再利用
 類似オブジェクトや類似オブジェクトの生成
 ループとパタンマッチによる直列化/復元コードの生成
48
設計資産の再利用
例: デコーダ (7セグメントLEDの点灯)
6
4
0
2
51
49
7
3
設計資産の再利用
process (data)
begin
6
従来のHDLによるRTL設計の場合
begin
case (data) is
when 0 => segment <= X"7e";
when 1 => segment <= X"30";
…
when 9 => segment <= X"79";
when others => null;
4
0
2
51
50
when others => null;
end case;
end process; 7
3
毎回このパターンを書かないといけない.
設計資産の再利用
パターンを作るメソッド.回路のレシピ.
Synthesijer.scalaを使う場合
def decoder(s:ExprItem, l:List[(Int,Int)], w:Int) = {
l.foldRight[ExprItem](value(0,w)){
(a, z) => ?(s == a._1, value(a._2, w), z)
}
実データに合わせた回路の生成
51
val tbl = List((0, 0x7e), (1, 0x30), …, (9, 0x79))
segment := decoder(data, tbl, segment.width())
実データに合わせた回路の生成
自分なりのパタン,最適化の埋め込みも
 組み合わせ回路の段数に応じたFF(状態)の追加,除去
入出力データに対するパタンマッチ
例えば...
 入出力データに対するパタンマッチ
 よく使うモジュールのテンプレート化
 プロトコル処理のテンプレート化
**バイト目が到着まで待って**する
**バイトまではメモリに保存
52
**バイトまではメモリに保存
**バイト以降は,そのまま次にフォワード
などなど
自分なりの実装,例
例えば...ANDゲートをLUTじゃなくてMUXで作りたい
53
自分なりの実装,例
継承とオーバーライドを使って,自然に表現可能
val x0 = inP("x0")
val y0 = inP("y0")val y0 = inP("y0")
val z0 = outP("z0")
val z1 = outP("z1")
val z2 = outP("z2")
z0 := x0 and y0
val x1c = new CARRY4Sig(x0)
val y1c = new CARRY4Sig(y0)
54
val y1c = new CARRY4Sig(y0)
z1 := x1c and y1c
z2 := z0 or z1
自分なりの実装,例
例えば...ANDゲートをLUTじゃなくてMUXで作りたい
55
自分なりの実装,例
例えば...ANDゲートをLUTじゃなくてMUXで作りたい
56
Synthesijer.*
Javaコード
Javaプログラムの解析Javaコード
フロントエンド
スケジューリング表を作成
最適化
VHDL/
Verilog HDL
コード
中間表現
(S式)
ミドルエンド
JRubyで
自分で組立て
Clojureで
自分で組立て
57
HDL構文の組み立て
VHDL/
Verilog HDL
コード
VHDL/
Verilog HDL
コード
バックエンド
Scalaで
自分で組立て
使ってみる
•高位合成ツール「Synthesijer」を使う
•http://cellspe.matrix.jp/zerofpga/synthesijer.html
•Javaベース高位合成系 Synthesijer による回路モジュール設計例•Javaベース高位合成系 Synthesijer による回路モジュール設計例
•http://www.ritsumei.ac.jp/se/re/izumilab/lecture/15ZyboLedSjr/
•Synthesijer - BC::labs
•http://labs.beatcraft.com/ja/index.php?Synthesijer
•Synthesijer関連まとめ@Qiita
58
•http://qiita.com/kazunori279/items/4951ca5f6164040878ce
•Synthesijer.Scala関連
•http://wasa-labo.com/wp/?p=320#more-320

Contenu connexe

Tendances

effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36Tatsuki SHIMIZU
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!Masami Ichikawa
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3DKouji Hosoda
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Mr. Vengineer
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Keisuke Fukuda
 
Zynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチZynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチMr. Vengineer
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今y-uti
 
技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution EngineAsuka Nakajima
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しようUnity Technologies Japan K.K.
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」Mr. Vengineer
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccYujiSoftware
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Yoshio Terada
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Fixstars Corporation
 

Tendances (20)

effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
 
VerilatorとSystemC
VerilatorとSystemCVerilatorとSystemC
VerilatorとSystemC
 
Zynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチZynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチ
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今
 
技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
 
コルーチンの使い方
コルーチンの使い方コルーチンの使い方
コルーチンの使い方
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
20130819 jjugnslt
20130819 jjugnslt20130819 jjugnslt
20130819 jjugnslt
 

En vedette

電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた
電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた
電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみたHiroki Nakahara
 
FPGAX2016 ドキュンなFPGA
FPGAX2016 ドキュンなFPGAFPGAX2016 ドキュンなFPGA
FPGAX2016 ドキュンなFPGAHiroki Nakahara
 
Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)Hiroki Nakahara
 
mHealth Israel_Synchronizing Reimbursement and Regulatory Activities_Amir Inb...
mHealth Israel_Synchronizing Reimbursement and Regulatory Activities_Amir Inb...mHealth Israel_Synchronizing Reimbursement and Regulatory Activities_Amir Inb...
mHealth Israel_Synchronizing Reimbursement and Regulatory Activities_Amir Inb...Levi Shapiro
 
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218HPCシステムズ株式会社
 
Jeová e o ministério pre mortal e a criação
Jeová e o ministério pre mortal e a criaçãoJeová e o ministério pre mortal e a criação
Jeová e o ministério pre mortal e a criaçãoÉlida Rolim
 
Virtual Reality Workshop (3/13/2017)
Virtual Reality Workshop (3/13/2017)Virtual Reality Workshop (3/13/2017)
Virtual Reality Workshop (3/13/2017)KR_Barker
 
6 months of experimentation with bots
6 months of experimentation with bots6 months of experimentation with bots
6 months of experimentation with botsChatbots Paris
 
12 inspirationalquotesforreading
12 inspirationalquotesforreading12 inspirationalquotesforreading
12 inspirationalquotesforreadingZue Yanie
 
Film industry task 3
Film industry task 3Film industry task 3
Film industry task 3Josh Yates
 
K Fund - Pitch to LPs
K Fund - Pitch to LPsK Fund - Pitch to LPs
K Fund - Pitch to LPsJaime Novoa
 

En vedette (19)

電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた
電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた
電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた
 
FPGAX2016 ドキュンなFPGA
FPGAX2016 ドキュンなFPGAFPGAX2016 ドキュンなFPGA
FPGAX2016 ドキュンなFPGA
 
なにわテック道0903
なにわテック道0903なにわテック道0903
なにわテック道0903
 
なにわTech20160827
なにわTech20160827なにわTech20160827
なにわTech20160827
 
Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)
 
mHealth Israel_Synchronizing Reimbursement and Regulatory Activities_Amir Inb...
mHealth Israel_Synchronizing Reimbursement and Regulatory Activities_Amir Inb...mHealth Israel_Synchronizing Reimbursement and Regulatory Activities_Amir Inb...
mHealth Israel_Synchronizing Reimbursement and Regulatory Activities_Amir Inb...
 
自称IQ診断 --- いわゆる頭の体操
自称IQ診断 --- いわゆる頭の体操自称IQ診断 --- いわゆる頭の体操
自称IQ診断 --- いわゆる頭の体操
 
20161120_HPCでFPGAを使ってみたい_fpgastartup
20161120_HPCでFPGAを使ってみたい_fpgastartup20161120_HPCでFPGAを使ってみたい_fpgastartup
20161120_HPCでFPGAを使ってみたい_fpgastartup
 
なにわTech20161215
なにわTech20161215 なにわTech20161215
なにわTech20161215
 
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218
HPCで使えそうなFPGA搭載AWS F1 インスタンス_20161218
 
Jeová e o ministério pre mortal e a criação
Jeová e o ministério pre mortal e a criaçãoJeová e o ministério pre mortal e a criação
Jeová e o ministério pre mortal e a criação
 
TF.RGO.81
TF.RGO.81TF.RGO.81
TF.RGO.81
 
Gure lanbideak
Gure lanbideakGure lanbideak
Gure lanbideak
 
Virtual Reality Workshop (3/13/2017)
Virtual Reality Workshop (3/13/2017)Virtual Reality Workshop (3/13/2017)
Virtual Reality Workshop (3/13/2017)
 
6 months of experimentation with bots
6 months of experimentation with bots6 months of experimentation with bots
6 months of experimentation with bots
 
12 inspirationalquotesforreading
12 inspirationalquotesforreading12 inspirationalquotesforreading
12 inspirationalquotesforreading
 
Imgenesrenacimientoespaol
ImgenesrenacimientoespaolImgenesrenacimientoespaol
Imgenesrenacimientoespaol
 
Film industry task 3
Film industry task 3Film industry task 3
Film industry task 3
 
K Fund - Pitch to LPs
K Fund - Pitch to LPsK Fund - Pitch to LPs
K Fund - Pitch to LPs
 

Similaire à Synthesijer and Synthesijer.Scala in HLS-friends 201512

C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うTatsumi Naganuma
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。Satoshi Mimura
 
知って得するC#
知って得するC#知って得するC#
知って得するC#Shota Baba
 
Moony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinalMoony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinalPacSecJP
 
Guide for Swift and Viewer app
Guide for Swift and Viewer appGuide for Swift and Viewer app
Guide for Swift and Viewer appShintaro Kaneko
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けてonotchi_
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generatorOda Shinsuke
 
究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)fumoto kazuhiro
 
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack TangCODE BLUE
 
みんな大好き! Hello, World
みんな大好き! Hello, Worldみんな大好き! Hello, World
みんな大好き! Hello, WorldNaohiro Aota
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)Shin-ya Koga
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~Fujio Kojima
 

Similaire à Synthesijer and Synthesijer.Scala in HLS-friends 201512 (20)

C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
C#6.0の新機能紹介
C#6.0の新機能紹介C#6.0の新機能紹介
C#6.0の新機能紹介
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 
Moony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinalMoony li pacsec-1.5_j4-truefinal
Moony li pacsec-1.5_j4-truefinal
 
Guide for Swift and Viewer app
Guide for Swift and Viewer appGuide for Swift and Viewer app
Guide for Swift and Viewer app
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
Ll xcode
Ll xcodeLl xcode
Ll xcode
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けて
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generator
 
究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)
 
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
 
みんな大好き! Hello, World
みんな大好き! Hello, Worldみんな大好き! Hello, World
みんな大好き! Hello, World
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 

Plus de Takefumi MIYOSHI

Plus de Takefumi MIYOSHI (20)

ACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyoACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyo
 
DAS_202109
DAS_202109DAS_202109
DAS_202109
 
ACRiルーム1年間の活動と 新たな取り組み
ACRiルーム1年間の活動と 新たな取り組みACRiルーム1年間の活動と 新たな取り組み
ACRiルーム1年間の活動と 新たな取り組み
 
RISC-V introduction for SIG SDR in CQ 2019.07.29
RISC-V introduction for SIG SDR in CQ 2019.07.29RISC-V introduction for SIG SDR in CQ 2019.07.29
RISC-V introduction for SIG SDR in CQ 2019.07.29
 
Misc for edge_devices_with_fpga
Misc for edge_devices_with_fpgaMisc for edge_devices_with_fpga
Misc for edge_devices_with_fpga
 
Cq off 20190718
Cq off 20190718Cq off 20190718
Cq off 20190718
 
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
 
Reconf 201901
Reconf 201901Reconf 201901
Reconf 201901
 
Hls friends 201803.key
Hls friends 201803.keyHls friends 201803.key
Hls friends 201803.key
 
Abstracts of FPGA2017 papers (Temporary Version)
Abstracts of FPGA2017 papers (Temporary Version)Abstracts of FPGA2017 papers (Temporary Version)
Abstracts of FPGA2017 papers (Temporary Version)
 
Das 2015
Das 2015Das 2015
Das 2015
 
Microblaze loader
Microblaze loaderMicroblaze loader
Microblaze loader
 
Reconf 201506
Reconf 201506Reconf 201506
Reconf 201506
 
Synthesijer zynq qs_20150316
Synthesijer zynq qs_20150316Synthesijer zynq qs_20150316
Synthesijer zynq qs_20150316
 
Synthesijer fpgax 20150201
Synthesijer fpgax 20150201Synthesijer fpgax 20150201
Synthesijer fpgax 20150201
 
Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)
 
ICD/CPSY 201412
ICD/CPSY 201412ICD/CPSY 201412
ICD/CPSY 201412
 
Reconf_201409
Reconf_201409Reconf_201409
Reconf_201409
 
FPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみたFPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみた
 
Vyatta 201310
Vyatta 201310Vyatta 201310
Vyatta 201310
 

Synthesijer and Synthesijer.Scala in HLS-friends 201512