KEMBAR78
Python physicalcomputing | PDF
あいさつ
自己紹介!

   Twitter @nobonobo
   メカトロソフト屋
   PythonMatrixJp 運営の Pythonista
   ” あ”のつく会社の大阪オフィスで働いている。
   最近ホームページが出来ました!
    http://osaka.accense.com/
Python を始めたきっかけ

   8年前ロボットミドルウェア開発に携わった。
   CORBA が使えるスクリプトが必要だった。
   チャートからロボット動作の台本を作るツール。
   → 近未来家庭のセットでロボットのお芝居を
そのときの成果物は・・・

   いろいろ発展して使われているみたいです。
Python で
フィジカルコンピューティング




 ハードに挑戦してみませんか?
なぜ今ハードなのか?

   最近ハードとソフトの融合が熱い!
   光ったり動いたり音出たりって単純に楽しい!
   新しいコミュニケーションの形が生まれるかも?
マルチタッチの躍進

   直感的な意志を機器に伝えられることができるよう
    になった!
   GPS やコンパス、
    加速度計を組合せて
       セカイカメラ
       TriSat
Kinnect の可能性

   すでに多くの応用ハックが!
   人の人数、顔や骨の姿勢まで推定できる!
   応用範囲が広すぎる!
いまこそハード&ソフトだ!

   どちらか一方では成熟してきていて、
    なかなか地味な変化しか生まれない。
   新しいなにかを求めるならハードとソフトの融合を。
   ソフト屋さんはハードを学ぼう!
   ハード屋さんはソフトを学ぼう!
Python でハードに絡む

   やり方は以下の3通り


a)ハード自体は専用言語で開発。 PC とハードをつ
 ないで、 PC 上の Python から制御!
b)マイコン上で Python を動かす!
c)Python 記述をからハードそのものを作る!
PC にハードをつなぐ

   例えば・・・
Python モジュールの充実ぶりは異常

   PySerial
   PyParallel
   PyVISA ( GPIB )
   PyUSB
   PyBluez ( Bluetooth )
   python-wifi ( WiFi )
   pypcap ( Ether )
   etc...
ぜひやってみてください

   楽しいですよ〜
b) 案について

   専用言語で開発したくない!
   マイコンソフト開発に Python 使えないの?
   Python で書きたいでござる!
   Python のノウハウを生かしたいでござる!
そこで python-on-a-chip ですよ

   特徴
       Python バイトコードが走る VM
       マイコン向けに省メモリデザイン
       ガベージコレクタ搭載
       ROM64KB 、 RAM8KB あれば十分
       すでに十数種のマイコンで動作実績あり
       PyCon2009 の PyMite-LT で作者登壇
       GPLv2
従来のマイコン開発

   組み込みの世界はプロプライエタリツールだらけ
   コンパイル、リンク、バイナリ作成、ダウンロード
   手順が複雑で初心者泣かせ。
   マイコンごとに機能の違いや記述スタイルに差
   アプリのダイナミックロードは基本できない
   常にリビルド&バイナリ作成&ダウンロードの手間
今回のやり方だとなにがいいの?

   Python でアプリを組める!
   バイトコードだけ入れ替えてアプリを更新できる
   メモリ管理しなくていい
   エラー処理がある
   VM ならではの機能が使える
サポート機能

   boolean
   Integer / [float] / tuple / list / dict
   function / module / class
   generator / decorator
   thread ( green-thread )
   対話型コンソール
残念ながらまだない

   Python コードコンパイラ
   足回りのモジュール
   初心者向けの環境
Python-on-a-chip の勘所

   実装コードの書き方
   バイトコード生成
   ユーザコードの配置戦略
   VM ポーティングのポイント
   実際のアプリコード紹介
実装コードの書き方

   書き方は3種類
       C 記述で機能実装
       Pure-python で機能実装
       Python 記述内に埋め込み C 記述
バイトコードの生成

   pyImgCreator.py というユーティリティを使う


                                       ByteCode
    Python 記述
     Python 記述
       Python 記述     py ImgCreator
                                        C ソース
                                      (埋め込まれた
                                     C コードがあれば)



   もし C ソースが生成されたら必ず VM と一緒にリン
    クする必要がある。
ユーザーコードの配置

   ユーザコードをどの段階で VM に渡すか?

                        ユーザコードから
     ByteCode                                      C ランタイム
                        生成した C ソース

                ユーザの C ソース            VM の C ソース




                         ビルド&リンク


                             バイナリ


     マイコン                Flash ライター
VM ポーティングのポイント

   6つのハンドラを実装するだけ
       plat_init()   初期化や準備
       plat_memGetByte()   バイトコード取得
       plat_getByte()
       plat_putByte()
       plat_getMsTicks() 起動後経過時間取得
       plat_reportError() エラーハンドラ
実際のアプリコード

      メモリの読み書き API
def mem_read(addr):                                       def mem_write(addr, value):
  """__NATIVE__                                             """__NATIVE__
      pPmObj_t offset;                                          pPmObj_t offset;
      PmReturn_t retval = PM_RET_OK;                            pPmObj_t value;
      pPmObj_t result;                                          PmReturn_t retval = PM_RET_OK;
      unsigned long *ptr;                                       unsigned long *ptr;
      if (NATIVE_GET_NUM_ARGS() != 1) {                         if (NATIVE_GET_NUM_ARGS() != 2){
          PM_RAISE(retval, PM_RET_EX_TYPE);                         PM_RAISE(retval, PM_RET_EX_TYPE);
          return retval;}                                           return retval;}
      offset = NATIVE_GET_LOCAL(0);                             offset = NATIVE_GET_LOCAL(0);
      if (OBJ_GET_TYPE(offset) != OBJ_TYPE_INT) {               if (OBJ_GET_TYPE(offset) != OBJ_TYPE_INT) {
          PM_RAISE(retval, PM_RET_EX_TYPE);                         PM_RAISE(retval, PM_RET_EX_TYPE);
          return retval;}                                           return retval;}
      ptr = (unsigned long *)(((pPmInt_t)offset)->val);         value = NATIVE_GET_LOCAL(1);
      retval = int_new(*ptr, &result);                          if (OBJ_GET_TYPE(value) != OBJ_TYPE_INT) {
      NATIVE_SET_TOS(result);                                       PM_RAISE(retval, PM_RET_EX_TYPE);
      return retval;                                                return retval;}
  """                                                           ptr = (unsigned long *)(((pPmInt_t)offset)->val);
  pass                                                          *ptr = ((pPmInt_t)value)->val;
                                                                return retval;
                                                            """
                                                            pass
実際のアプリコード

   ColorLED クラス
    class ColorLed(object):
       def __init__(self):
           レジスタ初期設定
       def set(self, r,g,b):
           R,G,B 出力設定
PWM による電力制御

   パルス幅で電力出力を可変させる手法。
   最近のマイコンはたいがいこの機能を持っている。
のこぎり波ジェネレータ

   Python の記述でそのまんま
     def gen(start):
       phase = start
       while 1:
          phase += 1
          phase &= 511
          val = abs(phase-256)
          if val<0:
              val = 0
          if val>255:
              val = 255
          yield val
動作デモ

   R と G と B でノコギリ波の初期値を 1/3 づつずらし
    てジェネレータを初期化。
   あとは延々と RGB を出力してる。
    def main():
      cled = ColorLed()
      r = gen(0)
      g = gen(512/3)
      b = gen(512*2/3)
      while 1:
         cled.set(r.next(),g.next(),b.next())
         sys.wait(1)
できたらいいなぁ

   バイトコード生成が Python で出来ちゃうので。
   AppEngine 上に開発環境構築できないか?
   あとは足回りをしっかり揃えることで面白くなる。
python-on-a-chip まとめ

   組み込みノウハウに詳しい人とそうでない人が分
    業するのに使える。
   苦労する部分を解決してしまえば、マイコン応用ア
    プリがガンガン量産できる。
   OS に頼らなくてもマルチタスクが実現できる。
質問
余談1:最近のハードウェア事情
●   プログラマブルなハードデバイス
●   さらっと紹介
FPGA/PLD

●   コンフィグメモリを持ち
●
    その内容により動作ロジックをカスタマイズ可能
●
    ソフトの柔軟性を兼ね備えたハード
ASIC

●   一般に売られる「役割の決まった半導体」の製法
●
    消費電力が少ない
●
    作ってもらうのに大金と期間が必要
●   FPGA で試作して ASIC で量産という流れが多い
研究・試作分野での FPGA

●   初期費用が少なくて済む
●
    画像処理やリアルタイム処理など
●
    10 GbE や100 GbE のファイヤーウォール
●   ナノ秒オーダーでのスケジューリングが動く
方式の比較

            変更の容易さ   消費電力


ソフトウェア
( DSP など)     ◎      高い

 FPGA/PLD     ○      程々

   ASIC       ×      低い
リアルの課題

●   現実の状況をより正確に把握するのは難しい!
●
    人、車の動きを捉えること。
●
    それもより現実的なスピードで!
●   (人が通り過ぎたあとで人が通った事を知れても
    役に立たない)
c) 案について

   もっとハードならではという事が色々できないの?
   リアルタイムに大量のデータを処理するとかできん
    の?
   ハードは並列処理が得意なんだからそれを生かせ
    ないの?
そこで MyHDL ですよ!

   特徴
       Python2HDL トランスレータ
       ジェネレータを使った並列ロジック設計及びシミュレー
        ション
       波形データの出力機能
       他のオープンソースシミュレータとの連携
       活発な開発
       昨年末に0.7リリース
       LGPL
要するに

   Python で FPGA/PLD の開発ができるよ!
   予算があれば ASIC も!
   というプロジェクトです。
MyHDL による FPGA 開発手順

   Python コードによる機能モデル作成
   動確用シミュレーションモデル作成
   シミュレーション結果の検証
   HDL へのトランスレート
   論理合成
余談2:ハード屋の常識

●   モックモデルの重視
●
    ユニットテストの重視
●
    DbC ( DesignByContract )的な考えを重視
●   つまり、実装コードよりもテストコードやモックコー
    ドや制約ルールの方をたくさん書く事になる
ソフト業界で重視の間違いじゃね?

●   手戻りが許されにくい風潮もあってハード屋さんの
    方が先にすんなり受け入れられた。
●   ソフト屋さんは手直しすればよかったこともあって
    導入が遅れたのかも?
MyHDL の基本デコレータ

   @always_comb
    常に従う振る舞いを記述するのに使う
    HDL に変換可能
   @always
    特定タイミングの振る舞いを記述するのに使う
    HDL に変換可能
   @instance
    シミュレーション用シナリオを記述するのに使う
    HDL には変換できない
実際のコード

   Python コード
     from myhdl import *

     LED_NUM = 24

     def driver(clock, sin, latch, led):
       shift_latch = Signal(intbv(0)[LED_NUM*3:])
       output_latch = Signal(intbv(0)[LED_NUM*3:])
       @always_comb
       def combination():
          led.next = output_latch
       @always(clock.posedge)
       def main_proc():
          shift_latch.next = concat(shift_latch[LED_NUM*3-1:0], sin)
       @always(latch.posedge)
       def latch_proc():
          output_latch.next = shift_latch
       return instances()
実際のコード

   トランスレート後 verilog コード
       `timescale 1ns/10ps
       module driver (clock, sin, latch, led);

       input clock; input sin; input latch;
       output [71:0] led; wire [71:0] led;
       reg [71:0] shift_latch; reg [71:0] output_latch;

       assign led = output_latch;

       always @(posedge latch) begin: DRIVER_LATCH_PROC
         output_latch <= shift_latch;
       end

       always @(posedge clock) begin: DRIVER_MAIN_PROC
         shift_latch <= {shift_latch[((24 * 3) - 1)-1:0], sin};
       end

       endmodule
実際のコード

   シミュレーション記述
    from myhdl import *
    Import logic1

    def test_logic1():
      clock = Signal(bool(False))
      a = Signal(bool(False))
      b = Signal(bool(False))
      y = Signal(bool(False))
      log1 = logic1.Logic1(clock, a, b, y)
      @always(delay(50))
      def clock_gen():
          clock.next = not clock
      @instance
      def sequence1():
          a.next = 1
          b.next = 0
          yeild clock.posedge

      return instances()
テストの実行

テストを実行する Python コード
tb_fsm = traceSignals(test_logic1)
sim = Simulation(tb_fsm)
sim.run()
これで、vcdファイルという波形ログが保存される。
テスト結果波形

vcdファイルは gtkview というツールで見れる。
最後はベンダーツールで

   HDL ( verilog や VHDL )にトランスレートしたら、
       フィッティング
       ポストフィットシミュレーション
       ビットストリーム生成
       コンフィギュレーションメモリの更新
   という流れは FPGA ベンダツールで
実演

   ドラム型 LED ディスプレイの動画紹介
参考情報

   http://python.matrix.jp/modules/myhdl.html
   http://opencores.org/ HDL のオープンソースサイ
    ト
   rpexzeros Python プロセッサを作ろうとしていた。
    (無茶しやがって・・・。)
   myhdl-doc-jp ドキュメント翻訳プロジェクト
MyHDL まとめ

   opencores にも MyHDL を使ったプロジェクトがち
    らほら
   MyHDL はベンダーロックインすることなくモデルを
    みんなで共有できる。
   シビアなスケジュールでの動きを Python の記述で
    実現できる。(ナノ秒単位)
質問
まとめ全体

   Python はハード屋の仕事に使えるモジュールがそ
    ろっている。
   ハードとソフトの融合から新しい世界が開ける。
   ソフト屋のみなさんハードにチャレンジしよう!
おまけ



ハードの事始めには是非
弊社グループ企業運営の
はんだづけカフェ
 にお越しください。
おしまい




ご静聴ありがとうございました

Python physicalcomputing

  • 1.
  • 2.
    自己紹介!  Twitter @nobonobo  メカトロソフト屋  PythonMatrixJp 運営の Pythonista  ” あ”のつく会社の大阪オフィスで働いている。  最近ホームページが出来ました! http://osaka.accense.com/
  • 3.
    Python を始めたきっかけ  8年前ロボットミドルウェア開発に携わった。  CORBA が使えるスクリプトが必要だった。  チャートからロボット動作の台本を作るツール。  → 近未来家庭のセットでロボットのお芝居を
  • 4.
    そのときの成果物は・・・  いろいろ発展して使われているみたいです。
  • 5.
  • 6.
    なぜ今ハードなのか?  最近ハードとソフトの融合が熱い!  光ったり動いたり音出たりって単純に楽しい!  新しいコミュニケーションの形が生まれるかも?
  • 7.
    マルチタッチの躍進  直感的な意志を機器に伝えられることができるよう になった!  GPS やコンパス、 加速度計を組合せて  セカイカメラ  TriSat
  • 8.
    Kinnect の可能性  すでに多くの応用ハックが!  人の人数、顔や骨の姿勢まで推定できる!  応用範囲が広すぎる!
  • 9.
    いまこそハード&ソフトだ!  どちらか一方では成熟してきていて、 なかなか地味な変化しか生まれない。  新しいなにかを求めるならハードとソフトの融合を。  ソフト屋さんはハードを学ぼう!  ハード屋さんはソフトを学ぼう!
  • 10.
    Python でハードに絡む  やり方は以下の3通り a)ハード自体は専用言語で開発。 PC とハードをつ ないで、 PC 上の Python から制御! b)マイコン上で Python を動かす! c)Python 記述をからハードそのものを作る!
  • 11.
  • 12.
    Python モジュールの充実ぶりは異常  PySerial  PyParallel  PyVISA ( GPIB )  PyUSB  PyBluez ( Bluetooth )  python-wifi ( WiFi )  pypcap ( Ether )  etc...
  • 13.
  • 14.
    b) 案について  専用言語で開発したくない!  マイコンソフト開発に Python 使えないの?  Python で書きたいでござる!  Python のノウハウを生かしたいでござる!
  • 15.
    そこで python-on-a-chip ですよ  特徴  Python バイトコードが走る VM  マイコン向けに省メモリデザイン  ガベージコレクタ搭載  ROM64KB 、 RAM8KB あれば十分  すでに十数種のマイコンで動作実績あり  PyCon2009 の PyMite-LT で作者登壇  GPLv2
  • 16.
    従来のマイコン開発  組み込みの世界はプロプライエタリツールだらけ  コンパイル、リンク、バイナリ作成、ダウンロード  手順が複雑で初心者泣かせ。  マイコンごとに機能の違いや記述スタイルに差  アプリのダイナミックロードは基本できない  常にリビルド&バイナリ作成&ダウンロードの手間
  • 17.
    今回のやり方だとなにがいいの?  Python でアプリを組める!  バイトコードだけ入れ替えてアプリを更新できる  メモリ管理しなくていい  エラー処理がある  VM ならではの機能が使える
  • 18.
    サポート機能  boolean  Integer / [float] / tuple / list / dict  function / module / class  generator / decorator  thread ( green-thread )  対話型コンソール
  • 19.
    残念ながらまだない  Python コードコンパイラ  足回りのモジュール  初心者向けの環境
  • 20.
    Python-on-a-chip の勘所  実装コードの書き方  バイトコード生成  ユーザコードの配置戦略  VM ポーティングのポイント  実際のアプリコード紹介
  • 21.
    実装コードの書き方  書き方は3種類  C 記述で機能実装  Pure-python で機能実装  Python 記述内に埋め込み C 記述
  • 22.
    バイトコードの生成  pyImgCreator.py というユーティリティを使う ByteCode Python 記述 Python 記述 Python 記述 py ImgCreator C ソース (埋め込まれた C コードがあれば)  もし C ソースが生成されたら必ず VM と一緒にリン クする必要がある。
  • 23.
    ユーザーコードの配置  ユーザコードをどの段階で VM に渡すか? ユーザコードから ByteCode C ランタイム 生成した C ソース ユーザの C ソース VM の C ソース ビルド&リンク バイナリ マイコン Flash ライター
  • 24.
    VM ポーティングのポイント  6つのハンドラを実装するだけ  plat_init() 初期化や準備  plat_memGetByte() バイトコード取得  plat_getByte()  plat_putByte()  plat_getMsTicks() 起動後経過時間取得  plat_reportError() エラーハンドラ
  • 25.
    実際のアプリコード  メモリの読み書き API def mem_read(addr): def mem_write(addr, value): """__NATIVE__ """__NATIVE__ pPmObj_t offset; pPmObj_t offset; PmReturn_t retval = PM_RET_OK; pPmObj_t value; pPmObj_t result; PmReturn_t retval = PM_RET_OK; unsigned long *ptr; unsigned long *ptr; if (NATIVE_GET_NUM_ARGS() != 1) { if (NATIVE_GET_NUM_ARGS() != 2){ PM_RAISE(retval, PM_RET_EX_TYPE); PM_RAISE(retval, PM_RET_EX_TYPE); return retval;} return retval;} offset = NATIVE_GET_LOCAL(0); offset = NATIVE_GET_LOCAL(0); if (OBJ_GET_TYPE(offset) != OBJ_TYPE_INT) { if (OBJ_GET_TYPE(offset) != OBJ_TYPE_INT) { PM_RAISE(retval, PM_RET_EX_TYPE); PM_RAISE(retval, PM_RET_EX_TYPE); return retval;} return retval;} ptr = (unsigned long *)(((pPmInt_t)offset)->val); value = NATIVE_GET_LOCAL(1); retval = int_new(*ptr, &result); if (OBJ_GET_TYPE(value) != OBJ_TYPE_INT) { NATIVE_SET_TOS(result); PM_RAISE(retval, PM_RET_EX_TYPE); return retval; return retval;} """ ptr = (unsigned long *)(((pPmInt_t)offset)->val); pass *ptr = ((pPmInt_t)value)->val; return retval; """ pass
  • 26.
    実際のアプリコード  ColorLED クラス class ColorLed(object): def __init__(self): レジスタ初期設定 def set(self, r,g,b): R,G,B 出力設定
  • 27.
    PWM による電力制御  パルス幅で電力出力を可変させる手法。  最近のマイコンはたいがいこの機能を持っている。
  • 28.
    のこぎり波ジェネレータ  Python の記述でそのまんま def gen(start): phase = start while 1: phase += 1 phase &= 511 val = abs(phase-256) if val<0: val = 0 if val>255: val = 255 yield val
  • 29.
    動作デモ  R と G と B でノコギリ波の初期値を 1/3 づつずらし てジェネレータを初期化。  あとは延々と RGB を出力してる。 def main(): cled = ColorLed() r = gen(0) g = gen(512/3) b = gen(512*2/3) while 1: cled.set(r.next(),g.next(),b.next()) sys.wait(1)
  • 30.
    できたらいいなぁ  バイトコード生成が Python で出来ちゃうので。  AppEngine 上に開発環境構築できないか?  あとは足回りをしっかり揃えることで面白くなる。
  • 31.
    python-on-a-chip まとめ  組み込みノウハウに詳しい人とそうでない人が分 業するのに使える。  苦労する部分を解決してしまえば、マイコン応用ア プリがガンガン量産できる。  OS に頼らなくてもマルチタスクが実現できる。
  • 32.
  • 33.
    余談1:最近のハードウェア事情 ● プログラマブルなハードデバイス ● さらっと紹介
  • 34.
    FPGA/PLD ● コンフィグメモリを持ち ● その内容により動作ロジックをカスタマイズ可能 ● ソフトの柔軟性を兼ね備えたハード
  • 35.
    ASIC ● 一般に売られる「役割の決まった半導体」の製法 ● 消費電力が少ない ● 作ってもらうのに大金と期間が必要 ● FPGA で試作して ASIC で量産という流れが多い
  • 36.
    研究・試作分野での FPGA ● 初期費用が少なくて済む ● 画像処理やリアルタイム処理など ● 10 GbE や100 GbE のファイヤーウォール ● ナノ秒オーダーでのスケジューリングが動く
  • 37.
    方式の比較 変更の容易さ 消費電力 ソフトウェア ( DSP など) ◎ 高い FPGA/PLD ○ 程々 ASIC × 低い
  • 38.
    リアルの課題 ● 現実の状況をより正確に把握するのは難しい! ● 人、車の動きを捉えること。 ● それもより現実的なスピードで! ● (人が通り過ぎたあとで人が通った事を知れても 役に立たない)
  • 39.
    c) 案について  もっとハードならではという事が色々できないの?  リアルタイムに大量のデータを処理するとかできん の?  ハードは並列処理が得意なんだからそれを生かせ ないの?
  • 40.
    そこで MyHDL ですよ!  特徴  Python2HDL トランスレータ  ジェネレータを使った並列ロジック設計及びシミュレー ション  波形データの出力機能  他のオープンソースシミュレータとの連携  活発な開発  昨年末に0.7リリース  LGPL
  • 41.
    要するに  Python で FPGA/PLD の開発ができるよ!  予算があれば ASIC も!  というプロジェクトです。
  • 42.
    MyHDL による FPGA開発手順  Python コードによる機能モデル作成  動確用シミュレーションモデル作成  シミュレーション結果の検証  HDL へのトランスレート  論理合成
  • 43.
    余談2:ハード屋の常識 ● モックモデルの重視 ● ユニットテストの重視 ● DbC ( DesignByContract )的な考えを重視 ● つまり、実装コードよりもテストコードやモックコー ドや制約ルールの方をたくさん書く事になる
  • 44.
    ソフト業界で重視の間違いじゃね? ● 手戻りが許されにくい風潮もあってハード屋さんの 方が先にすんなり受け入れられた。 ● ソフト屋さんは手直しすればよかったこともあって 導入が遅れたのかも?
  • 45.
    MyHDL の基本デコレータ  @always_comb 常に従う振る舞いを記述するのに使う HDL に変換可能  @always 特定タイミングの振る舞いを記述するのに使う HDL に変換可能  @instance シミュレーション用シナリオを記述するのに使う HDL には変換できない
  • 46.
    実際のコード  Python コード from myhdl import * LED_NUM = 24 def driver(clock, sin, latch, led): shift_latch = Signal(intbv(0)[LED_NUM*3:]) output_latch = Signal(intbv(0)[LED_NUM*3:]) @always_comb def combination(): led.next = output_latch @always(clock.posedge) def main_proc(): shift_latch.next = concat(shift_latch[LED_NUM*3-1:0], sin) @always(latch.posedge) def latch_proc(): output_latch.next = shift_latch return instances()
  • 47.
    実際のコード  トランスレート後 verilog コード `timescale 1ns/10ps module driver (clock, sin, latch, led); input clock; input sin; input latch; output [71:0] led; wire [71:0] led; reg [71:0] shift_latch; reg [71:0] output_latch; assign led = output_latch; always @(posedge latch) begin: DRIVER_LATCH_PROC output_latch <= shift_latch; end always @(posedge clock) begin: DRIVER_MAIN_PROC shift_latch <= {shift_latch[((24 * 3) - 1)-1:0], sin}; end endmodule
  • 48.
    実際のコード  シミュレーション記述 from myhdl import * Import logic1 def test_logic1(): clock = Signal(bool(False)) a = Signal(bool(False)) b = Signal(bool(False)) y = Signal(bool(False)) log1 = logic1.Logic1(clock, a, b, y) @always(delay(50)) def clock_gen(): clock.next = not clock @instance def sequence1(): a.next = 1 b.next = 0 yeild clock.posedge return instances()
  • 49.
    テストの実行 テストを実行する Python コード tb_fsm= traceSignals(test_logic1) sim = Simulation(tb_fsm) sim.run() これで、vcdファイルという波形ログが保存される。
  • 50.
  • 51.
    最後はベンダーツールで  HDL ( verilog や VHDL )にトランスレートしたら、  フィッティング  ポストフィットシミュレーション  ビットストリーム生成  コンフィギュレーションメモリの更新  という流れは FPGA ベンダツールで
  • 52.
    実演  ドラム型 LED ディスプレイの動画紹介
  • 53.
    参考情報  http://python.matrix.jp/modules/myhdl.html  http://opencores.org/ HDL のオープンソースサイ ト  rpexzeros Python プロセッサを作ろうとしていた。 (無茶しやがって・・・。)  myhdl-doc-jp ドキュメント翻訳プロジェクト
  • 54.
    MyHDL まとめ  opencores にも MyHDL を使ったプロジェクトがち らほら  MyHDL はベンダーロックインすることなくモデルを みんなで共有できる。  シビアなスケジュールでの動きを Python の記述で 実現できる。(ナノ秒単位)
  • 55.
  • 56.
    まとめ全体  Python はハード屋の仕事に使えるモジュールがそ ろっている。  ハードとソフトの融合から新しい世界が開ける。  ソフト屋のみなさんハードにチャレンジしよう!
  • 57.
  • 58.