MinecraftでFPGA

この記事は KMC Advent Calendar 2017 - Adventar の17日目の記事です。

昨日の記事はCHY72さんの競プロに疲れた人のNim言語 - (/^^)/⌒●~*$ a(){ a|a& };a です。Nimいいですね、いいです、すごくいいです。

はじめに

今日の記事を担当します📛(KMC_id:kazakami)です。1回生です。(学部1回とは言ってない)

最近後輩がサーバ管理の練習のためにマイクラサーバ建てたりしたこともあってマイクラ熱が再び湧いてきてます。マインクラフトではいろいろな人が色々なものを作っていますが、「minecraft FPGA」でググってもそれらしきものが出てこなかったので新規性チャンスと思いやってみました。

 

FPGA

FPGA(field-programmable gate array)とは動的に回路の構成を変更可能な回路の一種です。典型的なFPGAは再設定可能な論理セルと再設定可能な配線セルから構成されています。詳しくはググってください。

 

Minecraft

知っている人が多いと思いますが、Minecraftとはブロックを設置・撤去して地形破壊したり建物立てたりできるゲームです。このMinecraftには”レッドストーン”という要素があります。レッドストーンを並べて作った配線はスイッチやボタン等で活性化することができ、これによって扉の開閉を行ったりピストンを動かしたりできるようになってます。レッドストーンはいい感じに組み合わせることでNOT回路やOR回路を作ることができます。つまりチューリング完全です。

 

レッドストーン回路

レッドストーンの配線はスイッチによって活性化されます。

f:id:hiroshi-matsuoka-2125:20171216193025p:plain

ただしこれは距離の制限があり15ブロックまで活性化しません。

f:id:hiroshi-matsuoka-2125:20171216193745p:plain

この画像を見ると上の方では赤く光っていません

 

f:id:hiroshi-matsuoka-2125:20171216194041p:plain

そこで15ブロックより遠くまで信号を伝達するためにリピータと呼ばれるブロックを挟むことになります。実はこれがかなり厄介で、信号の伝達遅延はかなり大きくなり、また信号を片方向にしか伝達できなくなります。

 

取敢えず作ってみる

小さな構成で作ってみます。

f:id:hiroshi-matsuoka-2125:20171216220756p:plain

 ■が論理セル・〇が配線セルで、このように論理セル4個とその周りを囲む21個の配線セルからなる設計とします。この規模だとかなり小さな回路しか構成できませんが、まぁ動けばいいんです。

論理セル

 

f:id:hiroshi-matsuoka-2125:20171216220808p:plain

論理セルはこのように3-bit LUTを1つだけ含むような構成とします。

f:id:hiroshi-matsuoka-2125:20171216224311p:plain

マイクラで実装するとこのようになります。白羊毛部分がデコーダで黒羊毛部分がメモリとなっています。黒羊毛上のスイッチで0と1を指定します。

配線セル

f:id:hiroshi-matsuoka-2125:20171216220759p:plain

配線セルはこのような構成となります。先述の通りレッドストーンの配線は片方向にしか信号を伝達できないので入力同士・出力同士をつなぐスイッチがありません。

f:id:hiroshi-matsuoka-2125:20171216225436p:plain

シアンの羊毛上にスイッチが置かれています。

 

全体の実装と動作テスト

実装した論理セル配線セルをシュッとコピーして並べて完成です。

f:id:hiroshi-matsuoka-2125:20171216230419p:plain

並べるとかなり論理回路っぽく見えますね。

折角作ったのでこのFPGA上に回路を構成しましょう。今回は試しにSRラッチ回路を構成します。LUTを1個使いNORを表現するので、LUTを2個も使った贅沢なラッチ回路になります。

 

 

f:id:kazakami_9:20171216234640p:plain

 右側のスイッチがSet入力、左側のスイッチがReset入力、真ん中が出力となっています。

f:id:kazakami_9:20171216234815p:plain

Set信号を入力をオンにすると出力もオンになります。

f:id:kazakami_9:20171216235112p:plain

 Set信号をオフにしても出力はオンで維持されます。

f:id:kazakami_9:20171216235150p:plain

Reset信号をオンにすると出力はオフになります。

ラッチ回路が構成できました!!!

改善案

今回作った回路は5×5の25個のセルを並べておきながら論理セルが4個しかないため大した回路が作れませんでした。配線セルの信号伝達遅延もかなり大きいことから、ただ信号を伝達するだけでなく演算しながら伝達した方が無駄も少なくなるのではと考えられます。そこで論理セルと配線セルの区別をなくし単一の汎用セルを並べることで同じ回路面積でもより多くの種類の回路を構成可能にしようと考えました。

f:id:kazakami_9:20171217000843p:plain

f:id:kazakami_9:20171217000533p:plain

この汎用セルは4-bitのLUTを1つ含みます。このセルは上で示した論理セル・配線セルのどちらの機能の実現できます。これによって同じ5×5の回路面積でもより大規模な回路を構成可能になるはずです。

 しかしこの設計の汎用セルでは依然としてラッチやフリップフロップを構成するのに複数のLUTを消費して実現しないといけません。別途DFF等をセルに組み込めば解決するかもしれませんが、レッドストーンの配線が高遅延であるためマイクラにおいては全てのセルに同時にクロック信号を入力するのが難しいのです。これの解決はskewed clockを使ったりすればいいのかもしれませんが今後の課題とします。

 

最後に

 FPGAのプロやマイクラの強い人から見ると突っ込みどころ満載かもしれないので、「この分野には詳しくないのですが~」みたいな質問が来ないか戦々恐々としてます。とはいえ、マイクラでFPGAという分野に関しては多分他に誰もやっていない以上私が第一人者です。皆さんも誰もやっていないような組み合わせを見つけて雑に新規性していきましょう。

 明日の KMC Advent Calendar 2017 - Adventar はwalkureさんで「まぁいけるやろ。」です。いけるいける。大丈夫大丈夫。知らんけど。