今の構成は、
CRTC は、14MHz で912×262を出力(1画面分、約1/60秒)
↓
2ポートRAM で乗せ換え(1画面分のRAM)
↓
VGA への出力は、25MHz で、800×524を出力(1画面分、約1/60秒)
となっています。
途中の1画面分のRAM がかなり大きく、今の構成では、5 bit × 65535 word を使っています。
1 word 分(5ビット)が、1ドットに相当していて、色データを適当にエンコードして実装しています。
で、この乗せ換えのRAMを減らす方針ですが...
・ CRTC の1画面の周期と、VGA の1画面の周期を完全に合わせる
です。
これだと、乗せ換えのRAM は1画面分は必要ではなく、揺らぎ分を吸収するだけでよくなります。
この時に、出来る事と出来ない事を整理すると...
・14MHz、25MHz のクロック周波数は、動作途中で変更する事は出来ない。
・CRTC の出力クロックを変更するのは不可(本物の動作と変わるため)。
・PLLを使って、完全に合わせるのは難しい。ずれた時の対処も難しい。
なので、結論としては、VGA の出力を変更することになります。
VGA の仕様は、25.175MHz で、水平方向に800クロック、垂直方向に525クロックのようです。
ですが、このクロック数は、多少増減しても動作はするみたいです。現に今の回路は524クロックになっています。
計算してみると、垂直方向のクロック数を、520クロックもしくは522クロックのどちらかにすればいいようです。
通常、520クロックにしていて、ある程度ずれたら522クロックを挟む、という構成になります。
VSYNC から後ろの方のラインを2ライン分抜く事になるので、問題にならないかと思います。
で、実装してみましたが...
パソコン用モニタ3台、液晶テレビ(パソコン入力あり)1台試しました。
・パソコン用モニタ1台目:正常動作
・パソコン用モニタ2台目:正常動作
・パソコン用モニタ3台目:同期が取れず
・液晶テレビ :同期は取れたが、上下にふらふらする
と動かないものがありました。最近のものの方がNGです。
うーん...もうちょっと解決策を探ってみます。