ライン

PICによるカラーコンポジットビデオ信号出力実験(高解像度化)

ライン

2013年9月16日

 これまでPIC32MX120F032Bを用いて、160ドット×100ドットの8色カラービデオ出力実験や、キャラクターフォントを定義して解像度を上げるカラーテキストビデオ出力実験をしてきました。内蔵SRAM容量が8KBしかなく、これ以上グラフィック解像度を上げることはできませんでしたが、同じ28ピンDIPでSRAM32KB搭載のPIC32MX150F128Bを入手しましたので、早速高解像度化の実験を行いました。

実験結果画像

ハードウェア

 PIC32MX150F128Bは、これまでに使用したPIC32MX120F032BからSRAM容量、フラッシュメモリ容量がそれぞれ4倍になっただけで、ピン配置や周辺機能は全く同じなので、そのまま差し替えることができます。今回は、パックマンやテトリスで使った基板をそのまま流用しました。そのためPORTBにスイッチや音声出力がつながっていますが、特につけなくても動作に問題はありません。
 これまでビデオ出力のDAコンバーター部分を5本の抵抗で形成していましたが、テレビによってはうまく表示されないことがあるようなので、75Ωの抵抗で接地することにしました。これまで問題なく映っていれば、特に追加する必要はないでしょう。
 いつもの注意ですが、発振子は必ず3.579545MHzの水晶発振子を使ってください。また、今回プログラムの都合で、PORTBの全ビットに常時データが出力されてしまいますので、汎用出力としてRB5〜RB15を使用することができません。汎用入力や周辺機能割り当てで使用する分には問題ありません。

回路図

設計

 これまでの経験から、カラーコンポジット信号出力の実用的な解像度は、横240ドット、縦224ドット程度までであることがわかっています。その場合、図のようにカラーサブキャリアの4分の3周期が1ドットとなります。これはカラーテキスト出力版と同じで、システムクロックは3.58MHzを16倍した約57MHzとして、4命令ごとに信号出力し、12命令で1ドットを表現することで実現できます。規定では50MHzまでしか対応していませんが、PIC32MX1xxシリーズのオーバークロック耐性はこのCPUでも同じのようで、57MHzでも問題なく動作しています。

波形

 色数は内蔵SRAMの容量が32KBあるので、4ビット色(16色)でも26.25KBと実現できそうですが、今回はこれまでとの互換性を考え、3ビット色(8色)のままとしました。
 ビデオメモリの構成もこれまで同様、横方向に16ドット単位で左が上位となるように並んだプレーンがB、R、Gの3枚で画像を形成します。実際には1つのunsigned shortの配列として実装しています。せっかくの32ビットCPUなので、本当なら32ビット単位のほうが扱いやすいのですが、過去との互換性を考え、今回も16ビット単位としました。
 なお、どうしようもないことなのですが、この方式では1ドットの縦横比が1:1にはなりません。約1.3倍程度横に長い長方形となります。

ビデオメモリ構成

映像信号タイミング

 今回の映像信号のタイミングは下図のようになります。画像部分の2880Fcyは、カラーサブキャリアの180サイクル分にあたります。テレビではこれがぎりぎりのようで、ものによっては左右が少し切れるかもしれません。

水平1ラインのタイミング

プログラム

 全体的な構成はこれまでにいくつか作成したものとほぼ同じなので、少し手を加えるだけでできたのですが、映像信号生成部分は、これまでの横160ドットでも苦労してプログラムを実装したのに、横240ドットとなるとかなり工夫が必要でした。今回の一番の工夫は、MIPSの命令表とにらめっこして見つけた「SWL命令」です。
 本来はSWR命令と組み合わせて、メモリの4バイト境界をまたいで32ビットデータを書き込む時に使うのですが、うまく使うと、32ビットレジスタの内の任意の1バイトを、シフト命令などを使わなくても、1命令でメモリに書き込むことができます。ただし、同時に1〜4バイトを書き込んでしまうので、書き込みたい場所以外にも書き込んでしまうことになります。今回PORTB(LATB)への出力にこの命令を使用しました。そのため、PORTBの上位ビットまで犠牲になってしまいました。また、実際に動作させて確認したところ、アドレスが4バイト境界のうちの2バイト目でこの命令を実行したときだけ、2クロック必要となるようです。このときメモリへの書き込みは3バイト行われるので、多分、同時に3バイトをメモリに書き込む機能がMIPSにはないからなのだろうと想像しています。

ソースプログラムのダウンロード

 ソースプログラムは、composite32-high.cとcomposite32-high.hが本システムの本体で、composite32-high-demo1.cがmain関数を含む、使用例です。使用方法は以前の160×100ドット版と同じで、最初にinit_composite()という関数を呼び出すことで、あとはビデオメモリであるVRAM[ ]という配列に書き込みを行うだけで、勝手に表示されます。デモプログラムの中には、点の描画、直線の描画、円の描画、フォントやキャラクターの描画方法の例がありますので、参考にしてください。この直線と円の描画については、Fussyさんのアルゴリズムのコーナーを参考にしました。
 私の開発環境は、MPLAB IDE Ver 8.80です。コンパイルに際して、最適化オプションは特に指定してもしなくても、問題なく動作しています。

実験結果

 下の左側が、これまでの160×100ドットの画像で、右側が今回の240×224ドットの画像です。表現力が大幅に変わっていることがわかると思います。ただ、縦に細い線で色が崩れる場合がこれまで以上にあり、あまり厳密な使い方には向きません。また、円の部分を見るとわかるように、ドットの縦横比が1:1からかなりはずれていて、真円が楕円になってしまっています。真円に見せるためには、利用側で補正する必要があります。

サンプル画像1
160×100ドット8色

サンプル画像2
240×224ドット8色

 YouTubeに紹介動画をアップしました。文字のスクロールやキャラクターの動きが見られます。

最後に

 カラーテキストビデオ出力版と同等の解像度のものを、ドットグラフィックで実現できました。表現できる色数は少なくなりますが、以前作ったパックマンなどもドットグラフィックによる細かい動きが実現できそうです。
 PIC32MX150F128BやUSB搭載のPIC32MX250F128Bは、フラッシュメモリ128KB、SRAM 32KBと、28ピンDIPのPICにしては非常に豪華な構成となっています。今のところ秋月電子をはじめ国内の店舗では販売されていないようですが(2013年9月15日現在)、手軽に入手できるよう、ぜひ取り扱いをして欲しいチップと感じました。価格はできれば300円台を期待したいところです。
(2014.4.4)PIC32MX250F128Bが秋月電子で取り扱い開始となりました。税込360円とお買い得です。

Copyright (C) KenKen All Rights Reserved.