[1chipMSX]
最上位階層
※情報の正確さは保証できません。
※掲載のブロック図は、ソースを解析の結果、HRA! が等価と思う図を作成したものであり、実際にこのような回路で構成されている保証はありません。
EMSX_TOP.VHD に記述されている回路が最上位の階層になっています。
最上位の階層では、各入出力ポートと各種パーツを配線しているのと、いくつかのロジックが組み込まれています。
QuartusII では、階層を壊した最適化をやれないらしい(?)ので、タイミングがシビアであろう SD-RAM 周りなどは
この階層に並べてあるのだと思います。
(1) クロック分周器
概略ブロック図を下記に示します。
21MHz のクロックから、3.58MHz の CPU クロックなどを作っている部分です。
variable な jc を使って、:= 代入があるので、ちょっとブロック図との対応が分かりにくいですが、
たぶんこんな感じの回路になっていると思います。
奇妙なのは、FF に初期化が入っていないのに、循環型のシフトレジスタになっている点です。
clkdiv にも初期化がありません。
FPGA (あるいは Cyclone固有でもいいですが)って、明示的に初期化しないと、0 か 1 かに初期化される仕様でもあるのでしょうか?
ちょっと理解に困ってしまいました。
3.58MHz は、21MHz の基準クロックを6分周すれば生成できます。
なので、cpuclk は、21MHz を3分周した周期で反転させてやれば、3.58MHz のデューティ50% な波形を作れるため、
もう少し素直に書き換えることも出来そうです。
ということで、書き換えてみました。
書き換え版のテストベンチ (ModelSIM用)
使用 Logic Cells に違いはありませんが、非同期リセットが入っているので、リセットボタンでしっかりリセットが掛かります。
(2) クロックセレクタ
1chipMSX の DIPスイッチ 6番を ON にすると CPUクロックが 10MHz になります。
このクロック決定に使われるのがクロックセレクタ回路です。
概略ブロック図を下記に示します。
この図からもわかるように、セレクタとしては4種類をセレクトしてますが、実際は cpuclk か clkdiv(0)
のいずれかが pCpuClk として出力されています。
cpuclk は、21MHz を6分周した 3.58MHz。clkdiv(0) は 21MHz を2分周した 10MHz。
pCpuClk は、FPGA の I/O出力ピンですが、基板上ですぐに迂回して FPGA の CLK 入力に接続されています。
その CLK入力は、CPU とカートリッジへの供給クロックとして使われているため、10MHz 動作にすると
カートリッジに規定外のクロックが投入される(適正は 3.58MHz)ことになり、外部機器に対してはオーバークロック
動作となります。
10MHz 動作の時に、SCC搭載ゲームを動かすと音が高くなるのはこのためです。
10MHz モードで使うときは、接続するカートリッジには注意しなければなりません。タイミングにシビアな機器
を接続すると破損するおそれがあります。
回路の構成上、10MHz 動作中に DIP-SW6 を OFF に切り替えると、3.58MHz モードへ戻りますが、
3.58MHz モード時に DIP-SW6 を ON に切り替えても、ハードウェアリセットするか電源を入れ直すまで 10MHz モードへ
戻らないようになってます。
なにか事情があるのかもしれませんが、どうしてこんな構造になっているのかはソースからは読み取れませんでした。
ソース中には、図中に記載していない SelfMode なる信号もありますが、これはどうやら 1chipMSX 基板を複数枚接続して
マルチコア環境のような構成にした場合に、制御側か否かを示す信号だったようですが(残骸?)、
'1' に固定されているので、ここでは無視しても良さそうです。
※図には (cpuclk = '0' and clkdiv = "00") の部分が記述されていないので、厳密には等価ではありません
改造した EMSX_TOP.VHD を置いておきます。
改造内容については、アーカイブされてる readme.txt を見てください。
改造版 EMSX_TOP.VHD
PSG
[▲上へ]