MB-6892
MB-S1

アップスキャンコンバータを作る

 レベル3の映像出力はデジタルRGB、MB-S1は輝度信号が加わってRGBIを採用しています。デジタルといってもHDMIではなくR,G,Bの各信号がON/OFFするだけの単純なもの。そして水平周波数が15.75kHz、垂直周波数が60Hzとなっています。

 一方、昨今のパソコン用モニタはHDMIが主流でそのまま接続は出来ません。ただモニタの中にはアナログRGB(VGA端子)を持っているものがあり、これなら直接接続することもできます。とはいえ水平周波数が31.5kHz以上にしか対応していないモニタが多く、結果接続できても表示されないといったことになります。水平周波数15.75kHzに対応したモニタは現在ほぼないといった状態です。

 レベル3/S1用のブラウン管モニタもいつ壊れるかわからないし、現役のモニタで表示できるようにしておきたい。というわけで、今回はレベル3やS1に特化したアップスキャンコンバータをFPGAで作っていきたいと思います。

解像度を調査

レベル3/S1とVGAの解像度
レベル3/S1とVGAの解像度

 レベル3/S1はドットクロックに16.128MHzを採用しているので、水平周波数は16.128/1024*1000=15.75kHz。垂直周波数は15.75/262*1000=60.115Hzですが、262.5ラインとすると15.75/262.5*1000=ちょうど60Hzとなります。出力信号は全てTTLレベル。R,G,BそれぞれがON/OFFするだけなので8色、S1は輝度信号ON/OFFが加わるので15色となります。

 一方VGAの解像度はWikiの情報によると、ドットクロックが25.175MHz、水平ドット数が800なので、水平周波数は25.175/800*1000=31.469kHzです。垂直周波数は31.469/525*1000=59.94Hzとなります。入力信号はアナログで、0~0.7Vの電圧で明るさを調節します。

 VGAの水平周波数はレベル3/S1のほぼ2倍、垂直のライン数も2倍になっていることが分かりました。ということは、レベル3/S1の1ライン分を2回繰り返してモニタ側に出力すれば表示できそうです。

設計

 まずはFPGAまわりの回路から考えます。


アップスキャンコンバータを作る 回路図 (クリックで拡大)

 入力側は各信号を74LCX244で電圧レベルを変換した後FPGAに入れています。信号が来ていないときにR,G,Bはプルダウン抵抗で"L"レベルに、HSYNC,VSYNCとIはプルアップ抵抗で"H"レベルになるようにしています。

 FPGAからの出力は74LS06を通します。モニタ側の入力インピーダンスが75Ωなのでプルアップ抵抗で電圧を調整します。R,G,Bは最大電圧が0.7Vぐらいになるようにしておきます。さらに輝度信号OUT_IがONになれば色を暗くするためさらに電圧が下がるようにします。暗くする度合いは可変抵抗で調節できるようにします。

 つぎにFPGA内部を考えていきます。


アップスキャンコンバータを作る FPGA内部ブロック図

 ブロック図の内容を簡単に説明すると、

 今回FPGAは128MHzで動作させます。入力側クロックは、レベル3/S1のドットクロック16.128MHzに合わせたいのですが、FPGA内では作れないのでとりあえず16MHzにします。出力側クロックは、VGAのドットクロック25.175MHzに近い値として25.6MHzにします。これは128MHzを5分周した値となります。


出力側の解像度

 水平ドット数は25.6/(25.175/800)=813.505...となるので814とします。水平周波数は25.6/814*1000=31.45kHz、垂直周波数31.45/525*1000=59.9Hzとなります。フロントポーチ、バックポーチ、同期パルス幅はVGAとは若干異なる値にしています。

表示できるかな

 ではブレッドボード上に実装していきます。レベル3/S1側にはDIN8ピンのプラグ、モニタ側にはD-Sub15ピンのプラグを接続します。


おなじみのブレッドボードに実装

 まずは、レベル3に接続してテストします。ラズパイ用に購入した10.1インチの中華製液晶モニタに接続して準備完了。


レベル3に接続した状態

 電源ON。まぁ始めは映りません…。いくつか不具合を修正して再度起動すると、おっ文字が浮かび上がりました。表示位置のずれは液晶モニタにある機能で調整します。


40字で表示したところ

 40字で表示させた場合はドットもかなりくっきりと判別できますが、80字で表示させると一部の文字がちらついています。


80字で表示したところ

 ここでタイリングペイント(市松模様)で表示させてみます。


タイリングペイントで黒い筋が出る

40字(320x200ドット)でも黒い筋が

 縦に黒い筋のようなものが写っています。どうやらこの付近でサンプリングするタイミングに問題がありそうです。

サンプリング位置を調整する

 先ほどの黒い筋。これはレベル3/S1のドットクロック16.128MHzに対して、FPGAが16MHzでサンプリングをしているところに問題があります。


サンプリング位置を調整

 上の図のように、レベル3/S1のクロックが若干速いために取りこぼしてしまうドットが出てきます。そこで、FPGAでサンプリングする周期を16MHz一定にするのではなく、何回かに1回すこし周期を早くすることでレベル3/S1のクロックに合うように調整します。これを実装して黒い筋(モアレ)が改善するかを試してみます。


黒い筋が消えた

 結果、黒い筋が消えてきれいに表示されました。なお、この周期を早くするタイミングは押しボタンで調整できるようにしました。

背景色を出す

 レベル3の背景色は表示領域内部だけでなく外部にも色を出力しています。ここで背景色を緑色にしてみます。


表示領域内の色が反転してる!?

 あれ、表示領域内の色が緑になりません。文字色がマゼンタになっていたりとなんだか色が反転しています。どうやら水平フロントポーチやバックポーチで色信号を出力しているとこのようになるみたいです。VGAに関する説明でこれに言及している資料が見つけられなかったのですが、もしかするとアナログテレビの仕様にあるカラーバースト信号と関係しているのかも。


背景色を出力する範囲

 ということで、上の図のように垂直フロントポーチやバックポーチには信号を出力せず、水平方向はすこしはみ出る程度になるよう修正をしました。


背景色が出力された

 結果、無事背景色が表示されるようになりました。

インターレースのちらつき

 レベル3は電源ON時のデフォルトがインターレースで表示されます。インターレースでの画面を拡大したのが次の写真です。


インターレース調整前

 上の写真は上下に手ブレしているわけではなく、偶数フレームと奇数フレームでラインがずれて表示されるので、ちらついてこのように写ります。このちらつきが若干見づらいので調整します。

 下の図はレベル3から出力される垂直同期信号(VSYNC)が立ち上がるタイミングと水平同期信号(HSYNC)の状態を示したものです。


VSYNCとHSYNCの位置差(ノンインターレースおよびインターレース偶数フレーム時)

 インターレースかどうかはVSYNCの立ち上がりとHSYNCとの差で判断します。下の図のようなパターンの場合に、サンプリングしたデータを1ラインずらしてメモリに記録するようにします。


VSYNCとHSYNCの位置差(インターレース奇数フレーム時)

 この修正を行ったのが次の写真です。


インターレース調整後

 調整後の写真はアルファベットの輪郭がはっきりしています。ひらがなはインターレースでしか表示できない文字なので写真ではつぶれた感じになりますが実際はちらついて表示されます。

明るさを調節できるか

 次は、輝度信号を持っているMB-S1に変更して色の明るさを調節できるか検証します。


S1で表示したところ

 明るさを検証する前にMB-S1でも問題なく表示できることを確認。絵が横長なのは液晶モニタが16:9モードになっているためです。ブレッドボードにはオシロスコープのプローブを接続しています。

 では、MB-S1のパレットを変更して、青、赤、緑の明るい色と暗い色を比較してみます。


明るい色と暗い色を比較

 明るい色はそのまま表示されます。暗い色は可変抵抗を使って問題なく「暗さ」を調節できました。

 ここで出力される信号も確認してしてみます。まずは垂直&水平同期信号ですがこちらはTTLレベルで+5Vまで出ています。周波数も設計通りの値が出ています。


垂直&水平同期信号

 次は色信号&輝度信号です。色信号はアナログ、輝度信号はFPGAから出た直後のLV-TTLレベルで+3.3Vが最大になります。


色信号&輝度信号

 輝度信号がON(負論理なので"L")のときの色信号は+0.7V近くまで上がります。輝度信号がOFFのときは+0.5Vぐらいになっています。色信号が0VにならないのはTTLのロジックICを使っているからだと思われます。

 信号が変化する付近では電圧が波打ちます(リンギング)。アナログ回路ではこれがノイズとなります。これが大きいと色の境界がにじんだり画面に縞模様ができるなどの弊害が出てきます。


少し縞々のモアレが出ている

 縞模様はこのモニタだと目で確認することはできませんが写真には写りますね。もっと大きいモニタだと目で確認できるようになるかも知れません。

まとめ

 いやーこれでモニタ問題も解決。いやいや、最近はVGA端子がないモニタが多くなっているしHDMIに対応しないといけないのでは!?しかし、このFPGAではHDMIで使用するような高クロックは出せない。VGA→HDMI変換はないものかとAmazonで検索していたら普通に売っていました。アナログRGB21ピン→HDMIなんてのもありますし、そんなに困るような状況ではなかったですね。

 インターレースの対応についてはもっとブラッシュアップしたいですね。インターレースは本来200ラインなのを疑似的に400ラインで表示するものなので、この400ラインをそのまま出力するようにすれば、ひらがなもきれいに表示されるのではないかと思います。

 ちなみに他のレトロパソコンに対応できるかを調査してみたところ、FM-7が同じドットクロックなのでそのまま使用できそうです。PC-8001やX1はドットクロック14.318MHzなのでこちらはクロックの修正が必要になりそう。今後この辺りも試していきたいですね。

追記(2021-03-06)

 ユニバーサル基板に実装しました。電源は実機のRGBカラー端子から出ている+12Vを三端子レギュレータで+5Vに降圧して使用します。ON/OFFスイッチを設けて従来どおりUSBから供給できるようにもしています。また暗さを調整する可変抵抗は200Ωにしました。


アップスキャンコンバータを作る 回路図(ユニバーサル基板)

ユニバーサル基板に実装したところ

 三端子レギュレータは予想以上に発熱します。小さい放熱板だけだと触れないほど熱くなります(計測したら70℃ぐらい)。そこで工作用の銅板を張り付けたところ触れるぐらい(だいたい45℃)になりました。ちなみに室温は22℃ぐらいです。


実機と接続して確認

 インターレースのちらつきを解消するため画面を2倍(400ライン分)保持するようにしました。これで、ひらがなもはっきり表示されるようになりました。


ひらがなもきれいに表示された

参考文献

  1. I/O別冊ベーシックマスター活用研究 - 工学社
  2. I/O別冊S1活用研究 - 工学社

◆関連ページ◆

S1にRGB→VIDEO変換基板をつなぐ

 

FPGAで8ビットパソコンを拡張する

 

TOP PAGE