趣味でやっているハードウェア関連(主にFPGA/レトロアーケード基板互換SoC開発)について書いていきます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
~ 前回までのあらすじ ~
なんとかFPGA上で「ゼビウス」を動作させることができた筆者であったが、その困難さは「同時アクセスされるメモリの多さ」にあったという。
「同時にアクセスされるメモリが多い」と、どうして「困難」になるのであろうか?
ここからの話を理解するには、まずターゲットボードにしている "Spartan-3 Starter Board" の仕様を知る必要があるので、それらを挙げたいと思います。
FPGAには XILINX Spartan-3 (XC3S1000) を搭載。
コンフィギュレーション用のフラッシュROMとして、XCF04 (4MBits)。
外部のデバイスとしては、
・総容量1MBytesの10ns非同期SRAM
・4桁の7セグメントLED
・8つのLED
・4つのプッシュボタン
・8つのトグルスイッチ
・PS/2ポート
・RS232Cポート
・VGA(3bpp)ポート
が付いています。
(余談ですが、このボードは元々Spartan-3の普及のために安価で頒布されたという経緯があります。)
アーケード基盤互換ボードとして動作させる際には、この外部に接続された非同期SRAMを「動作させるタイトルで使用されている全てのROMの代わり」として使用する設計になっています。
SRAMなので当然電源投入時には空っぽなので、FPGAのコンフィギュレーション後、互換回路の起動前にフラッシュROMからタイトルのROMの内容が転送されるようになっています。
(コンフィギュレーションROMには、FPGAの回路データの後にタイトルのROMの内容が書き込んであるのです。)
さて今回の「ゼビウス」の場合、
・パレットROM
・1プレーン目(文字表示)のBGのパターンROM
・2プレーン目(背景表示)のBGのパターンROM
・スプライトのパターンROM
・スプライトのパレット参照(CLUT)ROM
・2プレーン目のBGのパレット参照ROM(1プレーン目はパレット参照が無い)
・各CPUのプログラムROM(3つ)
・惑星マップデータのROMが3つ(データの構造上こういう仕様になっている)
・WSG音源の波形ROM
の合計13のROMが、実機では「実時間で同時に」アクセスされています。
しかし、ターゲットボードには1つのメモリしか載っていません。
FPGA内部にもメモリを持っていますが (XILINXではBlockRAMと呼ぶ。XC3S1000では18Kbitsx24個の総容量54KBytes)「ゼビウス」で使われているROMの全てを抱えられるほどの容量は(XC3S1000には)ありません。
そもそもVRAMやCPUの作業メモリなどでRAMは必要なので、ROMだけでBlockRAMを使い切るわけにはいかないのです。
そういった理由で、13個のROMを1つのSRAMに肩代わりさせなくてはならないのです。
(もちろん複数のメモリを外部に載せてあげることで楽にはなるのですが、「せっかくのFPGAなのだからシリコンな部品を自分で外部に実装しない」という「鉄の掟」(笑)のため、こういうことになっています。)
結論から言えば、13個全てのROMを1つのSRAMに肩代わりさせることはできませんでした。(動作タイミングの制約で)
特にビデオ系のタイミングがキツくて、2枚のBGをこれほど恨んだことはありません。
なるべく容量の少ないROMをBlockRAMに割り当てることでSRAMが肩代わりするROMの数を7つにまで減らしましたが、それでもギリギリという感じになりました。
‥‥まぁギリギリでも動いたので、よしとしましょうか(笑)。
あらゆる制約のなかで「ゼビウス」を動作させるためには、今までとは少し違った工夫が必要でした。
次回は、その「奥様ちょっとひと工夫」の数々をご紹介しようと思います。
お楽しみに。
PR