趣味でやっているハードウェア関連(主にFPGA/レトロアーケード基板互換SoC開発)について書いていきます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
~ 前回までのあらすじ ~
タイトルで使用されている全てのROMを1つのS-RAMに肩代わりさせなくてはならなくなったのだが、13個のROMを肩代わりさせるのはさすがにキツく、「奥様ちょっと一工夫」を駆使して乗り切る我々であった(1人だが)。
まず前提となる複数のROMを1つのS-RAMに肩代わりさせる方法ですが、アクセスを時分割して「複数あるように見せる」という手法を用いています。
(シングルCPUの「マルチタスク」と同様な方法です。)
S-RAMの前にごく短時間でアドレスバスを切り替えるマルチプレクサを作って繋いであげれば良いわけです。
説明するよりも、ここはささっとソースを読んでみてください。
(モジュール名の EROMAXS は "External ROM Access" の略のつもりです)
ソースを読めば分かる通り、25MHz/16フェイズで1周期として各ROMのアクセスを処理しています。(25MHzなのはS-RAMのアクセス時間の関係です。)
動作としては、ターゲットとするROMのアドレスを1つ前のフェイズで与えて次のフェイズで読み出す、ということを繰り返しているだけです。
ただ、ビデオタイミングの関係上、BGとスプライトのチップROMには4フェイズ毎にアクセスしなくてはいけないため、扱えるROMの数は16、ということにはできないのです。
2つのCPUのプログラムROMと、惑星マップデータのROM(と爆発音のPCMデータ(詳細は次回以降に))は、ビデオ系の合間にアクセスするようにしています。
ソースを読んで気づいた方も多いと思いますが、S-RAMとのデータバスが16ビットになっています。
実はここが「奥様一工夫」(というか苦肉の策)の一つだったりします。
実機では8ビットバスのUV-EPROMが使われていて、出来ればROMイメージもそのまま載せたかったのですが、25MHzのアクセス時間に間に合わせるために2つのROMのデータをインターリーブして1回のアクセスで2つのROMを同時に読めるような工夫をしています。
(これをするにはROMイメージの作り方から考慮しなければいけない)
今回はBG/スプライトのチップROMと、惑星マップデータROMに対してこのような措置を施しています。
できればROMの生データをそのまま繋ぐだけでROMイメージを作りたかったのですが、仕方がないのでこういう仕様にしました。
このROMイメージを作るツールはRubyで書きました。だれかの役に立つかもしれないので一応アップしておきます。
(このツールに食わせるXeviousのROMイメージを作るためのレスポンスファイルも。ROM自体のファイルは無いのであしからず。)
ところで、このモジュールでアクセスされていない残りのROMはどうしたのでしょうか?
(音源制御CPUのROM/WSG音源の波形ROM/BGとスプライトのCLUT/パレット)
これらはもう仕方がないので、Verilogのソースに落としてデータを丸ごと回路に突っ込んでいます。
(XILINXの場合、初期値設定済みのBlockRAMになる。)
回路にROMの内容が含まれているのは、ちょっと格好悪いですが今回は諸般の都合でこのようになりました。
(以前作っていた「マッピー」や「ギャプラス」は起動前に内部ROMにデータをロードするようにしていたので、回路自体にROMデータは含まれていないのです)
今回は「格好良さ」よりも「実」を取ったということでご勘弁を(^^;
「ROM」なんて単純そうなものでもそれなりの工夫が必要、ということで長々と書いてきましたが、(コンピュータシステムの中では重要な要素ではあるが)地味なメモリ周りの話題ばかりでもなーということで、次回は楽しい(?)音源周りの話をしたいと思います。
お楽しみに。
タイトルで使用されている全てのROMを1つのS-RAMに肩代わりさせなくてはならなくなったのだが、13個のROMを肩代わりさせるのはさすがにキツく、「奥様ちょっと一工夫」を駆使して乗り切る我々であった(1人だが)。
まず前提となる複数のROMを1つのS-RAMに肩代わりさせる方法ですが、アクセスを時分割して「複数あるように見せる」という手法を用いています。
(シングルCPUの「マルチタスク」と同様な方法です。)
S-RAMの前にごく短時間でアドレスバスを切り替えるマルチプレクサを作って繋いであげれば良いわけです。
説明するよりも、ここはささっとソースを読んでみてください。
(モジュール名の EROMAXS は "External ROM Access" の略のつもりです)
ソースを読めば分かる通り、25MHz/16フェイズで1周期として各ROMのアクセスを処理しています。(25MHzなのはS-RAMのアクセス時間の関係です。)
動作としては、ターゲットとするROMのアドレスを1つ前のフェイズで与えて次のフェイズで読み出す、ということを繰り返しているだけです。
ただ、ビデオタイミングの関係上、BGとスプライトのチップROMには4フェイズ毎にアクセスしなくてはいけないため、扱えるROMの数は16、ということにはできないのです。
2つのCPUのプログラムROMと、惑星マップデータのROM(と爆発音のPCMデータ(詳細は次回以降に))は、ビデオ系の合間にアクセスするようにしています。
ソースを読んで気づいた方も多いと思いますが、S-RAMとのデータバスが16ビットになっています。
実はここが「奥様一工夫」(というか苦肉の策)の一つだったりします。
実機では8ビットバスのUV-EPROMが使われていて、出来ればROMイメージもそのまま載せたかったのですが、25MHzのアクセス時間に間に合わせるために2つのROMのデータをインターリーブして1回のアクセスで2つのROMを同時に読めるような工夫をしています。
(これをするにはROMイメージの作り方から考慮しなければいけない)
今回はBG/スプライトのチップROMと、惑星マップデータROMに対してこのような措置を施しています。
できればROMの生データをそのまま繋ぐだけでROMイメージを作りたかったのですが、仕方がないのでこういう仕様にしました。
このROMイメージを作るツールはRubyで書きました。だれかの役に立つかもしれないので一応アップしておきます。
(このツールに食わせるXeviousのROMイメージを作るためのレスポンスファイルも。ROM自体のファイルは無いのであしからず。)
ところで、このモジュールでアクセスされていない残りのROMはどうしたのでしょうか?
(音源制御CPUのROM/WSG音源の波形ROM/BGとスプライトのCLUT/パレット)
これらはもう仕方がないので、Verilogのソースに落としてデータを丸ごと回路に突っ込んでいます。
(XILINXの場合、初期値設定済みのBlockRAMになる。)
回路にROMの内容が含まれているのは、ちょっと格好悪いですが今回は諸般の都合でこのようになりました。
(以前作っていた「マッピー」や「ギャプラス」は起動前に内部ROMにデータをロードするようにしていたので、回路自体にROMデータは含まれていないのです)
今回は「格好良さ」よりも「実」を取ったということでご勘弁を(^^;
「ROM」なんて単純そうなものでもそれなりの工夫が必要、ということで長々と書いてきましたが、(コンピュータシステムの中では重要な要素ではあるが)地味なメモリ周りの話題ばかりでもなーということで、次回は楽しい(?)音源周りの話をしたいと思います。
お楽しみに。
PR