2001. 10. 14
LCDモニタや小型CRTモニタのジャンク品が多く出まわるようになってきていますが、自作のマイコンボードにそれらを接続して活用してみたいと思うことがよくあると思います。
何年か前、たった1個のPIC(16C84)だけでテレビに画像を出力するという製作記事がありました。その記事を目にしたときは、目からうろこが落ちるような印象を受けた覚えがあります。チープなワンチップマイコンでビデオ信号を合成しようというのは、とても興味深い試みといえます。
しかし、それを実際のシステムに応用することは非現実的といえます。なぜなら、ビデオ信号の合成にほとんどの時間を取られるので、必要な処理を十分に行うことができなくなってしまうからです。また、任意の図形や文字を表示することさえ不可能で、表示できるのは単純な模様やそれに類する物に限られます。そのため、このテクニックの応用例は凝った物でもオシロスコープもどきがせいぜいといったところです。やはりまともな表示をするにはディスプレイコントローラが必要になってくるのです。
そこで、これらのモニタを自作マイコンボードなどで手軽に使えるようにする汎用ディスプレイコントローラを製作してみることにしました。
コミケット59でのデモ映像 2002. 12. 6
これ以前にも個別部品で製作したことがあります。しかし、これに使用した第一世代CRTC(HD46505の類)は現在は殆どディスコンとなっていて入手が困難になっています。したがって、引き続き再現性を保つためにはCRTCの代替品を探さなければなりません。
そこで、最近流行のザイリンクスXC9500シリーズを使ってCRTCや周辺ロジックを1個のCPLDに入れてしまおうと考えてみました。CPLD+メモリの2チップ構成です。
開発の目的から汎用性を第一に考えた仕様とします。まず、制御インターフェースは手軽なSRAM互換とします。このようにしておけば殆ど全てのマイコンに容易に接続することができるはずです。古いマイコンボードのメモリソケットへということさえ可能でしょう。外部バスの無いマイコンの場合は、I/Oポートを使って制御できます。
ビデオ出力はRGB出力としてジャンクのLCDモニタやCRTモニタに直結できるようにします。しかし、RGB入力のモニタはどこにでも転がっているというものではないので、ほかに少なくとも普通のテレビに接続できる必要があります。
数インチ以下のモニタに表示するにはテレビゲーム程度の320×240ドットもあれば十分でしょう。テレビに映す場合も同様です。これらは解像度が低いので、この程度でちょうど良いです。また、解像度を上げるとデータ量が増えることになり、チープなマイコンには処理が重くなるなどデメリットとなってしまいます。同様に色数についても自然画像の表示が目的ではないので、16色程度で十分と言えます。
以上のような条件からディスプレイコントローラの基本仕様を次のように設定しました。
右のIMGに本器のブロック図を示します。CPLDには最近流行りの XC9500シリーズのうち中規模の XC95108(PLCC)を使用します。このチップは108個のマクロセルと69本のI/Oピン(うち数本はグローバル機能ピン)を持つもので、今回の製作にはちょうど良い規模です。
CPLDには制御機能を全て詰め込んでしまいます。これにより配線を大幅に単純化することができました。CRTC部はディスプレイ出力のタイミングを生成するカウンタ群です。タイミングコントローラ部は、ホストアクセス/表示アクセスの調停とビデオバッファを制御するメインロジックです。
CPLD以外で必要な半導体部品はSRAMとクロックオシレータくらいです。ビデオバッファには一般的な1MビットSRAMを使用しています。今回はRGB出力のほかにさらにNTSC出力が必要なため、NTSC/PALエンコーダ(CXA1645M)も追加しています。
本機の回路図です。とても簡単ですね。ICも3個しか使っていませんし、配線数も前作と比べて大幅に減らしています。パーツには特殊なものは使用していませんので、秋葉原を一巡すれば全て揃います。これくらいなら誰でも簡単に作れるといえるレベルでしょう(ほかに最低でもCPLD開発環境は必要ですが)。
CPLDからのビデオ出力データ(4ビット)は抵抗マトリクスでRGB信号に変換されます。RGB信号はCXA1645MでNTSC信号にエンコードされ、同時にRGB/S/コンポジットに3分配されます。エンコードに必要な3.58MHzのカラーサブキャリアクロックはCPLDで生成してCXA1645Mに供給します。
製作にあたって特に注意すべき点はありません。もちろん、電源ラインをしっかりするとかパスコンを入れるなど、基本的なことはちゃんやっておく必要はありますが。本機ではデジタル回路とアナログ回路が混在しています。いい加減に作ると画質が悪くなりますので、そのへんは注意しながら組み立てる必要があります。
製作したCRTコントローラを右のIMGに示します。今回は奮発して基板を起こしてみましたが(やるか?普通(^^;)、アートワークはとても楽でした。CPLDはピン配置がユーザ・プログラマブルなので、配線の都合が良いようにピン配置を決められるからです。なるべく信号線の交差が無いように割り当てたため、ほとんどを1層で配線できました。裏側はほとんどベタアースになっています。
アナログ的な調整個所はありません。組み立てに間違いが無ければ一発で動作するはずです。配線に間違いが無いかチェックしたら、電源を入れてヒューズデータ(crtif2a.jed)をXC95108に書き込みます。書き込みが終わるとすぐに動作を開始します。本機をRGBモニタに接続して表示した様子をこのページのトップに示します。
ディスプレイ・コントローラはホストコントローラと組み合わせてはじめて意味を持つものなので、単体では完全な動作確認ができません。でも、ホストインターフェース部以外の動作は単体でも確認できます。モニタを接続してVEN#にLレベルを入力するとビデオ出力が許可されブランキングが解除されます。このときモニタの画面いっぱいにランダムパターンが表示されて同期が取れていればOKです。どんなパターンになるかは個々のSRAMチップによって異なります(真っ黒または真っ白かもしれない)。
ホストプロセッサとのインターフェースは、40ピンコネクタを介してとるようになっています。次に各信号の意味を示します。
| XA[15:0] XD[7:0] | アドレス入力とデータ入出力。SRAMのアドレス/データに相当します。 |
| CE# WR# RD# | 読み書きコマンド入力。SRAMの制御ピンに相当します。 書き込み時は、対象アドレスと書き込むデータを与え、CE#とWR#をアサートすると データがビデオバッファに書き込まれます。 読み出し時は、対象アドレスを与え、CE#とRD#をアサートすると、データバスにビデオ バッファのデータが読み出されます。 |
| WAIT# | ホストからのアクセスに対するウェイト要求信号。有効なコマンド入力に応答して アサートされ、処理が完了するとデアサートされます。 |
| VEN# | ビデオ出力イネーブル入力。デアサート状態ではビデオ出力はブランキングで、アサートする とビデオ出力が有効になります。この機能を使用しないときはアサート状態に固定します。 |
| DISP | 垂直表示期間表示。つまり垂直ブランキング期間中はデアサート(Lレベル)されます。 垂直割り込みなど同期描画のタイミングを得るのに使用可能です。 |
| GND VCC | 電源端子。VCCは+5V 250mA程度必要です。 |
ホストインターフェースを介してディスプレイメモリを直接アクセスして描画します。SRAM互換インターフェースなので、基本的にSRAMをアクセスするのと同じ手順です。ただし、内部動作との調停のためバスタイミングによってはWAIT#でサイクルの延長が必要になります。
実際のタイミングチャートとタイミング値を右に示します。図ではRD#/WR#ストローブとなっていますが、SRAMと同様にCS#ストローブでも使用可能です。
| 項目 | 意味 | 最小 | 最大 | 単位 |
|---|---|---|---|---|
| tWR | WAIT# 応答時間 | - | 15 | ns |
| tSU1 | 読み出しアドレスセットアップ時間(対コマンド) | 0 | - | ns |
| tREAD | 読み出しコマンド実行時間 | 140 | 485 | ns |
| tH1 | 読み出しアドレス/コマンドホールド時間 | 0 | - | ns |
| tSU3 | 書き込みアドレス/データセットアップ時間(対コマンド) | 0 | - | ns |
| tWRITE | 書き込みコマンド実行時間 | 70 | 415 | ns |
| tSU2 | 読み出しデータセットアップ時間(対WAIT#↑) | 15 | - | ns |
| tH2 | アドレス/コマンド/データホールド時間 | 0 | ∞ | ns |
| tON | バスドライバON時間 | - | 9.5 | ns |
| tOFF | バスドライバOFF時間 | - | 9.5 | ns |
| tREC | リカバリー時間 | 70 | - | ns |
メモリマッピング図。水平320ドット、垂直240ラインの表示となります。1バイト当たり2ドットのパック化ピクセルとなるので、1水平ライン当たり160バイトということになります。例えば、ロケーション0000hにデータ24hを書き込むと画面の左上のドットに赤、その右隣のドットが緑に点灯します。
メモリアドレスは16ビットなので64Kバイトのメモリ空間となりますが、表示エリアは0000h〜95FFhまでとなります。この表示エリアはAOFSジャンパで4000hシフトすることもできます。非表示エリアのメモリは任意の用途に使えます。
240ライン表示では、普通のテレビに表示したときに表示エリアの上下が画面から若干はみ出します。はみ出さないようにしたい場合、V200ジャンパで表示を200ラインに変更できます。200ラインモードでは表示エリアが32Kバイトに収まるので、物理メモリ空間の狭いマイコンでもリニアにマッピングできると思います。
出力は基本的にテレビゲームなどと同じノンインターレースとなっています。ビデオ出力の仕様は次のようになっています。
| RGB出力 | RGB:0.7Vp-p(75Ω終端時) 同期:HV混合、TTLレベル負極性 |
| SV出力 | Y:1.0Vp-p(75Ω終端時) C:286mVp-p (75Ω終端時) |
| CV出力 | 1.0Vp-p(75Ω終端時) |
| 項目 | 意味 | 値 | 単位 |
|---|---|---|---|
| nHt | 水平トータル期間 | 227.5 | ACLK |
| nHd | 水平表示期間 | 160 | ACLK |
| nHsp | 水平同期位置 | 181 | ACLK |
| nHsw | 水平同期幅 | 17 | ACLK |
| nVt | 垂直トータルライン | 263 | ライン |
| nVd | 垂直表示ライン | 240 | ライン |
| nVsp | 垂直同期位置 | 224 | ライン |
| nVsw | 垂直同期幅 | 3 | ライン |
| - | 水平同期周波数 | 15.73 | kHz |
| - | 垂直同期周波数 | 59.8 | Hz |
内部動作のタイミングチャートを示します。ACLK(アドレスクロック)を1サイクルとして、表示アクセスの隙間にホストからのアクセスが挿入されているのが図を見ると分かる思います。ACLKが3.58MHzであるため、ホストアクセスの最大データ転送レートは、3.58Mバイト/秒ということになります。
また、ビデオエンコードの際、カラーサブキャリアのスペクトラムインターリーブを保つため、水平期間が 227.5 ACLKとなるように水平期間の最後でACLKを0.5クロック延長しています。
用途に合わせてちょっと仕様を変えてみたいという場合も、CPLDのロジックの変更だけで済むことがあります。変更例をいくつか紹介してみましょう。
例えば、外部バスの無いワンチップマイコンのI/Oポートに接続して制御したい場合、SRAM互換インターフェースのままではI/Oポートを28ビット(アドレス16+データ8+制御4)も占有してしまうことになります。このような場合、次に示すようにインターフェース方式を変更して、アドレスとデータを共用にすれば最低11ビット(アドレス・データ8+制御3)のI/Oポートの割り当てで済みます。これなら20ピン程度のマイコンでも十分使えるようになります。
漢字を多く表示したいなど、より高い解像度が必要な場合、オシレータとビデオ出力部を回路図に示すように変更します。これでパソコン用のVGAモニタを使用可能な 640x480ドットの出力に対応することができます。単色ですが、ちょっとした業務用端末などの用途には十分な表示能力といえるでしょう。ビデオメモリの構成は、1バイトで水平8ドット分(VGAアダプタのモード11hと同じ)となりますので、多くの描画ライブラリを流用できます。写真はプロトタイプをVGA出力に変更したもの。
