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ならクリア可能です。

_
▼ NEXT GENERATION!

 正統なる後継者。

  • やっぱりSFLで実装
     通常ならばVerilogHDLやVHDLのメジャー言語での実装となるところだが、 ここは実装が目的ではないということを常に思い起こすためにもSFLでの実装を進める。 その過程で得られる想像産物は、他では得られない。 というかVerilogHDLとかVHDLじゃ息抜きにならねえ。
     → SLFの独自拡張SFL+、それは他の人には使いこなせない制限だらけの変換バッチ。

  • やっぱりカートリッジ動作
     外部メモリからのブートが楽とはいうものの、ソフトコア、 ソフトカートリッジとソフトで囲い込んではそれだけ肝心のハード実装がつまらなくなる。 やっぱカートリッジが手元にある"存在の実感"とはコレクターの真髄なんだろう。 どんな犠牲を払ってでも手に入れるとは甚だ手段が目的と化している所ではある。
     → カートリッジ(箱説付)の山と格闘中。なぜ黄ばむ?

  • あら今日はお豆腐が安いワ
     極端に言えば数十万円のFPGAボードとか数百万円のハードウエアコンパイラなどがあれば、 すぐに動いちゃう。ネタとして美味しいところを頂くためには、 誰もが入手できる、共有可能なレベルの環境で実装することが必要。 とはいえプロトタイプとは費用がかさむもので…どっかに評価ボードころがってないかな。
     → 安価で便利な評価ボードが出てますね。DE1とかDE1とか。

  • 新しいこと、始めませんか
     経験則だが、ビット幅が2倍になると回路規模は4倍となる。 回路の実装時間は規模に比例して増加するが、検証時間の増加率はその3倍。 とにかく検証時間がえらいことになるというのは目に見えているので、 そのための下準備が大事。 ハードをソフトに取り込んでの協調検証、時間軸での妥当性検証など、 有用(そう)な手法を取り入れて検証効率を上げる必要がある。
     → HW/SW協調検証は鼻血がでるよ!?リファレンスモデルはこう使え!

  • 建前ことコンプライアンス
     どこまでの情報開示が可能なのか。 このあたり、いかなる方面の方々とも話題として発散するのが常で、解がない。 したい、させない、させたい、できないの我侭ばかりでだれだよ俺のケーキ食ったのは状況。 ある意味限界値テストを常に行いながら実際はその2倍くらいの値を入力してたりする。 仕様外規格(の)外なのは分かってる。だからそうしないと勝てないのは分かってくれ。
     → これらは他の組織とは無関係な個人作業です。あまり追求しないでください。
…続くの?
Copyright(C) pgate1 All Rights Reserved.