Fpgax 20130830

3,249 views

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,249
On SlideShare
0
From Embeds
0
Number of Embeds
1,962
Actions
Shares
0
Downloads
9
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Fpgax 20130830

  1. 1. JavaRockで BlokusDuoプレーヤを作る話 三好 健文 @miyox 株式会社イーツリーズ・ジャパン 1
  2. 2. いつもの,前置き
  3. 3. FPGAとは 3 論理回路・データパスを自由に作り込める クロックレベルの同期と並列性の活用 Field Programmable Gate Array HDLがドレスを着たお姫さまだとすると,コンパイル時 にエラーをしっかり検出してくれるが故にコンパイルを通 すのが困難な反面,コンパイルさえ通れば合成した回路が きちんと動作してくれるBluespecはパワフルなツンデレ 娘と筆者はイメージしています(図2).  Verilog HDLやVHDLを使った設計で, ― あぁ∼,数字って32ビットだった.うっかりキャスト されていたよ… ― テスト・ベンチのステート・マシンを書くのが面倒だな. ― モジュールのインスタンシーエーションで入出力ピン をつなぎ忘れていた という思いをしたことはありませんか?  単純な記述の羅列や細かいミスへの注力が続くと,本来 力を入れるべき,アーキテクチャの設計まで億劫になって しまいます.また,「コンパイル(論理合成)は通るのに, シミュレーションやFPGA上で動作させると,何かおか しい」という事態に頭を悩ませ,原因はうっかりミスだっ たということも一度や二度ではないと思います.  記述の手間がもっと省けて,コンパイル時に強力にエ ラー・チェックしてくれるHDL言語ないかなあ…という 要求に応えてくれるのがBluespec System Verilogです (図1).VHDLがまじめなキャリア・ウーマン,Verilog ▲ 図2 Bluespec System Verilogは ツ ンデレ娘 きっちりしていてキャリアも長いVHDL,あいま 新世代のESL合成ソリューション Bluespec System Verilogのすすめ  本章では,高位設計言語であるBluespec System Verilogを紹介する.こ の言語では,コンパイル時にしっかりエラー検出ができ,また,さまざまなライブ ラリも提供している.FPGAやASICが大規模化し複雑な回路を設計する機会が 増えてきた今,知っておくべき技術だろう. (編集部) 三好 健文 出典: CQ出版 Interface 2011年2月号より
  4. 4. FPGAの活用シーン 4 独自の回路を実現できるハードウェア 特定の処理を低消費電力で高性能処理 デバイスに近い処理を簡単に実現 自由なI/Oポートの定義 ASIC開発のプロトタイプとして 特定用途向け少数生産の製品として
  5. 5. 例) freeocean 5 最大スループット: 1Gbps 最大同時処理コネクション数: 50万 秒間同時接続数: 約2万HTTPリクエスト 最大消費電力: 300W以下 ハードウェアWebキャッシュサーバ
  6. 6. ここから,今日の本題
  7. 7. .java% Java % .vhdl% Java % / JavaRock% JVM% JavaRockやってます 7 JavaRockの目指すところ JavaプログラムをそのままHDLに変換→FPGA上のHWにする 追加構文,データ型は導入しない 記述に制限は加える HDLで書けることをJavaで書けるようにする ではない Javaで書けることを全部HDLにする ではない http://javarock.sourceforge.net/
  8. 8. FPGAの開発手法の主役 8 HDL(Hardware Description Language) によるRTL(Register Transfer Level)設計 + > a b x y f g h counter+1 clk
  9. 9. FPGA上のプログラミングとは 9 論理回路構成要素の演算内容を決める 論理回路構成要素同士をどう接続するかを決める cf. http://commons.wikimedia.org/wiki/File:Two_women_operating_ENIAC_(full_resolution).jpg
  10. 10. HDLによる設計のメリット/デメリット 10 ロジックを抽象化した式/構文で設計できる クロックレベルのデータ制御 細粒度の並列性の活用 状態 を自分で管理しなければいけない デバッグ/動作検証が難しい アルゴリズムを設計するには記述が煩雑 メリット デメリット
  11. 11. HDLによる設計のデメリットを克服する方法 11 FPGAとは別にプロセッサを持ってくる FPGAの中にプロセッサを作る より抽象度の高い設計をする FPGAを使うのをやめる 高位合成言語/処理系の活用
  12. 12. HDLによる設計のデメリットを克服する方法 12 FPGAとは別にプロセッサを持ってくる FPGAの中にプロセッサを作る より抽象度の高い設計をする FPGAを使うのをやめる 高位合成言語/処理系の活用 環境/ソース保守コストの増大
  13. 13. HDLによる設計のデメリットを克服する方法 13 FPGAとは別にプロセッサを持ってくる FPGAの中にプロセッサを作る より抽象度の高い設計をする FPGAを使うのをやめる 高位合成言語/処理系の活用
  14. 14. 高位合成言語/処理系に何を求めるか 記述コストの軽減 高い抽象度の表現方法を利用したい 言語習得のコストは低く抑えたい 動作検証/デバッグコストの軽減 短時間で動作を確認したい 見通しよく手軽なデバッグをしたい FPGAのパフォーマンスの活用 粗粒度,細粒度の並列性を活用したい IPコア,FPGA内蔵機能を活用したい 14
  15. 15. 沢山の高位合成言語/処理系 15 Vol. 29 No. 1 Feb. 2012 81 表 1 ベース言語別に分類した高位合成言語の例 ベースの言語 言語名 C BACH-C[5],Handel-C[6],DeepC Compiler[7],PICASSO[8],COBRA-ABS[9], DEFACTO Compiler[10],Streams-C[11],GARP C Compiler[12],SA-C[13], Impulse-C[14],SpecC[15],GorillaC[16] C++ SystemC[17],OCAPI[18],HP-Machine[19] Java Galadriel/Nenya[20],JHDL[21],Lime[22],MaxCompiler[23],Sea Cucumber[24], JavaRock[25] C# Kiwi[26] Python PHDL[27],MyHDL[28] Ruby RHDL[29] ML CAPH[30] Fortran DeepC Compiler[7],ROCCC[31],SRC-6[32] Haskell Lava[33], Bluespec System Verilog[34](BSV) Matlab MATCH[35],DEFACTO Compiler[10] た言語および言語処理系では,高水準言語の機能を 用いて記述された部分とハードウェア化の対象とな また,オブジェクト指向言語において,クラスのイ ンスタンスの動的な生成を実現するのは困難である.
  16. 16. 沢山の高位合成言語/処理系(設計方針別) 16 タイプ1: 既存の言語を活用したHDL(文法.型の導入) タイプ2: 既存の言語をそのままHWに タイプ3: 抽象度の高い新しいHDL コンパイラでがんばる FPGAをどう活用するか,が 洗練されていて素敵!! 型?型クラス? レジスタ? 高階関数 既存の言語に文法,型を導入 馴染みの文法でハードウェア記述ができる デバッグに時間がかかる(RTL/TLMでシミュレーション)
  17. 17. 沢山の高位合成言語/処理系(設計方針別) 17 タイプ1: 既存の言語を活用したHDL(文法.型の導入) タイプ2: 既存の言語をそのままHWに タイプ3: 抽象度の高い新しいHDL コンパイラでがんばる FPGAをどう活用するか,が 洗練されていて素敵!! 型?型クラス? レジスタ? 高階関数 既存の言語に文法,型を導入 馴染みの文法でハードウェア記述ができる デバッグに時間がかかる(RTL/TLMでシミュレーション)
  18. 18. 高位合成処理系 入力言語として見たJava 18 クラスによるオブジェクト指向設計          ←HWのモジュール設計との親和性が高そう Threadやwait-notify,synchronizedの仕組み        ←言語仕様内で並列性の記述ができそう 明示的なポインタを扱う必要がない         ←言語の想定するメモリ構造から自由になれそう 動的な振る舞いがたくさんある           ←HW化するのは厄介そう コンパイラでがんばれるか?
  19. 19. 第391回 PTT 2013. 6. 28 JavaRockの現状 JavaプログラムをそのままHW化する 追加構文,データ型は導入しない 記述に制限は加える(できないものはできない) プログラムカウンタをステートマシンに置換 基本1文1状態 ← 基本ブロック内の並列化くらい 制御構造に対応するステートマシンの入れ子 メソッド呼び出し相当のHDLコード生成 Threadによる並列処理記述 いくつかの都合の良いアノテーション 19
  20. 20. 今日のお品書き JavaRockってこんな感じ BlokusDuoプレーヤ作ってます(...のはず) 20
  21. 21. はじめてのJavaRock LEDをチカチカする シリアルでエコーバック ボタンを押したら何か(LED反転) 21
  22. 22. LEDチカチカ ゆっくり明るくして,ゆっくり暗くして 22 PERIOD時間かけてゆっくり明るくする: for i in 0..PERIOD-1  LEDを点灯する  (i * 単位時間) 待つ  LEDを消灯する  (PERIDO-i * 単位時間) 待つ } たとえば,↓な感じです.
  23. 23. Javaで書くと... 23 public class Firefly extends Thread{ public boolean flag = false; private final static int PERIOD = 500; private final static int SLEEP_WEIGHT = 256; private void sleep(int v){ for(int k = 0; k < (v * SLEEP_WEIGHT); k++){ ; } } public void run(){ while(true){ for(int i = 0; i < PERIOD; i++){ flag = true; sleep(i); flag = false; sleep(PERIOD-i); } for(int i = 0; i < PERIOD; i++){ flag = true; sleep(PERIOD-i); flag = false; sleep(i); } sleep(1); sleep(1); } } }
  24. 24. トップでインスタンス生成/実行 24 import net.wasamon.javarock.rt.*; @javarockhdl public class test{ private final Firefly obj0 = new Firefly(); private final echo obj1 = new echo(); private final MemoriedButton obj2 = new MemoriedButton(); public boolean flag; public boolean btn_out; @auto public void main(){ obj0.start(); obj1.start(); obj2.start(); while(true){ flag = obj0.flag; btn_out = obj2.flag; } } }
  25. 25. デモ
  26. 26. BlokusDuoプレーヤを作ろう!! 1∼5個の正方形によるコマを使う 2人のプレーヤが交互に打ち合う 打てる場所は 自分のコマと辺を共有しない 自分のコマと頂点を共有する 余った正方形数が多い方が負け いくつかボーナスポイントがある 26
  27. 27. 何が必要か 手をやりとするプロトコルのやりとり コンテストの場合UARTを使う 手のエンコード/デコード 間違ったところに置かない 勝てるようなところに置いていく 27
  28. 28. BlokusDuoプレーヤ 28 SimplePlayer BlokusBoard + init + setTurnCode + setOpponentMove + getFirstMoveCode + getNextMove + init + get(x, y) + byte getSym() + isValid(x, y, c, id, rot) + move(x, y, c, id, rot) board プレーヤとしての思考ルーチン 盤面の管理/合法手の判定 GameAgent プロトコル処理/手のやりとり player IO
  29. 29. すごーく単純な戦略の場合 29 private int getNextMove1(){ int code = 0; while(true){ if(nextId < 0){ break; } // もうコマが残ってないからあきらめ for(int i = 0; i < COLS; i++){ // 左の for(int j = 0; j < ROWS; j++){ // 一番上から for(int k = 0; k < 8; k++){ // コマを回転させつつ if(board.isValid(COLS - i - 1, ROWS - j - 1, myColor, nextId, k) == true){ // 置ける? // 置けるなら置いちゃう!! board.move(COLS - i - 1, ROWS - j - 1, myColor, nextId, k); // 自分の盤を更新 code = encode(COLS - i -1, ROWS - j - 1, nextId, k); // 相手に通知するため nextId = nextId - 1; // 次回は次のコマから return code; } } } } nextId = nextId - 1; // 今のコマは諦めて次のコマを試す. } return -1; }
  30. 30. JavaRockを使うメリット ややこしいコードはJavaの方が楽 SimplePlayer,BlokusBoardみたいなHWに 関係ないコードはSWとして実行可能 30 → SW上でアルゴリズムの素性を手軽にチェック → v.s HDLで 「いやX言語の方が」...もあるでしょうけど
  31. 31. デモ
  32. 32. 勘違いして欲しくないこと 32 JavaだけでFPGAが活用できるわけがないじゃない!! AXI Main Logic generated by JavaRock Main Logic generated by VHDL/Verilog Central Direct Memory Access Controller DDR3 PCIe Controller ロジック ロジック DMA DDR3 PCIe AXI VHDL/Verilogで書いたモジュールを埋め込み可能 JavaRockで書いたモジュールをVHDL/Verilogな モジュールにつなぐことも →私もそう思います...
  33. 33. まとめなど JavaRockの紹介をしました JavaRockでBlokusDuoプレーヤ作ってます アルゴリズムに手がまわってない 9/20が申し込み締め切り(ICFPT併設コンペ) http://javarock.sourceforge.net/ http://www.slideshare.net/miyox/ptt391 33 JavaRock関連URL http://lut.eee.u-ryukyu.ac.jp/dc13/index.html

×