[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

[▲上へ]