LoginSignup
19
21

More than 5 years have passed since last update.

Raspberry Piを使ってFPGAのリモートデバッグ環境を整える

Last updated at Posted at 2015-12-05

この記事は、Raspberry Pi Advent Calendar 2015慶應義塾大学SFC村井&徳田研 Advent Calendar 2015の5日目の記事です。


大学の研究室でFPGAを使った研究をしているのですが、FPGAの開発環境を持ち運ぶとなると、FPGA評価ボードとACアダプター、拡張カード、が必要で持ち運びにはとても不向きです。
更に、私はFPGAからHDMIの出力をしようとしていたので、FPGAから出力されるHDMI信号を受けるディスプレイと、開発をするのにLinuxの環境をPCに入れる必要があります。

それを解決するために、Raspberry Pi Model B+(以下、Raspberry Pi)を使ってFPGAのリモートデバッグ環境を整えた話をします。

FPGAが何をする装置かよくわからないよ!という方はArduinoと置き換えて貰えれば分かりやすいかと思います。(ハード的には全然異なりますが)

リモートデバッグ環境に必要な要件

  • FPGAの環境(評価ボード, 拡張カード)
  • FPGAにデータの書き込み、デバッグができる
  • HDMI出力が見れる
  • デバッグ用に任意のピンの出力や入力ができる

残念ながら、FPGAのデータの書き込みやコンパイルはRaspberry Piでは非力なので、別のPCで対応することにしました。

FPGAの環境(評価ボード, 拡張カード)

FPGAの環境はデスクに KC-705 と、FMC拡張ボードの XM-105 を2台ずつ設置しました。
(下に見切れているのがRaspberry Piです)

IMG_20151115_003255.jpg

HDMI出力を見る

これを実現するために、Raspberry Piに接続したWebカメラをストリーミング配信できる MJPEG-streamer というアプリケーションを使います。

MJPEG-streamer は、ビデオデバイスからキャプチャして、様々な形式で書き出すことができます。今回は output_http モジュールを使って、キャプチャをWeb上から見れるようにします。

インストールは以下のコマンドを実行します。

$ sudo apt-get install subversion libjpeg-dev imagemagick
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
$ cd mjpg-streamer/
$ make

実行するには以下のコマンドを実行します。
/dev/video0がビデオデバイスに当たるので、複数ある場合は適宜書き換えてください。

$ sudo ./mjpg_streamer -i "./input_uvc.so -f 10 -r 640x480 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080"

これで、8080ポートでWebサーバが起動します。ブラウザから開きます。

http://203.178.XXX.XXX:8080/

image

ストリーミングの方式にいろいろ有りますが JavascriptSimple だとよいです。

http://203.178.XXX.XXX:8080/javascript_simple.html

これを、Raspberry Piが再起動しても大丈夫なようにRaspberry Piの起動時に自動起動するようにします。起動スクリプトを書くのが面倒なため、少々強引ですが /etc/rc.local に直接コマンドを書いちゃいます。

/etc/rc.local
$ cd /home/pi/mjpg-streamer
$ ./mjpg_streamer -i "./input_uvc.so -f 10 -r 960x720 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080" &

あとは、カメラを三脚などに固定して、ディスプレイが見れるように設置します。

IMG_20151024_023748.jpg

これで、ディスプレイの出力がリモートからバッチリ見えます! ✌ ('ω') ✌

デバッグ用に任意のピンの出力や入力ができる

これを満たすのには Raspberry Pi のGPIOピンを使います。
幸い、Raspberry Pi のGPIOは 3.3V ということなので、FPGAボードと直接結んでも両者壊れる心配はありません。

Raspberry PiのGPIOピンとFPGAの拡張ボードをジャンパワイヤなどで結びます。
GPIOはコマンドをたていて見ることができますが、常にコマンドを叩いていては疲れるのと、変化が読み取りにくいため、whileコマンドを使うことにします。

以下の様なファイルを保存しておくと、呼び出すときに便利でした。

gpio_out.sh
while :
do
  echo DBG[2]=`gpio read 7` DBG[1]=`gpio read 9` DBG[0]=`gpio read 8`
done

上のスクリプトを実行すると、連続的にGPIOピンの入力が表示されます。

image

(番外) DHCPのIPアドレスを取得する

Raspberry Piは、ディスプレイ無しで使えて小型が売りです。しかし、DHCP環境の場合、ころころIPアドレスが変わってしまい、そのたびにHDMIを繋げてIPアドレスを確認するのは非常に大変です。

そこで、研究室の先輩に教えてもらったTIPSですが、Google Formsを作り、Raspberry PiからフォームにIPを書き込んでもらうという面白い方法を紹介します。


  1. まず Google ドライブ から、新しい Google フォーム を作成します。
  2. 質問として「質問の形式」を「テキスト」にした項目を1つ作ります。フォームのタイトルや質問のタイトルは任意です。
    image
  3. 「実際のフォームを表示」ボタンを押して、実際のフォームを開きます。
  4. 質問の項目の label タグの name 属性を調べます。(entry.XXXXXXXXXという形式のはず…)
  5. 以下のスクリプトを任意の場所に保存します。(ここでは /bin/notify_ip.sh)
    また、<Google フォームのURL><調べた name属性>を適宜書き換えます。
  6. /bin/notify_ip.sh
    #!/bin/bash
    
    HOST=`hostname`
    IP_CMD=`/sbin/ip addr show dev eth0 | /bin/grep 'inet '`
    
    MSG="${HOST}: ${IP_CMD}"
    
    curl <Google フォームのURL>/formResponse -d ifq -d <調べた name属性>="${MSG}" -d submit=Submit
    

  7. /bin/notify_ip.sh/etc/crontab/etc/rc.localに記述して起動時や定期的に実行するようにします。
  8. 実際に実行されると、IPアドレスがスプレッドシートに記載されます。
    image
  9. まとめ

    Raspberry Piは小型なのにWebカメラが扱えて、GPIOも扱えてFPGAのデバックには持って来い!というデバイスでした。

    実は「FPGAにデータの書き込み、デバッグができる」ですが、今回使っているXilinxのFPGA開発環境の場合、hw_serverというサーバを動かせばローカルでビルドした結果を、ネットワーク越しに書き込む事ができるので、そこも挑戦してみたかったです。

    まだ、Raspberry Piカレンダーは空きがあるっぽいので、続報が出たらまた紹介します。

19
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
21