あたらしいグラフィックボードを検討する!の巻 2020.12.5

現在のCPM68KはPCから独立して動作できるようにしています。すなわちRS232でPCに接続して使用するのではなく、
VGAモニタキーボードを接続して動作させるようにはなっています。VGAの基本仕様は800x600の表示規格をつかって
800x512Dotでつかっています。これに必要なメモリーは512kW(1MB)と切りのいい数字になります。
一応、独立して使えるようにしているのはいいのですが、現在のグラフィックRAM(GRAM)にはまだまだ欠点があります。

1.GRAMに書き込むと画面にノイズが生じる
 現在のGRAMの構造は下図のようになっています。このためRAMに書き込むときには、描画のための読み出しができません。
 そのため、描画の最中にRAMをアクセスすると画面にチラチラとノイズがでてしまいます。GRAMへのアクセスはCPU側が優先なので
 いたしかたありません。ノイズを抑えるためには、描画以外の時間帯、すなわちVGA信号の水平あるいは垂直の帰線時に
 にCPUからRAMにアクセスする必要があります。



現在のグラフィックボードの構成。アクセスはCPU優先なので、描画中にアクセスがあると
画面にチラツキノイズがでます。



スクリーンエディターでスクロールしているときの画面。画面にノイズがでてしまいます。


2.ノイズを抑えると描画速度が遅くなる
 画面のチラチラノイズを抑制するには、描画以外のタイミングでGRAMにアクセスをするようにしなければいけませんが、
 これを行うと、動作速度が極端に低下します。というのも描画の時間割合は全体の6割強になるので、反対に
 残りの4割弱の時間帯しかRAMへのアクセスができません。描画期間中はGRAMへのアクセスを待たせる必要があります。
 要はチラつきノイズを抑えると、描画速度が1/3程度まで落ちてしまいます。いや、実際にはもっと落ち込んでいます。
  というのも当初はCPUがRAMにアクセスをしたときに描画中ならCPUにHALTをかけるようにしたのですが、
 これが大失敗でした。CPUにHALTをかけると、バスの値が途中でとまるのでチラチラノイズではなくて
 画面の表示が消えてしまいます。これはチラつき以上に画面が乱れてしまいます。
  そのため、同期信号がでている間をプログラムでポーリングしてGRAMに書き込むようにしたのですが、これが遅い。
 もちろん画面のノイズが消えましたが、描画速度がHALTをかけるよりさらに遅くなりました。というのも、ソフトウエア
 でポーリングしているので、1点描画する間にに20クロック程度の命令を余分に実行しています。約1us程度の時間ロスです。
 これが全画面になると約0.5sが追加でかかることになります。
  体感的にスクリーンエディターを動かしてみると、行の挿入や削除をおこなうとかなり鈍くて、ちょうど9600bくらいの
 RS232で動く端末程度の速度になってしまいます。この速度はキャラクター表示だけではなくグラフィック表示も同様です。

  そのため、現在は速度を優先して、チラつきノイズを許容してつかっています。まあ、ノイズも気にしなればいいのですが、
 気にしだすと気になってしまいます。


800x600のVGA描画タイミング。全体に占める画面描画は6割強になるので、それ以外のタイミングでのみ
アクセスしようとすれば全体のスループットが落ちます。



3.色にむらがでる
  GRAMの色情報は16ビットなので65k色になります。RGBにそれぞれ、5,6,5ビットを割り当ててR-2RのDACでアナログ
 出力としていますが、電源ラインのノイズや信号線のノイズがロジック回路の出力に重畳するので、それに影響を受けて
 アナログ出力にノイズが乗っています。これが色むらの原因になっています。
  ちょうど、真っ黒に表示させた場合には薄い線状のムラが見えます。反対に真っ白に表示させた場合にでも、ところどころ
 で色の薄いところがでています。まあ、白黒のキャラクター表示だけなら、とくに気になるものではありませんが、
 でも、これも気にしだすと気になります。
   


VGAの信号ラインにはノイズがかなり乗っています。

 
VGA信号に重畳したノイズが色むらとなってでてしまいます。


上記のように、現状のGRAMにはいくつかの課題があります。
そこで対策として、下記の機能を追加した新しいグラフィックボードを検討中です。

対策はどうするか?

1.GRAMを2系統用意する。
 CPUからは読み書きするGRAM1と、描画のためのGRAM2を分離して独立動作させるようにします。そうすれは、CPUからのGRAMアクセス
中に描画を止める必要はありません。そして、GRAM1からGRAM2へは水平と垂直帰線の短い時間で高速にデータ転送を行うようにします。
 データ転送のためのクロックを描画クロックと同じ40MHzに設定すると、512kWのメモリー転送速度は
 約80Hzで行えます。ただし、転送にかけられる時間は描画以外の時間ですから、割ける時間は全体の38%です。
 すなわち80x0.38=31Hz程度で全体のデータが転送できますので、ほとんど時間遅れは感じることはないはずです。
  GRAM1からGRAM2へのデータ転送中に、CPUからGRAM1をアクセスする場合には、当然CPU側が優先なので、データ転送を中断
 しなければなりませんので、その間はGRAM2上の古いデータが表示されるということになりますが1/30s後にはデータが書き換えられる
ことになるはずですから、違和感はないはずです。

 これを実現するにはGRAMは2セット必要になり、またデータの転送回路が必要になります。部品点数は多くなりますが
回路的にはあまり難しいものではないはずです。

 これで速度とノイズは両面で解決できます。


RAMを2系統用意して、描画中にもCPUからRAMにアクセスできるようにします。




描画以外のタイミング(水平同期、垂直同期中)にGRAM1からGRAM2にデータを
転送します。転送中にCPUからのGRAM1へのアクセスがあれば、そちらが優先で
その間はデータ転送を一旦中断します。

2.DACは別電源で動作させる
 現状のVGAアナログ出力となるR-2RDACのロジックICは電源ライン(5V)で動いていますが、電源電圧の変動があるのでその影響を
 うけにくくするために、5Vから3.3Vに電源を変更です。電圧降圧にレギュレータをつかいますので、そのレギュレータにて
高周波電圧変動が抑制されて電源電圧の変動が小さくなるはずです。また、信号ラインの電圧を変動を抑えるために
一旦、3.3Vで動作させるロジックICを間に挿入する予定です。  

回路図を考えてみる

まず、必要になりそうなICの数も見積もるためにも簡単に回路を描いてみました。
大きくなりそうなので、コントロール部分と切替部分を分けて考えていきます。

コントロール部分を中心に回路を検討です。

 
切替部分を中心に回路を検討です。

必要なIC数は

回路図から必要なIC数ですがこのくらいになりそうです。

ICピン数 個数 備考
32 16 メモリーIC(1MBit)
28 1 PIC
20 20 ロジック
16 11 ロジック
14 5 ロジック
8 1 水晶

メモリーを除けばロジックICで38個。おそらく全体をまとめたら抜けている部分もあるでしょうから
40個程度になりそうです。こりゃ、搭載できるかな〜。下記の基板に重ねるので同じサイズにする必要
があるのですが、まずは簡単にICソケットを並べて密度感を確認です。


CPM68Kの4号機に重ねて使うのですが、このサイズの基板に必要なIC数が搭載できるかなあ〜。

かなりきつそう・・・・

さすがに32Pinのメモリーを1階建てで16個並べるのは無理そうなので、2階建てにしてスペース8個分で
並べてみましたが、かなりきつそうです。ICとICの間は2個のランド分を空けたかったのですが、それでは
納まりそうにありません。なんとか載せてみましたが、これではVGAのアナログ信号を生成するR-2R DACを
搭載するスペースがありません。やっぱりRAMは4階建てにする必要がありそうです。

RAMを2階建てにすることを前提にICソケットを並べてみましたが、かなり無理がありそう・・・・。


RAMを4階建てにすることを前提にすれば、無理なくのせられそうです。

ちょびちょび準備 2020.12.7

必要な部品をちょびちょびと準備にかかります。
まずは面倒でないところからです。SRAMの4階建てを必要個数作成です。
このくらいなら、酔っ払いモードでも十分作成できます。といっても、本格配線も
いつも酔っ払いモードなので同じですが(笑。


まずは面倒でないところから着手です

懸念事項を確認

今回検討しているグラフィックボードでは、ピクセルクロックである40MHzの水晶発振にすべてを同期させて動作させます。
PICの出力も同期させる必要がありますが、PICは内部PLLで4倍のクロックアップで使用させるので、位相がずれています。
そのため、PICの出力は一旦D-FFで原発振でラッチ(叩きなおし)するようにして、同期をとります。
 このとき懸念されるのが、PICの出力波形に鈍りがあるとラッチ後の出力がHレベルになるかLレベルになるかが
不安定になることが想定されます。
 ということで、まずは確認のために下記の構成でチェックです。PICからは2CYCLE分のパルスを出力するように
プログラムしておきます。

PICの出力は2CYCLEのパルスになるようにして、D-FFでの出力を確認です。

普通に想定される出力は下図のように、D-FFの出力Bは2CYCLEの幅になります。
しかしPICの出力のエッジはあまり鋭くはありません。

通常はB出力は2CYCLEになります。

そのため、電源を入れなおして再起動すると3〜4回に1回程度の頻度で
D-FFの出力が3CYCLEになる場合があります。これはPICが4倍PLLで動いているので、
命令サイクルの位相が原発振の位相と一致した場合に生じます。
ちょうど、D-FFのHレベルギリギリのポイントで原発振が立ち上がっているので、
PICのパルス出力Aの立ち上がりと立下りの両方の場所でラッチされてしまっているからです。

結構な頻度でB出力が3CYCLEになる場合が発生します。

この問題を解消さるには、PICの位相をすこしだけずらすようにしました。
すなわちPICの発振入力に抵抗(470Ω)を入れてみました。
この抵抗とPICの入力容量でLPFが構成されるので、入力の波形がすこし遅れます。この遅れで
PLLの位相がすこしずれるので、PICの命令サイクルと原発振が同期しなくなります。

対策のためにPICの発振入力の手前に抵抗を入れて、すこし位相をずらします。

ためしに抵抗を470Ωとしましたが、結果的にはこれでD-FFの出力が3CYCLEになることはなりました。
抵抗値については、実機が組みあがればもう少し追い込みましょう。

抵抗の両端での信号の遅れは約1〜2nsほどあります。
差はわずかですが、これで同期をずらすことができます。

回路図を仕上げましょう! 2020.12.13
 事前に調べておきたいことは済んだので、いよいよ組み立ていきましょう。その前に全体の回路図を描いて
必要なICの個数を確定させておきます。


必要になるICをすべて1枚の回路図にまとめてみました。これで、必要ICの個数を確定です。

省スペース?
 このグラフィックボードではカウンタを多用するのですが、高速動作が必要なので同期カウンターを使います。
そうなると、4ビットのカウンタを複数個つかいますが16PinのDIPなので結構なスペースを必要とします。
ということで、すこしでもスペースを稼ごうと思ったことと、手持ちにICがあったこともあり、SMDタイプの74AC163を
変換基板にのせて20ビット分のカウンタを作りました。
 でも、DIPに比べてスペースが小さくなったかといえば、あまり効果はありませんでした。変換基板をつかうと
結局横幅が大きくなってしまうので、DIPと同じサイズが必要になってしまいます。


SMDタイプのICをつかって省スペース化を計ろうとしましたが、あまり効果なし。変換基板をつかった時点で駄目ですね。

配線準備!

これからの夜な夜なの配線ができるように、ICソケットを載せて電源の配線だけ済ませておきます。

必要なICソケットを搭載です。


半田面はICのピン番号のラベルを貼っています。


ラベルが張りやすいように、突起となるチップコンデンサは部品面に実装です。
ICソケットの空きスペースを利用です。


さて、あとは夜な夜な作業をすすめて行きましょう。年内には完成させたいものです。

ようやく配線完了 2020.12.31

夜な夜な配線を進めて、ようやく配線完了です。
集中してやれば1日あればできるでしょうが、なかなか時間を確保するのもむずかしです。
途切れ途切れで配線をおこなうと、どこまでやったかをトレースするのが面倒だったりします。
回路図に赤線でも書けばいいのですが、いかんせんA4サイズに書いた回路図は小さいので、書く気もおきません。
あ〜A3サイズのプリンタがほしいところですが、流石に家におくには大きすぎます。

ようやく配線が完了しました。


VGAのアナログ出力はR-2R DACになっています。


R-2R DAC部の拡大です。510Ωの1608サイズチップ抵抗をつかっています。


部品面の様子です。配線チェックが終わったらICを挿しましょう。


配線チェック!

これが結構面倒ですが、絶対に抜けや間違っているところもありそうなのでやらなくっちゃ!

(つづく)