NES on FPGA 2024/02/04

おわりに

 FPGAはただの入れ物なので、FPGAを理解するというよりも、 実装対象を理解するためにFPGAに実装する。 と言った方が適切かもしれません。 そういう意味でこの実装を通して、 NESアーキテクチャへの理解が深まりました。 今後はこれを活用して他のアーキテクチャへの足掛かりにしたり、 他ベンダのFPGAボードへの移植を通じて他ベンダのFPGAを学習したりする感じです。

 おわりに、とか言ってるけど、 新しいFPGAボードが出るたびにNES移植してるからこれって永久コンテンツじゃね?と。

! 結果論的なところはある。

SFLを書くのが楽しいのです。

_
▼ NES on FPGA のガラパゴス実装

 最初のNES実装からずいぶん経ち、他の人によるNES実装もたくさん見られるようになりました。 それらの実装コードと比較して、NES on FPGAの実装は以下の特徴があることが分かりました。

  • CPUの命令デコードは組み合わせ回路で
     本来の6502はマイクロプログラム方式ですが、 NES on FPGAでの命令デコードは組み合わせ回路で実装しています。 C言語で言うところの switch case のような実装ですね。 一部から手抜きと言われかねませんが、合成系が頑張ってくれるからいいんです。 このため、LogicElementを消費しますが、 BlockRAMを使用しないためBlockRAMが少ないFPGAに実装するのに適しています。 他の人のNES実装ではマイクロプログラム方式での実装のため、BlockRAMを使用しているようです。 ちなみに、マイクロプログラム方式での実装では未定義命令も含まれますが、 命令デコードを組み合わせ回路でやると未定義命令の実装にはデコーダが膨れ上がってしまうため、 今のところ実装していません。

  • PPUのスプライトとBG表示回路が別
     初期実装のままなので許して。 本当はCHR-ROMバスアクセスの関係でまとめた方が良いみたいです。 ただ記述は分かれてても、論理合成で結局はまとめられるんじゃないかな? 現状CHR-ROMアクセスが実機と異なる部分があり、 MMC5のようなアドレスバスの遷移状態からタイミングを生成しているカートリッジをサポートできていません。 スプライトパターンフェッチ時の無駄VRAMアクセスを実装すれば動きそうに見えるけど… そのうち修正したいところ。

  • 単一クロックにて動作
     NES内の全てのモジュールは単一クロックの完全同期設計で実装しています。 各モジュールの動作タイミングについては、適切な周期のイネーブル信号を生成してこれを使用します。 このため、NESコア全体シミュレーションも行いやすくなっていて、 もちろんPLLが少ないFPGAへの実装が容易です。

  • ベースクロックは何MHzでも
     結局のところ単一クロックで実装しているので、 これはNESコアは50MHzでも25MHzでもなんでもいいのですが、 ある程度の動作周波数を保証することで、 VGAやSDRAMなどの周辺デバイス制御も同じ周波数で使用できます。
     注意点として、25MHzに調整したVGA回路を、NESコア周波数が例えば25.2MHzで使用したとすると、 PPUの描画がVGAタイミングに間に合わずHBlankが多く発生し画面が下に流れてしまいます。 この場合は約24.9MHzでやるとPPU描画も間に合い、25MHz用に調整したVGAコントローラでも問題なく表示できました。

  • SFLで実装
     一応GitHubに公開はしてみたものの、 SFLの開発環境を入手するのが難しく誰も移植できない状況です。 まぁ、参考程度に見て頂ければ。 追記すると独自拡張のSFL+であり、 SFL+から標準SFLへのトランスパイラも公開してないのでそりゃ合成は試せないよね、と。 他の方のVerilogHDLなどのメジャーHDLでの実装例はいくらでもあるでしょうし、 一種の差別化とかいうやつ。

  • 実カートリッジサポート
     初期実装時点で実カートリッジをいくらかサポートしています。 ただし、上記のようにPPU実装が不十分なところがあるため、 CHR-ROMアドレスバスでタイミングを取っているようなメモリマッパーICはサポートできていません。 最初に使ったFPGAボードよりも今はFPGAの容量が増えたので、 マッパー回路を実装することでお茶を濁しています。

  • NSF再生機能追加
     リソースに余裕があればNSF読み込み回路を追加するだけでNSFを演奏可能です。 各種拡張音源を取り揃えております。 ただ、デフォルトでAudioジャックが付いているFPGAボードが少ないのがネックなのです。

  • TAS実行機能追加
     TASのキー入力ファイルを読み込むことでTASのスーパープレイを再現できます。 TASは1フレームでもずれるとプレイが失敗しますが、 たまたまなのか精度がいいのか、マリオの5分程度のTASならクリア可能です。


    Copyright(C) pgate1 All Rights Reserved.