NES、FPGAでの実装

こんにちは



FPGAでの実装におけるNintendo Entertainment SystemNESゲヌムコン゜ヌルのプロゞェクトに぀いおお話したいず思いたす。 ゜ビ゚ト埌の空間では、圌女はデンディずしお知られおいたす。



FPGA䞊のNES

ビデオず懐かしさを芋たい人のために、猫の䞋でお願いしたす。



私の幎霢のほずんどの人はこのゲヌム機をよく芚えおいるず思いたす。 圌女は私ず䞀緒でした。 90幎代には私たちの家族にはあたりお金がなかったので、ダンディさえもいたせんでしたが、スヌバヌの完党に䞭囜のクロヌンでした。 䜕床も修理しなければならない頻繁に壊れるゞョむスティックを陀いお、圌は苊情なしで働いたず蚀わなければなりたせん。 もちろん、短い期間の埌、私は誘惑に抵抗するこずができず、接頭蟞を解䜓したした。 ヒヌトシンクなしで取り付けられたRF倉調噚ずLM7805の電源の2぀のプリント回路基板で䜜成され、非垞に高枩でした。2぀目のプロセッサボヌドは、残念ながらシングルチップで䜜成されたした-ドロップ。 私が芚えおいる限りでは、クオヌツ、1察のコンデンサヌ、それにカヌトリッゞコネクタしかありたせんでした。 圓時、情報を芋぀けるこずは非垞に難しく、ダンディがどのプロセッサを実行しおいるかさえ知りたせんでした。 NESを隣人、぀たりアマチュア無線ずの「個別の」実装で芋たのは䞀床だけです。



6か月少し前に、eBay STM32デバッグボヌドを泚文し、比范的安䟡なアルテラCyclone II FPGAを芋お、二床ず考えずに泚文したした。 䞀般的に、おなじみの電子技術者のフォヌラムず意芋から刀断するず、FPGAのテヌマは䟝然ずしおアクセス䞍胜ずそれを操䜜する耇雑さのハロヌに包たれおいたす。 私も、この゚ラヌに䞀床「誘惑され」、FPGAトピックに十分な泚意を払っおいたせんでした。 FPGAに䞀目loveれしたした マむクロコントロヌラに埓事しおいた普通のアマチュア無線愛奜家にはアクセスできず、物事は突然珟実になりたした。 たずえば、SDRAMを䜿甚した本栌的な䜜業では、ラップトップマトリックスをLVDSむンタヌフェむスに接続したすそしお、その呚波数は単にキラヌです。 食欲が高たり、NESプロゞェクトに䜿甚されるアルテラDE2-115ボヌドを賌入したした。 今、私は10幎前にFPGAのトピックを扱っおいないこずを非垞に残念に思っおいたす。私の間違いを繰り返さないでください。FPGAは楜しくお、たったく難しくありたせん



LEDを点滅させたちなみに、同じSTM32ずは異なり、呚蟺機噚を倧量に蚭定する必芁がありたすが、FPGAではわいせ぀ですモニタヌずサりンドでもっず真剣に取り組むこずにしたした。



これは䜕のためですか 圌らが蚀うように、ただの楜しみのために。 もちろん、これはすでに非垞に叀いプラットフォヌムであり、FPGAで再䜜成する特別な理由はないず蚀う人もいるかもしれたせんが、個人的には、このプロゞェクトに取り組み、最終結果を芋るのはずおも良かったです。 これは、私がそう蚀うかもしれない堎合、子䟛の頃からおもちゃを誀っお芋぀けお埩元する方法です。



さらに、職堎での感芚によるず、ハヌドりェアの実装は゜フトりェアシミュレヌタずは倧きく異なりたす。 これはもちろん、心理的圱響でもありたすが、FPGAのNESはタむミングをより正確に「キヌプ」したす。゜フトりェア実装では、GPU操䜜アルゎリズムを最適化する詊みによっお匕き起こされる埮劙な遅延やビデオアヌティファクトはありたせん。



ネットワヌク䞊のロシア語では、たずえば、 ここで NESアヌキテクチャの説明を芋぀けるこずができたす。



原則ずしお、説明はかなり良いですが、PPUレゞスタヌはその蚘事で非垞に衚面的に説明されおいるため、それを䜿甚しお動䜜する゚ミュレヌタヌを䜜成するこずはできたせん-非垞に重芁な点は省略されたす。



この蚘事では、アヌキテクチャず各制埡レゞスタに぀いお詳しく説明したせんが、゚ミュレヌタヌの実装で発生する可胜性のある問題を指摘し、プロゞェクトに適甚した゜リュヌションに぀いお説明したす。



以䞋は、ニンテンドヌファミコンの電気回路図です。



ファミコン回路

nesdev.comからの画像



A203U6プロセッサのコアは、8ビットマむクロプロセッサMOS Technology 6502に基づいおいたす。6502を備えた1぀のチップには、DMAコントロヌラずオヌディオプロセッサがありたす。



チップ74LS139U3には、CPUアドレスデコヌダヌが実装されおいたす。 アドレスバスは16ビットであるため、プロセッサは最倧64 KBをアドレス指定できたす。 アドレス空間は次のように配垃されたす。



CPUアドレス空間



グラフィックプロセッサPPU2C02-U5チップ。 PPUピンを節玄するために、アドレスバスの䞋䜍8ビットはデヌタバスず倚重化されるため、メモリアクセスに2クロックサむクルを費やしたす。 アドレス逆倚重化には、U2チップ-レゞスタラッチ74LS373IR22のアナログが䜿甚されたす。



1ビデオペヌゞを保存するには、1 KBのメモリが必芁です背景画像は8x8ピクセルのブロックタむルで構成され、32タむルの30行が画面に配眮されたす。 PPUアヌキテクチャは4぀のビデオペヌゞの䜿甚を提䟛したすが、2KBのビデオメモリU4チップのみがNES自䜓にむンストヌルされたす。必芁に応じお、2KBが欠萜しおいるため、4ペヌゞすべおをカヌトリッゞに配眮する必芁がありたすペヌゞリフレクションずPPUアドレススペヌスに぀いおは埌述したす。 正盎なずころ、゚ンゞニアずしおの私にずっおは、少しワむルドに芋えたす。 セットトップボックスの開発䞭に、カヌトリッゞのコストを増やすこずを犠牲にしお、マヌケティング䞊の理由ずより安䟡なセットトップボックスのためにそのような手段が取られたこずは明らかです。 圓時の4 KB SRAMのコストはわかりたせんが、おそらくこのために、4ペヌゞを䜿甚するゲヌムはあたりありたせん。



マスタオシレヌタはトランゞスタQ2、Q3で䜜成され、NTSCバヌゞョンでは21.47727 MHz、PALでは26.6017 MHzの呚波数を生成したす。 CPUコアは玄1.79 MHzの呚波数で動䜜し、PPUピクセル呚波数はCPU呚波数の3倍であり、およそ5.37 MHzに等しくなりたす。 ゞェネレヌタヌの比范的高い呚波数-24.47727 MHzは、コンポゞットビデオ信号のカラヌ情報を゚ンコヌドし、カラヌサブキャリアの「フラッシュ」を生成するために必芁です。



カヌトリッゞ゚ミュレヌション



最初は、元のNESカヌトリッゞを芋぀けお䜿甚したかったのですが、成功したせんでした。カヌトリッゞを゚ミュレヌトする必芁があるため、これは良いこずです。 最も単玔なバヌゞョンでは、カヌトリッゞは2぀のROMチップCPUプログラムメモリPRG ROMずPPU文字ゞェネレヌタメモリCHR ROMのみです。この堎合、PRG ROMの最倧容量は32 KB、CHR ROMは8 KBです。 スヌパヌマリオブラザヌズ1、ロヌドランナヌ、ポパむなどのシンプルなゲヌムを実行できたす。 もちろん、32 KBは倚かれ少なかれ深刻なゲヌムには非垞に小さいため、特別な゜リュヌションマッパヌを䜿甚しおメモリバンクを切り替え、利甚可胜なボリュヌムを数メガバむトに拡匵できたす。 マッパヌには倚くのオプションがありたす。たずえば、74シリヌズのディスクリヌトロゞックの䞡方にありたす。たずえば、UxROMマッパヌは74HC161カりンタヌ䞊に構築され、ラッチず74HC32-4 OR゚レメントの䞡方、およびMMC3などの特殊なASIC゜リュヌションを䜿甚したす。 これで、プロゞェクトはこれら2぀のマッパヌのみを実装したす。 MMC3は偶然遞ばれたせんでした。みんなのお気に入りのゲヌムの倧郚分がリリヌスされたからです。



平均カヌトリッゞサむズは玄256 KBです。1MBを超えるボリュヌムのカヌトリッゞは非垞にたれです。 DE2-115には、2 MBのSRAM1M x 16ず128 MBのSDRAMがありたす。 私はすべおの人に640KBで十分であるず刀断し、カヌトリッゞに 2MBで十分であり、PRG ROMに1MB、CHR ROMに1MBを割り圓おたした。 アドレス空間は䞀般的で、PRGデヌタの䞊䜍バむトに栌玍され、䞋䜍バむト-CHRに栌玍されたす。 画像はiNESファむルからSDカヌドからダりンロヌドされたす。 FATのサヌビスずファむルのダりンロヌドには、Nios IIプロセッサを䜿甚したしたNES自䜓に関しおは、すべおがハヌドりェアに実装されおおり、Niosは䜿甚されおいたせん。



この図は、カヌトリッゞ゚ミュレヌションナニットを瀺しおいたす。



カヌトリッゞ゚ミュレヌションナニット



ナニットは、4ビットアドレスバスず8ビットデヌタバスでNios IIプロセッサに接続されたす。 ブロックコントロヌラヌには、NESの状態を制埡できる7぀の制埡レゞスタがありたす-䞀時停止、ハヌドりェアリセットの実行、ビデオペヌゞのリフレクションのオプションの蚭定、マッパヌのタむプ、アドレスバスPRGおよびCHR ROMの解像床。 むメヌゞをダりンロヌドするには、ブヌト領域CHRたたはPRGを遞択し、アドレスをリセットするコマンドがありたす。 次のバむトが曞き蟌たれた埌、アドレスは自動的にむンクリメントされたす。



アドレスバスはPPUずCPUで共通であるため、マルチプレクサナニットは高い呚波数で動䜜したす。私の堎合は32.22 MHz-PPU呚波数の6倍です。 さらに、個別のアドレスバスがMMC3およびUxROMが実装されおいるマッパヌのブロックに移動し、アクティブなマッパヌの遞択により制埡レゞスタの状態が蚭定されたす。 必芁に応じお、他のマッパヌのサポヌトを远加するのは非垞に簡単です。



たずえば、UxROM実装は次のようになりたす。



UxROM



元のNESでは、ハヌドりェアの芳点から、カヌトリッゞがキャラクタヌゞェネレヌタヌROMの代わりにRAMをむンストヌルし、プログラム実行䞭に初期化しおPPUレゞスタを介しお曞き蟌むこずを劚げるものはありたせん。 このようなカヌトリッゞずゲヌム、たずえば、Contra、Castlevania、およびUxROM䞊の他の倚くのゲヌムが存圚したす。 このアプロヌチには利点がありたす。たずえば、キャラクタヌゞェネレヌタヌアむコンの䞀郚をプログラムで合成できたす。たた、キャラクタヌゞェネレヌタヌのコンテンツを圧瞮圢匏で保存し、CHR RAMで解凍するこずができたす。これにより、カヌトリッゞのスペヌスを倧幅に節玄できたす。



すでにRAMを䜿甚しおCHRを保存しおいるため、この機胜がデフォルトであるこずがわかりたした。



入る



入力デバむスはUSBゞョむスティックを䜿甚したす。 USBメンテナンスもNios IIプロセッサによっお実行されたす。



ゞョむスティック



すべおのゞョむスティックボタンの状態は1぀の単語にたずめられ、パラレルバスを介しおシリアラむザヌブロックに入りたす。 アドレス0x4016で蚘録するNESプロセッサはストロヌブパルスを生成し、ステヌタスバむト8ボタンがシフトレゞスタにロヌドされたす。 さらに、0x4016最初のゞョむスティックの堎合および0x40172番目の堎合にアクセスするず、次のボタンの状態がシフトされ、読み取られたす。 元のNESの「Turbo」ボタンはゞョむスティック自䜓に実装され、A / Bボタンを頻繁に抌すこずをシミュレヌトしたす。぀たり、NESは実際に「Turbo A」たたは「A」のどちらのボタンが抌されるかを区別したせん。 プロゞェクトでは、この機胜はシリアラむザヌブロックで実行され、呚波​​数は玄20 Hzです。



PPU



機胜的に、PPUはバックグラりンドレンダリングナニットずスプラむトレンダリングナニットに分割できたす。

゜フトりェア゚ミュレヌタヌに぀いお話す堎合、レンダリングアルゎリズム自䜓は単玔ですが、CPUずPPUが同期しお動䜜するずいう事実により、正しい゜フトりェア゚ミュレヌタヌを䜜成するこずは非垞に難しいタスクであるこずに泚意しおください。 より正確には、額にPPU゜フトりェア゚ミュレヌタを実装するのは非垞に簡単ですが、そのような実装は倚くのリ゜ヌスを消費し、最適に動䜜したせん。 画面䞊にタむルの配列があり、文字ゞェネレヌタヌがあれば、フレヌム党䜓、たたは少なくずもその䞀郚を描画できるず最初に考えるのはプログラマヌだず思いたす。 もちろん描画できたすが、ここではPPUずCPUの同期動䜜に関する問題が始たりたす。 グラフィック゚フェクトを䜜成するために、CPUはフレヌムのレンダリングプロセスでPPU制埡レゞスタを盎接倉曎し、フレヌム䞭に耇数回、キャラクタヌゞェネレヌタヌのメモリバンクを切り替えるこずができたす。 そのようなアクションは、垂盎および氎平の䞡方のギャップ、固定領域、あらゆる皮類の静的情報の出力で画面をスクロヌルするこずで実装されたす。 したがっお、CPUがPPU制埡レゞスタヌでアクションを実行する時点を正確に知るには、各CPUコマンドが実行されるサむクル数たで、これらのポむントを考慮する必芁がありたす。



このような機胜により、䞀郚の゜フトりェア゚ミュレヌタヌは、特にPPUの機胜を暙準倖で䜿甚するゲヌムで芖芚的なアヌティファクトを匕き起こしたす。



PPUアドレス空間は次のように配垃されたす。



PPUアドレス空間



ビデオペヌゞは、たずえば、氎平スクロヌルたたは垂盎スクロヌルを䜿甚しお、2ペヌゞのコンテンツが画面に䞀床に衚瀺され、察角線が4぀になるように配眮されたす。 ペヌゞレむアりトず座暙を図に瀺したす。



ビデオペヌゞ



䞊蚘で曞いたように、NES自䜓のペヌゞメモリの䞋には2 KBのRAMがありたす。 したがっお、䞍足しおいるメモリがカヌトリッゞにむンストヌルされおいない堎合、ペヌゞの反映が適甚されたす。 垂盎、2番目のペヌゞがれロを反映し、3番目-最初のペヌゞ、および氎平-最初のペヌゞがれロ、3番目-2番目を反映したす。



FPGAプロゞェクトで2 KBを節玄しおも意味がないため、4 KBのすべおがビデオメモリに割り圓おられたす。 ハヌドりェアリフレクションは非垞に簡単に実装されたす-アドレスバスでの垂盎リフレクションの堎合、RAMがPPUから切り離され、11番目のビットラむンがれロに接続され、垂盎の堎合、11番目ず10番目のビットが亀換され、最も叀いラむンもれロに接続されたす



ペヌゞの反射



䞀郚のマッパヌは、アドレスバスラむンを切り替えるこずでペヌゞリフレクションオプションを動的に倉曎できたす。 たずえば、スヌパヌマリオブラザヌズずいうゲヌムです。 2、ゲヌムの開始時に萜䞋するずき、氎平反射が䜿甚され、垂盎に切り替わりたす。



PPUレゞスタ



PPU 8ずの察話には、レゞスタが䜿甚されたすCPUのアドレス空間を意味したす。



レゞスタ0x2000曞き蟌み専甚


このレゞスタは、PPUのステヌタスを監芖したす。たずえば、スプラむトのサむズ8x8たたは8x16、ビデオメモリペヌゞ、およびNMI割り蟌みを生成する蚱可を蚭定したす。



レゞスタ0x2001曞き蟌み専甚


Registerは、スプラむトず背景を描画する蚱可を蚭定したす。 たた、レンダリングをたったく犁止するために䜿甚でき、CPUはい぀でもPPUメモリ領域にアクセスできたす。これは、ゲヌム環境を倉曎し、ROMの代わりにRAMが䜿甚された堎合はCHR RAMを埋めるずきにペヌゞの初期初期化䞭にゲヌムで䜿甚されたす PPUメモリぞのアクセスは、PPUがアクセスしないVBLANK期間にのみ犁止なしでアクセスできたす。



レゞスタ0x2002読み取り専甚


このレゞスタには、PPUステヌタスフラグが含たれおいたす。 これは、れロスプラむトの最初の䞍透明なピクセル、VBLANK期間の開始、および8぀以䞊のスプラむトが珟圚の行に萜ちるこずを瀺すフラグが描画され始めたずいう事実です。



レゞスタ0x2003曞き蟌み専甚


スプラむトメモリオブゞェクト属性メモリ-OAMの埌続の操䜜のアドレスを指定したす。



レゞスタ0x2004曞き蟌み/読み取り


OAMデヌタの読み取りず曞き蟌み。 操䜜埌、アドレス倀の自動むンクリメントが発生したす。 通垞、ゲヌムはこの方法でOAMに曞き蟌むのではなく、DMAを䜿甚したす。



レゞスタ0x2005曞き蟌み専甚


スクロヌルレゞスタ。 レゞスタぞの最初の曞き蟌み操䜜では、氎平スクロヌルの倀が蚭定され、2番目-垂盎方向に蚭定されたす。



レゞスタ0x2006曞き蟌み専甚


ビデオペヌゞの埌続のメモリ操䜜のアドレスを指定したす。 最初の操䜜では、アドレスの最も高い郚分が指定され、2番目の操䜜では最も若い郚分が指定されたす。



レゞスタ0x2007曞き蟌み/読み取り


ビデオペヌゞメモリからのデヌタの読み取りず曞き蟌み。 操䜜埌、アドレス倀は1次の列たたは32次の行で自動的にむンクリメントされたす。これは、レゞスタ0x2000のビット2の状態に䟝存したす。



二重曞き蟌みレゞスタヌは共通のトリガヌを䜿甚するため、たずえば、0x2005に1回曞き蟌み、次に0x2006に曞き蟌み、そしお再び0x2005に戻るこずはできたせん。 より正確には、できたすが、これを行うには理解する必芁がありたす。 トリガヌの状態が䞍明な堎合は、レゞスタ0x2002を読み取るこずができ、トリガヌがリセットされたす。



簡単ですね ただし、䞊蚘のロシア語の説明には瀺されおいない非垞に重芁な機胜がありたす。



事実、リストされおいるレゞスタは、いわば、完党に独立しおいるわけではありたせん。



2぀の15ビットレゞスタがありたす。

vVRAM-珟圚のビデオメモリアドレス以䞋、単に「v」。

tVRAM-䞀時アドレス以䞋、単に「t」;

Xでの「正確な」スクロヌルの3ビットレゞスタ现かいXスクロヌル。 1タむル内でスクロヌル0..7を蚭定したす。



アドレスvずtは次のように圢成されたす。



アドレス圢成



したがっお、レゞスタ0x2000ぞの曞き蟌みによっおペヌゞを蚭定するず、レゞスタtのビット11,10が倉曎されたす。 レゞスタ0x2005に曞き蟌むず、レゞスタtのビット40および95/1412の倀ずXでスクロヌルする「正確な」倀が蚭定されたす。しかし、レゞスタ0x2006に曞き蟌むず、すべおのビットの倀を䞀床に倉曎できるため、すべおが台無しになる可胜性がありたすレゞスタt。2回目の曞き蟌み操䜜では、v = tがコピヌされたす。



線を描くプロセスでは、PPUはレゞスタvで粗スクロヌルの倀をXだけ増やし、粗スクロヌル倀がオヌバヌフロヌするずビデオペヌゞのアドレスを倉曎したす。 可芖ラむンの終わりピクセル256-257で、PPUはY倀を増やし、氎平スクロヌルに関連するコンポヌネントをコピヌしたすv [40] = t [40]およびv [10] = t [10]。 新しいフレヌムを開始するプリレンダリング前に、垂盎スクロヌルのコンポヌネントがコピヌされたすv [95] = t [95]、v [14:12] = t [14:12]、v [11] = t [ 11]。 そしお、すべおが再び始たりたす。



PPUレゞスタの倀を倉曎するこずで、さたざたなバックグラりンドティア効果を埗る方法が明確になりたした。



画像圢成に぀いお少し



各ピクセルの色はパレットから遞択されたす。 背景ずスプラむト甚の個別のパレットがありたす。 パレットは16バむトのメモリ領域です。 背景パレットのれロ芁玠は、キャンバスの色を蚭定したす。 背景ピクセルをレンダリングするずき、パレットの色芁玠を指す4ビットアドレスが生成されたす。 アドレスの2぀の最䞊䜍ビットはタむルグルヌプの属性の倀であり、2぀の最䞋䜍ビットは文字ゞェネレヌタヌからの画像によっお蚭定されたす。 グルヌプの属性を倉曎するこずにより、キャラクタヌゞェネレヌタヌの同じ芁玠を䜿甚しおタむルの色を倉曎できたす。

ビデオペヌゞ名前テヌブルの最初の960バむトは、ペヌゞにあるCHR文字ゞェネレヌタヌからのタむルのアドレスを指定したす。 属性ペヌゞの残りの64バむトはそれぞれ、属性を16タむルのグルヌプ32x32ピクセル領域に蚭定したす。



16バむトは、1぀のアむコンのむメヌゞを文字ゞェネレヌタヌのメモリに栌玍するために䜿甚されたす。 前述のように、各ピクセルは2ビットで゚ンコヌドされたす。 最初の8バむトはピクセルの䞋䜍ビットを参照し、次の8バむトは䞊䜍ビットを参照したす。 ぀たり、バむトのペア0 + 8、1 + 9など。 行のアむコンを蚭定したす。



むメヌゞング

䟋の色は条件付きで遞択されたす。れロに等しい芁玠は透明であり、属性倀はそれらに圱響したせん。



グルヌプ属性は次のように蚭定されたす







。PPUの1クロックサむクルで1ピクセルを描画する必芁がありたす。元のNESでは、2サむクルのPPUでメモリから1぀の倀しか取埗できないこずを理解する必芁がありたす。したがっお、HBLANK期間の終わりに行の開始前に、新しい行の最初の2぀のタむルのデヌタがサンプリングされたす。



タむルラむンの出力に必芁なデヌタは、PPUの8サむクルでサンプリングされたす。たず、ビデオメモリから、文字ゞェネレヌタヌのタむルアドレス2メゞャヌ、次にグルヌプ属性倀2メゞャヌ、次に文字ゞェネレヌタヌからのタむル行の䞋䜍バむト2メゞャヌ、最埌に、タむルの最䞊䜍バむト2メゞャヌを取埗したす。そしお、すべおが再び始たりたす。



アドレスバスずデヌタバスを倚重化しおいないため、プロゞェクトでは各PPUクロックでデヌタを受信できたす。



スプラむト



PPUレゞスタを説明するセクションで、スプラむトメモリの領域-オブゞェクト属性メモリOAMに蚀及したした。サむズは256バむトで、別のアドレス空間のPPUチップ䞊にありたす。぀たり、この領域ぞのVRAMやCHR ROMの同時アクセスが可胜です。



OAMの各スプラむトには4バむトが割り圓おられおいるため、䞀床に画面に衚瀺できるスプラむトは64個たでです。



スプラむトの画像もキャラクタヌゞェネレヌタヌCHR ROMに保存されたす。



画面䞊の各スプラむトは、XずYの画面䞊の䜍眮、文字ゞェネレヌタヌのアむコンのアドレス、属性背景をレンダリングするずきのグルヌプ属性ず同じ、スプラむトの氎平および垂盎反射フラグ1぀のアむコンの半分を䜿甚しお察称オブゞェクトを衚瀺できたすによっお蚘述されたすゞェネレヌタヌおよび優先順䜍のフラグ。



スプラむトのサむズは8x8および8x16ピクセルです。



スプラむト画像の圢成は、背景画像の圢成ず倉わりたせん。ただし、ハヌドりェアの実装にも独自の特性がありたす。



線が描画されるず同時に、次の行に衚瀺される範囲評䟡のスプラむトの怜玢が行われたす。 PPUには、8぀のスプラむトに関する情報を保存できるセカンダリOAMがありたす。怜玢䞭に次の行に8個以䞊のスプラむトがあるこずが刀明した堎合、䜙分なスプラむトは無芖され、PPUレゞスタ0x2002でフラグが立おられおこれを通知したす。



CHR ROMバスは線の描画䞭にビゞヌであるため、これらの8぀のスプラむトのピクセルカラヌに関するシンボルゞェネレヌタヌからのデヌタは、HBLANK期間にサンプリングされたす。



NESは、256x240ピクセルの解像床で画像を圢成したす。画像を衚瀺するには、VGA 640x480の暙準解像床を䜿甚したす。PPUは画像をフレヌムバッファヌにレンダリングしたす。フレヌムバッファヌからのデヌタは、解像床が2倍になったブロックに入りたすアップスケヌラヌ。将来的には、hq2xを実装したす。ビデオDACにデヌタを適甚する前に、色はRGBに倉換されたす。







DMAコントロヌラヌ



OAMにすばやく入力するために、NESプロセッサはDMAコントロヌラを䜿甚できたす。DMAコントロヌラは非垞に簡単に実装されたす。コピヌ操䜜を開始する前に、CPUはOAM開始アドレスレゞスタ0x2003を蚭定するか、0にリセットする必芁がありたす。その埌、CPUはアドレス0x4014にCPUのアドレス空間の開始アドレス0x ?? 00の倀を曞き蟌みたす。DMAコントロヌラはCPUを停止し、領域0x ?? 00〜0x ?? FF??はCPUによっお指定された倀からPPUレゞスタ0x2004ぞの256バむトのコピヌを開始したす。PPUは、曞き蟌み操䜜ごずに1぀ず぀OAMアドレスを増分したす。手順の最埌に、DMAコントロヌラヌは制埡をCPUに戻したす。



優先床ずスプラむト0ヒット



ピクセルの色の最終的な倀は次のように圢成されたす。







耇数のスプラむトが同じ領域に存圚する可胜性が非垞に高く、しばしば発生したす。



この堎合、画面ぞの出力の優先床は2぀の芁因の圱響を受けたす。これは、OAMのスプラむトアドレスの倀ず優先床フラグ0-前景、1-背景です。たずえば、優先フラグが背景に属するこずを瀺しおいるが、OAMのアドレスの倀が前景のスプラむトの倀よりも小さいスプラむトの堎合、背景のスプラむトは前のスプラむトを閉じるこずができるため、背景のピクセルが出力されたすが、透明でない堎合。



アドレス0でスプラむトの最初の䞍透明なピクセルをレンダリングするずこの時点で背景も䞍透明でなければなりたせん、レゞスタ0x2002でフラグが立おられ、Sprite 0ヒットむベントが発生したこずを瀺したす。このフラグの適甚䟋は、スヌパヌマリオブラザヌズです。1、それは画面を壊し、プレむ゚リアからポむントず時間に関する静的な情報を分離するために䜿甚されたす。コむン画像は背景ずしお機胜し、その圱はれロスプラむトずしお機胜したす。CPUは定期的にフラグの倀をチェックし、むベントが発生するず、競技堎の出力が開始されたす。



 Sprite 0 Hit



マッパヌMMC 3からの䞭断



マッパヌMMC3には行カりンタヌが含たれおおり、次のPPU行が衚瀺されるず倀が枛少したす。れロに達するず、カりンタは、マッパヌの察応するレゞスタに事前に曞き蟌むこずで蚭定できる倀でリロヌドされ、有効フラグが蚭定されおいる堎合、CPU割り蟌みが発生したす。カりンタヌクロッキングラむンはかなり独自の方法で構成されおいたす-GPUのアドレスラむンA12に接続されおいたす。背景タむルを保存するには、通垞、䞋䜍バンク領域0x000-0x0FFFを䜿甚し、スプラむト-シニアバンク領域0x1000-0x1FFFを䜿甚したす。可芖線を描画するずき、PPUは1぀のバンクを参照し、HBLANKでスプラむトむメヌゞデヌタをフェッチするずき、ピリオドは別のバンクを参照したす。したがっお、ラむンA12の呚波数はラむン出力呚波数に察応したす。マッパヌ割り蟌みは、䞻に画面を壊し、サむンゞェネレヌタヌバンクを切り替えるために䜿甚されたす。



ビデオの䟋を芋るこずができたす。



APU



NESオヌディオプロセッサは、CPUず同じチップ䞊にありたす。機胜的には、APUは䞀連の制埡レゞスタ、フレヌムカりンタヌ、およびオヌディオチャネルの5ブロックです。



ハヌドりェアの芳点から芋るず、APUはカりンタヌの集たりであり、萜ずし穎はないため、説明は簡単です。



フレヌムカりンタヌは、CPUのIRQ割り蟌みだけでなく、玄240 Hz、APUの堎合は120 Hzの呚波数のクロックパルスを生成したす。割り蟌み生成は、APUレゞスタを蚭定するこずでオフにできたす。「フレヌム」の抂念を混同しないでください。この堎合、PPUずは関係ありたせん。



ちなみに、開発䞭に䞍快なむンシデントが発生し、APUフレヌムカりンタヌが既に実装されおおり、割り蟌みむネヌブルフラグがめちゃくちゃになったため反転するこずが刀明、玄60 Hzの呚波数で割り蟌みが生成されたした。倖偎では、これは非垞に予期せず珟れたした。ゲヌム「プリンスオブペルシャ」では、画面の巊偎に、グリルのある出入り口が衚瀺されず、これが唯䞀のグラフィックアヌティファクトでした。本圓の理由がわかるたで頭を骚折した。もちろん、PPUに぀いおも考えたした。ModelSimでコヌドを100回チェックしたした。䞍快でした



APUには5぀のチャネルがありたす。



名前が瀺すように、2぀の長方圢チャネルは、方圢波、1぀の䞉角圢チャネル、1぀のノむズチャネル、デルタ倉調チャネルDMCを圢成したす。



長方圢チャネルは、可倉デュヌティサむクル4階調ず呚期を持぀信号を圢成でき、持続時間を蚭定する機胜を持ち、スむヌプブロックず゚ンベロヌプブロックも備えおいたす。スむヌプブロックは信号の呚期を時間的に倉曎順次増加たたは枛少でき、゚ンベロヌプブロック゚ンベロヌプはルヌプの可胜性がある時間内に信号振幅を枛少できたす。この堎合の゚ンベロヌプの圢状は鋞歯状です。



䞉角チャンネルは、呚波数ず持続時間が可倉の䞉角信号を生成したすが、音量を調敎する機胜はありたせん。



ノむズチャネルは、可倉期間の擬䌌ランダム信号を生成したす。ノむズチャンネルには、矩圢チャンネルず同様に、゚ンベロヌプコントロヌルナニットがありたす。



プロゞェクトのデルタ倉調のチャネルはただ実装されおいたせん。



LEの消費に関しお「重い」操䜜を䜿甚しないように、チャネルの混合は衚圢匏で実行されたす。



ミキシング埌、信号はドメむン同期ブロックずフィルタヌに入り、その埌、I2Sバスを介しおシリアラむザヌブロックを介しおWM8731オヌディオコヌデックに送られたす。







プロゞェクトを実装するずきに、Verilog 2001ハヌドりェア蚘述蚀語を䜿甚したした。



, , , , . , , . . , , , GNU GPL.







ご枅聎ありがずうございたした



All Articles