Androidとfpgaを高速fifo通信させちゃう

4,986 views

Published on

2012/5/19の関西FPGA・DE0勉強会での発表資料です

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
4,986
On SlideShare
0
From Embeds
0
Number of Embeds
40
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Androidとfpgaを高速fifo通信させちゃう

  1. 1. AndroidとFPGAを高速FIFO 通信させちゃう す~ @ksksue
  2. 2. 自己紹介• す~: @ksksue• 「つなげる」ことが今おもしろい• てことでFTDI大好きっこ• FPGA/Android/マイコンと手広くやっと ります
  3. 3. AndroidとFPGA• FPGA/マイコンのフロントエンドとして のAndroidこれまでJtagでキャラクタ表示か? リッチなUIライブラリLCDでドット絵書くか? LCD、タッチパネルがついてえ、LCD描画ライブラリが なんと3万円ポッキリ!ウン百万円!?
  4. 4. Androidとハードを繋げる 課題はインタフェース今Androidと繋げるならADK?FPGAとならMicrobridgeがあるって?なんでなじみのシリアル・SPI・I2C・パラレル通信がないのさ!?
  5. 5. その問題FTDIが解決します• USB to – シリアル(UART,RS232C) – SPI – I2C – Jtag FPGAと通信するなら –FIFO(パラレル) コレでしょう
  6. 6. Android to/from FPGA FIFO Asynchronous FIFO
  7. 7. 今日はいろいろ話題 つめこんでます話題• FPGA• Android• USBここようわからんって人はTwitter:@ksksueにメンション飛ばしてください。あとで答えますから。
  8. 8. Android to/from FPGA FIFOまずFPGAまわりの話から Asynchronous FIFO
  9. 9. 今のところのVerilogファイル群fpga/└DE0_TOP.v src/ TOPモジュールと ├ ftdi_fifo.v ソースコード ├ ftdi_fifo_rd.v ├ ftdi_fifo_wr.v ├ misc.v └ timescale.v sim/ ├ftdi_fifo/ │├ ftdi_fifo_tb.v あとは │└ ft245fifo_sim_model.v テストベクタと ├ftdi_fifo_rd/ シミュレーションモデル │ └ ftdi_fifo_rd_tb.v └ftdi_fifo_wr/ └ ftdi_fifo_wr_tb.v
  10. 10. FTDI Asynchronous FIFO Read TimingINOUTIN Write TimingINOUTOUT↑FPGA側から見たIN/OUT 引用:FT245R データシート
  11. 11. ライブパワーポインティング ftdi_fifo ステートマシン ftdi_fifo_rd ftdi_fifo_wr
  12. 12. ftdi_fifo_rd.vのインタフェースmodule ftdi_fifo_rd( // Connect to Inner Logic input iACT_RD_n, // Activate Read Sequence Signal Activate output oDONE_RD_n, // Done Read Sequence Signal Done でモジュールの動き output oREADY_RD_n, // READY Read Sequence Signal 管理します output [7:0] oRD_DATA, // Write Data // Connect to FTDI FIFO Module input iFIFO_RXF_n, // Read from FIFO output oFIFO_RD_n, // Read Enable ここはFIFO インタフェース input [7:0] iFIFO_DATA, // Read Data // Connect to System Signals input clk, // System Clock 50MHz(20ns) input rst // System Reset カンマ消しわすれるのがイヤだから固定clk,rstは ); 最後に書くっていういわゆる我流ってやつです
  13. 13. ftdi_fifo_wr.vもほぼ同じmodule ftdi_fifo_wr( // Connect to Inner Logic input iACT_WR_n, // Activate Write Sequence Signal output oDONE_WR_n, // Done Write Sequence Signal output oREADY_WR_n, // Ready Write Sequence Signal input [7:0] iWR_DATA, // Write Data output oFIFO_OE_n, // Output Enable for Bi-direction Bus // Connect to FTDI FIFO Module input iFIFO_TXE_n, // Write to FIFO output oFIFO_WR_n, // Write Enable output [7:0] oFIFO_DATA, // Write Data // Connect to System Signals input clk, // System Clock 50MHz(20ns) input rst // System Reset );
  14. 14. ftdi_fifo.vftdi_fifo.vはftdi_fifo_rdとwrをあやつるステートマシン INIT テスト回数のループ制御DONE LOOP 0x00~0xFF Verifyの VERIFY ループ制御 LOOP VERIFY DATA DATA WAIT
  15. 15. 余談• 自分は基本的に – 順序回路 – 組み合わせ回路 – ステートマシンでしか回路くめません。この3つしか使いません。ステートマシン設計がいつもアタマを悩ませます。
  16. 16. 余談:イラッとくるステートマシン1「その遷移パターンないから大丈夫です」 ステートマシン A D 依存 C B G E 依存 F 絶対にデッドロックおこさないんだな? おこさないよなっ!?
  17. 17. 余談:イラッとくるステートマシン1 AC B DG F E できることなら直したいっ
  18. 18. 余談:イラッとくるステートマシン2 「修正しました(横着しました) 」 ステートマシンalways@(posedge clk or negedge rst)begin if(!rst) begin a <= 1b0; b <= 1b0; state <= ST_IDLE; end else begin if(foo == 1’b1) begin a <= 1b0; えっ end case(state) ST_IDLE: begin a <= 1b1; b <= 1b1; … どんなステートマシンができるんだろ? end … (いまだによくわかっていない)
  19. 19. 余談終了
  20. 20. Android to/from FPGA FIFO Asynchronous FIFO 次はAndroidの話
  21. 21. Androidの話 • USB Host APIでUSBプログラミング おもしろい でもUSBと繋げるまでがめんどくさいデータ転送するために前処理で6種類のクラスを使う必要があるクラスの中にさらに何種類かメソッドがある
  22. 22. USBは前処理がいろいろあるんです1. USBはハブでいくつもデバイスをぶら下げ られるからまずデバイスを「検索」するこ とから始める。大抵VID、PIDで見つける。2. 物理的には1本しか繋げてなくても実は論 理的なバスが何本かある e.g.Kinectは4本 (Control,IR,RGB,Audio)ある3. 転送方法が4種類ある(コントロール転送、 バルク転送、インタラプト転送、アイソク ロナス転送)
  23. 23. ArduinoライクなFTDIドライバラッパー FTDriver• USBのめんどくさい処理をライブラリ化• 使うメソッドは4種類 – begin(9600) – end() – read(rbuf) – write(wbuf)
  24. 24. FTDriverでプログラミングFTSampleFIFO.java …public void onCreate(Bundle savedInstanceState) { … 1.インスタンス生成 mSerial = new FTDriver((UsbManager) getSystemService(Context.USB_SERVICE)); if(mSerial.begin(SERIAL_BAUDRATE)) { new Thread(mLoop).start(); } … 2.ポートのオープンと ボーレート設定} // end of onCreate… ※ボーレートはFIFOの場合関係ない
  25. 25. …private Runnable mLoop = new Runnable() {@Overridepublic void run() {int i;int len;byte[] rbuf = new byte[4096]; for(;;){//this is the main loop for transferring ////////////////////////////////////////////////////////// // Read and Display to Terminal //////////////////////////////////////////////////////// 3.データリード len = mSerial.read(rbuf); }}… そんなに難しくない、と思う
  26. 26. 突然ですが、まとめ• http://github.com/ksksue• 全部オープンソースです• 最後デモ• 今後、Synchronous FIFOとか• AvalonBus対応とか• Xilinx対応とか

×