SlideShare ist ein Scribd-Unternehmen logo
1 von 58
Downloaden Sie, um offline zu lesen
あいさつ
自己紹介!

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



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




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

Weitere ähnliche Inhalte

Was ist angesagt?

研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門ryos36
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cythonfuzzysphere
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cythonAtsuo Ishimoto
 
Polyphony IO まとめ
Polyphony IO まとめPolyphony IO まとめ
Polyphony IO まとめryos36
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelereaseShiqiao Du
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutinemelpon
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compilernothingcosmos
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめgion_XY
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)MITSUNARI Shigeo
 
Pythonを用いた高水準ハードウェア設計環境の検討
Pythonを用いた高水準ハードウェア設計環境の検討Pythonを用いた高水準ハードウェア設計環境の検討
Pythonを用いた高水準ハードウェア設計環境の検討Shinya Takamaeda-Y
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応marsee101
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出marsee101
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 

Was ist angesagt? (20)

20180728 halide-study
20180728 halide-study20180728 halide-study
20180728 halide-study
 
研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cython
 
Polyphony IO まとめ
Polyphony IO まとめPolyphony IO まとめ
Polyphony IO まとめ
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compiler
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめ
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
 
Pythonを用いた高水準ハードウェア設計環境の検討
Pythonを用いた高水準ハードウェア設計環境の検討Pythonを用いた高水準ハードウェア設計環境の検討
Pythonを用いた高水準ハードウェア設計環境の検討
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 
Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
コルーチンの使い方
コルーチンの使い方コルーチンの使い方
コルーチンの使い方
 

Ähnlich wie Python physicalcomputing

T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519Yasuhiro Ishii
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門Yosuke Onoue
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングKiwamu Okabe
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml ssuser3a4b8c
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementationsmasahitojp
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。Kazuki Onishi
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみるftnk
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23Masashi Shibata
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングComputational Materials Science Initiative
 
130710 02
130710 02130710 02
130710 02openrtm
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127Natsutani Minoru
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編Yosuke Onoue
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7Tetsuya Morimoto
 

Ähnlich wie Python physicalcomputing (20)

T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
 
130710 02
130710 02130710 02
130710 02
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
 

Kürzlich hochgeladen

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 

Kürzlich hochgeladen (9)

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 

Python physicalcomputing

  • 2. 自己紹介!  Twitter @nobonobo  メカトロソフト屋  PythonMatrixJp 運営の Pythonista  ” あ”のつく会社の大阪オフィスで働いている。  最近ホームページが出来ました! http://osaka.accense.com/
  • 3. Python を始めたきっかけ  8年前ロボットミドルウェア開発に携わった。  CORBA が使えるスクリプトが必要だった。  チャートからロボット動作の台本を作るツール。  → 近未来家庭のセットでロボットのお芝居を
  • 4. そのときの成果物は・・・  いろいろ発展して使われているみたいです。
  • 6. なぜ今ハードなのか?  最近ハードとソフトの融合が熱い!  光ったり動いたり音出たりって単純に楽しい!  新しいコミュニケーションの形が生まれるかも?
  • 7. マルチタッチの躍進  直感的な意志を機器に伝えられることができるよう になった!  GPS やコンパス、 加速度計を組合せて  セカイカメラ  TriSat
  • 8. Kinnect の可能性  すでに多くの応用ハックが!  人の人数、顔や骨の姿勢まで推定できる!  応用範囲が広すぎる!
  • 9. いまこそハード&ソフトだ!  どちらか一方では成熟してきていて、 なかなか地味な変化しか生まれない。  新しいなにかを求めるならハードとソフトの融合を。  ソフト屋さんはハードを学ぼう!  ハード屋さんはソフトを学ぼう!
  • 10. Python でハードに絡む  やり方は以下の3通り a)ハード自体は専用言語で開発。 PC とハードをつ ないで、 PC 上の Python から制御! b)マイコン上で Python を動かす! c)Python 記述をからハードそのものを作る!
  • 11. PC にハードをつなぐ  例えば・・・
  • 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 に頼らなくてもマルチタスクが実現できる。
  • 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ファイルという波形ログが保存される。
  • 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 の記述で 実現できる。(ナノ秒単位)
  • 56. まとめ全体  Python はハード屋の仕事に使えるモジュールがそ ろっている。  ハードとソフトの融合から新しい世界が開ける。  ソフト屋のみなさんハードにチャレンジしよう!