マツド・サイエンス研究所

12 コア CPU を FPGA に

堅い話題が続いているので、ちょっと休憩。

雑誌の付録の FPGA で遊んで居る。

25万ゲートとは言え、オンチップでメモリーに使えるのは 24k バイトが上限なので、ワンチップ・マイコンとして使うなら、そんなに大規模ではない。小規模な組込み制御用のマイコンとして、適当なCPUコアを入れてリアルタイムOSをインストールできないか、調査し始めた。

調査を進めるうちに、疑問が芽生えて来た。

適当なCPUとリアルタイムOSが見つからなかった訳ではない。

「ワンチップ・マイコンとしてリアルタイムOSを走らすことに、FPGAの使い方として、何のメリットがあるというのか??」と

市販のワンチップ・マイコンに比べて、FPGAにCPUコアを入れることが有利な点は、インターフェース部分を自由に作り替えることは可能な事くらいだ。それ以外は、市販のワンチップ・マイコンの方が遥かに有利だ。数百円も出せば、H8 や SH-Tiny など、FPGA の何倍ものメモリー容量を持つワンチップ・マイコンが買えるし、それらでリアルタイムOSを使って居て、何の不便も無い。

もし、インターフェースを自由に作り替えたいなら、数百円のワンチップ・マイコンに、これまた数百円で買える数千ゲート級の CPLD を付けた方が大容量FPGAを使うより安くて早い。

FPGA でなければ、実現できないような事じゃなきゃ、試しても意味が無い。

そもそも、何故、リアルタイムOSを使うかと言うと、組み込み制御のマイコンの場合、いくつかの処理を組み合わせている場合が多いからだ。プログラミング・テクニックを駆使して、複数の処理を一つのタスク上で時分割に行うよりも、リアルタイムOS上で複数のタスクに各々の処理を任せた方が楽だ。

だが、本当に「複数の処理を行うには、リアルタイムOSでマルチタスクで行う」のがベストなんだろうか?

考えてみれば、大きな前提条件として「複数のCPUを組み合わせるのは難しい」があって始めて「リアルタイムOSがベスト」と言える。

もし、「必要なタスクの数だけCPUがある」のなら、リアルタイムOSは必要ないのかもしれない。

私自身のリアルタイムOSで作ったプログラムをみると、タスクの数は概ね6〜8個迄である。もちろん、大きなプログラムで、もっとタスクの数が必要になった時もあるが、それはむしろ例外的だ。大概の場合、10個程度のタスクが使えれば、それなりに使えそうだ。

市販のマイコン・チップは、当然のことながら、1つのチップで、1つのCPUコアしかもたない。最近では、SH などでもデュアルコアのチップが出始めたが、これは極めて例外的だし、それとて CPU コアの数は2個が上限だ。

今までは 10個のCPUが必要なら、10個のマイコン・チップを接続するしかなかった。これは大変な手間である。こんな手間をするくらいなら、リアルタイムOSの方が、ずっと楽だ。

だが、FPGA だと話は別だ。複数のCPUコアを一つのチップ上に入れることなど、造作もない。実際、25万ゲートのFPGAにZ80コンパチCPUを入れた時、半分も使って居なかったので、少なくとも2つの Z80 CPU をいれることは可能だろう。

もっとシンプルな CPU なら、もっと沢山の CPU が FPGA の中に入るかもしれない。

FPGA 上にマルチコアを入れ、各々のCPUコアに一つずつタスクを割り当てるなら、Z80 よりシンプルな機能の CPU で十分だろう。割り込みも必要ない。そもそもリアルタイムOSは使わないし、また、割り込みが必要なタスクには、それぞれ専用の CPU を割り当てるからだ。

ネットで調べた結果、XILINX が 公開している PicoBlaze と言う CPU が、コンパクトで良さそうだと判った。PicoBlaze は正確にはオープンソースでは無いのだが、無料で使えるので、CPU を何個 FPGA 上に作ってもロイヤリティーの問題は無い。ただ、PicoBlaze は割り込みの機能があるのだが、これは使わなければ良いだけの話だろう。

いろいろ試して、25万ゲートの FPGA に 12個の PicoBlaze CPU を乗せることに成功した。

それぞれの CPU 間は、メッセージ・キューやセマフォにあたる機能をハードウエア的に作って接続し、データの受け渡しや並行処理の同期を行っている。まだ、共有メモりにあたるものは実装していないが、作るのは難しくは無さそうである。

各 CPU は、PCCOMP と言う専用の C コンパイラでプログラミングした。実は、この C コンパイラの癖が強いのが、最も苦労したところだ。もっとも PicoBlaze と言う CPU 自体がプログラムエリアは 2k バイトと、それなりの容量なのに、リード・ライトできるデータエリアが僅か 64 バイトと極端に少ないので、あながちコンパイラの所為とも言い切れない。

とりあえず、12 個の CPU を1つの FPGA に乗せ、何とかデータの受け渡しや処理の同期を試したと言うのが本当のところで、まだまだ、複数 CPU による複数タスクの効果を確認したところまで達して居ない。

次の課題は、少なくともマルチ CPU ・マルチタスクの効果を確認できるような使い方を試す事だと思う。

ちゃんと実用になるためには、もう少しプログラミングしやすい CPU が欲しいところだ。コンパイラとして gcc が使え、メモリーは 2k バイトでも良いから、プログラム領域とデータ領域が共用できて欲しい。MIPS のようにメジャーな CPU のオープンソースの互換コアで、割り込み等は省略しても小さいサイズのものを探すべきなのかも知れない。

もっとも、理想的な CPU が見つかって、多数の CPU を FPGA に乗せることができても、何等かの理由で、リアルタイム OS の方が使い勝手が良いと言う結論になる可能性もある。

それを確かめるためにも、頭の中で考えるだけじゃなくて、実際に試してみなきゃいけないんだよねえ。

注意

ブログのコンテンツの内、「告知」など時期よって情報価値が無くなるのは除いてある。また、コンテンツに付いたコメントは書き込み者に著作権があるものと判断し、ここに持ってきていないので、コメントを見るときは、元々のブログコンテンツを参照してもらいたい。

その他、ブログ発表後、コメントなどの内容を反映するなど、内容を変更しているものもあるので、注意してほしい。