プロジェクトは踊る ~ ホストPCとの接続
評価ボード選択、というかFPGA将棋のシステム全体の設計上、 ホストPCとの接続方法は重要な要素の一つです。かれこれ1か月ほど検討しているのですが、なかなか「これだ!」という決定的な解が見つからず。また検討しているうちにいろんなことがわかってきて、ある方向で固まりかけてたかに見えたのが「いややっぱりこっちの方が…」となって180度転換、というのを何度となく繰り返してます。
シリアルかパラレルかUSBかEtherか、と考え、シリやパラはボードに端子ないなぁ、OpenCoresのUSBを今考えてます、だけどいくつか問題があって、と言ってたのが先週までのあらすじ。で、OpenCores USBのソース読みはじめたり、デバドラが必要になりそうなのでO'reilly HPからLinux Device Drivers をDLしてきて読みだしたり、といったことをしていたのですが。
でもどうもしっくり来なかったので、人に聞いてみようと思い、といっても聞くあてもないので2ちゃんねるのFPGAスレというのがあったのでそこで聞いてみました。すると10分もしないうちに「Opencoresなんかより普通にFT245とか使えば?」とのレス。
何を隠そうこっちはFT245って何かも知らなかったのですが、ググるとUSBのコントローラチップ。なるほど、FPGA内にコントローラ持つより、できあいのコントローラチップがFPGAの先にあればいいわけです。そういうボードないか探そう、いや、てより、USB端子のあるボードなら、もしかしてコントローラ付いてんじゃないの?と思い、Alteraの3C120Nボードのスケマ(回路図)を見てみると…しっかりありました、ずばりFT245BLが。
でさっそくFTDI社HPに行き、データシートをDL。FPGA側とのI/Fは超簡単の一言。これならI/Fのステートマシンも簡単にかけそうです。おまけにドライバも用意されてました。というか、キットにUSB Blasterのドライバが付いてくるので、それがFT245用のはずだし。
というわけで、Opencoresやデバドラの情報は一気に無駄になってしまいました。やれやれ、と思いつつもFT245の線をもっと詰めはじめました。FT245とI/FするFPGA側のステートマシンを書いてみたり。一方ボードの資料やスケマを詳細に読みだすと、気になる記述が。
- FT245はconfig専用のようにも読める?
実アプリでFPGAをUSBデバイスにする使い方は
できないかも?
- FT245の他にCypressのUSBチップも載ってる模様。
しかし、スケマにあるだけでdocには何も記述なし。
といった問題点が出てきて、代理店に問い合わせたのですが、1週間くらいたっても解決せず、不明のまま正月休みに突入。Cypressチップの方はまだ情報入手してないが、ピンからして一見してI/FはFT245とは違いそう。そうするとFT245 I/Fの設計はまた無駄になるし。
一方Etherの方も全く諦めたわけではなく、並行して調べてました。3C120NボードではMarvell 88E1111をPHYに使っている。これもspec未確認。
Etherの場合はハードでステートマシン作ってI/F、というのはさすがに無理で、FPGA上にCPUを持つ必要があります。で、NiosIIのチュートリアルを読み出す。…と、「あれ?」と思うことが。FT245経由(Alteraは"USB Blaster"と呼んでる)で、configの他に"JTAG UART"というのがあり、これでホストPC-FPGA間でシリアル通信できることを発見。
JTAGなんでいかにも遅そうですが、FPGA将棋での要求を考えるに、ま少なくともA級リーグ指し手1号の場合は、1手指すごとに数十ByteをホストPCからFPGAに送り、探索が終わるとやはり数十ByteをFPGAからホストPCに返す、という程度。これなら数十Byteがコンマ数秒程度で送れれば十分なのです。まあこれは単一プロセサの場合で、並列化時はもっと速度必要ですが、とりあえず来年5月向けにはこれで十分。
NiosIIではハード、ソフト共いろいろ環境が用意されてて、I/Fやプロトコル等ほとんど何も考えなくても、普通にCでプログラム書いてJTAG UARTをstdin/stdoutとして使えるようです。これは超楽。おまけに、試作のぶんには費用もかからず。
で、いったんは「これで決まりじゃん!」と安心してしまいました。ところが、まだまだ。プロジェクトは踊る。
更にNiosIIのことを調べ、専用のIDEのdocを読んでいくと。FPGAへのNiosII用ソフトのDL&実行はこのIDEから行います。で、stdin/stdoutはこのIDEのコンソールになる。当然ながら対局時は対局サーバと通信するプログラムがあるわけで、このプログラムがFPGAのstdin/outに読み書きできる必要があります。これがそのIDEでできるのか?パイプにredirect、とかできる?この点はまだ調べついてなく、次週持ち越しです。NiosII IDEはフリーでDLできるようなので、これからまたインストールして試してみる予定。(それを正月にやるのか、お前は?)
話は戻ってEtherの方ですが、USBに決定/Etherは当面捨てる、という方針でよいかを最終レビューしていた段階で、実はやはりEtherの方が優位、というケースが出てきてしまいました。それは、またも並列化時。
評価ボードへのconfig DL等の制御は、ボードとUSB接続したPC上のQuartusIIから行います。NiosIIがあるなら更にそのPC上でIDEも動かし、そこからソフトのDLや起動をします。複数ボード使うとき、QuartusIIやIDEを複数立ち上げるのか?接続先を複数のUSBケーブルから選べるのか?メモリ足りなくならない?
この辺がEtherなら、以下のような構成で問題なさそう。
config用PC -- FPGA --+
|
config用PC -- FPGA --+
|(Ether)
:
|
config用PC -- FPGA --+
|
探索マスターPC ------+
以上はチップ間並列の話ですが、チップ内並列のことも考えると。EtherというよりはCPUを持つ持たないの話ですが、FPGA1チップ内に探索コアを複数インスタンスすることを考えると、ハードのI/Fステートマシンをそのたび書き換えるのは面倒そうです。CPUを持ち、探索コアを増やす時は単にインスタンスを追加してバスにぶら下げ、ディスパッチはCPU上のソフトでやらせる、の方がずっと筋がよさそう。
というわけで、並列化まで見すえた最終形態としては「NiosII+Ether」が本命なのかな、と今のところ考えています。ただこれをやるとなると、OSやTCP/IPスタックも必要になり、かなり大きな話になってきます。来年5月に間に合うかというと甚だ疑問なので、理想形とスケジュールのトレードオフでどこを落とし所にするか、で悩んでいるところ。
ちなみに、Etherにするなら3C120Nボードで問題ないので、納期もあることだし年明けに発注してしまおうと考えています。謎電ブログでDigikeyというのを知りまして、当該ボードも在庫あるようなのでこっちにしようか、と思ってます。
OSやTCP/IPスタックの話もいろいろあるのですが、だいぶ長くなってきたのでまた今度。
最近のコメント