PIC32MX HARMONY(4)
更新日:2021年10月28日

CPLDコラボ:CPLDコラボ:VGAモニタ接続ユニットを作る
今、「デジタルは裏切らない」っていう気分です。ちょっと感動しております。さて今回の製作はVGAモニタ接続のユニットです。事の始まりはこうでした。
前回の製作でPIC32MX JAN 1982の液晶画面をキャプチャーしてPCに表示出来るようにしました。このキャプチャー画面を見たら、結構いけるんじゃない。という気持ちになったのです。液晶画面もコンパクトで良いのですが、どうしても見えずらい、というのがあります。この液晶画面がVGAモニタに表示出来たら、すごいんじゃない。ということ。元々の液晶画面のサイズは320x240ですから、VGAモニタ(640x480)に表示するためにドット数が縦横2倍になってしまいますが、これでも充分実用に絶えると認識しました。それならそのようなユニットが作れないかと。ほぼ1カ月程度掛かりましたが、本日ここに発表させて頂きます。
(開発中のゲーム画面です)
如何でしょうか。大変良くできました。これで大きな画面でゲームが出来ますね。あまりの完成度に感激して、名言「デジタルは裏切らない」というのが生まれたのです。さてここから少し詳しく説明しましょう。
PIC32MXに目覚めて、カラー液晶でゲームの製作をスタートしました。その構成が下図です。
(PIC32MXとカラー液晶のシステム)
PICで生成した画面データをひたすらカラー液晶に送り込むことで、液晶に表示を行います。液晶へのデータ転送速度を効率化したので、約22msecで一画面の描画が可能です。これくらいのスピードがあれば高速ゲームも出来ます。そこでこれを大画面に表示したくなりました。HDMIはかなり難易度が高いので、VGAモニターを使うことにしました。PICだけではVGA描画とゲーム処理は不可能なので(私の技術の範疇の話)、少しWEBで同じようなことを考えている人がいないか検索を行いました。その結果、下記のような構成で可能と判りました。
(CPLDとSRAMでVGA接続ユニットを構成する)
PICからCPLDに表示データを送り込んで、CPLDはVGA表示を行うという構成です。フムフム、これなら出来そうな予感。VGA描画を基準に考えるとPICからのデータを受ける時間がありません。そこで、CPLDはVGAの基準に従い、SRAMの内容をひらすら描画する。描画を工夫することで、隙間が空くのでその間にPICからのデータを受け取りSRAMに書き込むという構成です。VGA描画とPICからのデータは完全に非同期ですので、CPLDが時間管理をうまく行うことで、PIC側に影響を与えないでVGA描画を行うことが可能となりました。WEBの記事にはカラーバーを表示するまでは沢山出てきますがここまでスムーズに高速表示が行える記事は極めて少ないと思います。すみません、自分が作ったシステムに少し感動している自分がいます。さて、ここでVGA表示はなんぞや?という方のために次の記事をおすすめします。
VGA信号のタイミングチャート | 電子技術研究倶楽部 (ele-tech.net)
TTLのみで作るVGA (matrix.jp)
Pong Game (fc2.com)
この場をお借りして、記事を書かれた方に感謝いたします。
さて次の課題はCPLDに何を使うかということです。MAX10などのFPGAでも可能と思います。、過去のトランジスタ技術でMAX10ボードが発売されていますが、この基板は自由に使える外に出ているピン数が少ないのでちょっと今回は使えませんでした。そこで登場するのが懐かしいCPLD基板です。私は当時10冊くらい購入して今も新品でストックしている基板があります。
(トランジスタ技術・2006年4月号付録)
この基板をまだ持っているヤツが居るのです。そう私です。過去からいろんな製作に使用してきました。今回は過去に使った基板を使い回してますが、この基板が小規模のシステムにはピッタリと思います。載っているCPLDはMAXIIですが、今でも開発は可能です。
次に必要となるのは高速SRAMです。VGA描画では1ドットが40nsecの時間幅になります。そこで秋月さんで12nsecタイプの高速SRAMを購入しました。今買っておかないと無くなるかもですね。この容量でVGA表示が可能になるようにしています。
(秋月さんで購入した高速SRAMの仕様書の一部)
SRAMの回路図は特に作っておりませんので、このピン配置で理解して下さい。VCC-VSSは5V、VCCO-VSSOは3.3Vを印加します。それぞれの端子には0.1uFのパスコンを入れて下さい。
(SOP32ピンピンの変換基板も合わせて購入しておきます)
(変換基板になんとか載せることが出来ました)
(CPLDとSRAMを同じ基板に配置します)
CPLDとSRAMの配線は後述するCPLDのピン割り付けで理解して下さい。
(水晶発振器の取り付け)
水晶発振器は50MHzを使用します。VGAの最小時間幅は25MHzですので、その基準となるように50MHzにします。端子接続は下図を参照下さい。この発振器の動作電圧は3.3Vなので少し工夫が必要です。あくまでも当時のトランジスタ技術の付録基板を使う前提ですが、基板上のXTALの場所には5Vが印加されるパターンなのでそこには取り付けません。ちょうどデジタルICがあるところが3.3Vで動いていますので、そこから3.3VとGNDを取ります。出力はR20のCPLD側に接続します。J4はショートしておきます。これでクロックの準備は完了です。
(秋月さんで購入した50MHz水晶発振器の端子面側)
次にVGAへの接続回路を示します。基板上には後述する電源回路とVGA回路を載せました。
(VGA回路と電源回路を実装)
(VGA出力回路)
この回路に辿り着くまでにかなりの時間を要しました。VGAモニタ側のインピーダンスが低いのは理解していたのですが、抵抗でラダーDACを組んで出力してもVGA側のインピーダンスで全て持っていかれるのです。コネクタを接続した途端にわずかな電圧しか出力されないのです。上図のようにすることで、3.3V出力のCPLDから完璧にコントロールが可能になりました。本当によく出来ている回路と思います。
私のPIC部分のカラーが16色モードなので、これほどのビット数は必要ないのですが、一応各色3ビットとなります。565モードから333モードにするために比較表を作りました。CPLDにはこの333モードで出力出来るようにデータを組み込んでいます。私の基本色である16色モードを忠実に再現してくれています。
(565モードから333モードへの変換対応表)
PIC32MX側の回路図を示します。以前から作っている回路の液晶出力ポート部を少し変えているだけです。回路図はクリックすると大きく表示されます。
(PIC32MXの回路図)
音の発生だけにPIC24Fを使用していますので、ゲームの処理スピードを落とすことなく効果音の出力が可能になっております。音の2系統の出力がありますので、適度に分けることで同時に音を鳴らすことも可能となっております。回路のポイントとしてCPLDとの接続ラインには全て100Ωの抵抗を直列に入れています。これがないと強力なノイズが発生してしまいます。これに気が付くのにもかなりの時間を要しました。
(電源回路)
電源入力は5VのACアダプターを想定しています。ノイズを軽減するためにLCフィルターを入れています。効果のほどはよくわかりませんが、まあ、おまじないみたいなものかもしれません。5Vから3.3Vを作っています。
CPLDの開発ツールの説明をします。インテルのサイトから「Quartus (Quartus Prime 18.1) Lite Edition」をダウンロードしてセットアップして下さい。FPGA用の開発ツールですがCPLDも開発出来ます。バージョンは必ず18.1にして下さい。後述しますが、ライターにトランジスタ技術のMAX10の物を使用しますので、このバージョンより新しいものは何故かライターを認識してくれないのです。別のJTAGのライターをお持ちの方は、この限りではないかもしれません。
(Quartus (Quartus Prime 18.1) Lite Editionのメニュー)
このツールのままではMAX10しか開発出来ません。別にMAXIIを開発するためのデバイスファイルが必要になります。そこで合わせて下図のファイルをダウンロードします。
(MAXII開発のためのデバイスファイル)
(ダウンロードしたデバイスファイル名)
ここで障害が発生。このデバイスファイルの設定の仕方が判りません。かなり悩みましたが結論としては上図メニューのDevice Installerをクリックして設定モードに入ることが出来ます。デバイスファイルを設定して万全の体制になりました。
さてここからはVGA表示関する内容です。VGAモニタは640x480ドットの解像度です。今までのカラー液晶のドット数は320x240です。液晶画面のキャプチャーでも説明していますが、液晶画面のドットを上下左右に2倍することで640x480のドット数になります。ゲームの解像度は320x240ですが、2倍して表示しても何の違和感もありません。むしろレトロな雰囲気を醸し出してとても魅力的です。処理スピードも早いので楽しいアクションゲームも作れると思います。さて320x240の液晶に話を戻します。使っているカラー液晶はフルカラー対応ですが、PIC32MXのRAM容量と処理スピードの関係から私の場合は16色モードとしています。そのメリットとしては1バイトで2ドット分の格納が出来ることです。そのことで使うRAM容量も減ります。
(1バイトの割り付け)
ここで注目して欲しいのは1バイトで2ドットの表示が出来るということです。つまりSRAMから1バイト読み出すと2ドット表示する時間があるということ、この間にPICからのデータをSRAMに書き込める時間が出来ることになります。そのタイミングを示したものが下図になります。この時間制御を作るために50MHzのクロックが必要だったのです。8クロックのサイクルで循環するタイミングになります。25MHzの周期がVGAの1ドットになります。320ドットの2ドット分が1バイトに入ってますので、640ドットでは4ドット分になります。50MHzクロックでは8クロック分になるので、SRAMからの読み出しは8サイクル毎になります。そういう意味からの8サイクル循環なのです。VGAモニタへの描画はこの循環に基づいて行いますが、PICからのデータ書き込みはこれと全く同期していません。そこでPICからの書き込みを許可する時間の配分が必要になります。それらのタイミングも下図に示しています。まあこのタイミングを考えられたことでこのシステムが完成したと思っております。
(VGA接続ユニットの心臓部のタイミングチャート)
このタイミングをVHDLで記述します。汎用ロジックで組んだら気が遠くなりますが、ハードウェア記述言語によってとても簡単に組むことが出来ます。このロジックの周辺に配置するロジックも記述してまとめると下図のようになりました。
(CPLDの内部構成)
下図が各ロジックをつなぐ配線を行った回路図になります。機能の割にはとてもシンプルな構成に出来たと思っています。これくらいのロジックにはCPLDが最適ではないでしょうか。工夫すればもう少しロジックをまとめることが出来ますが、うまく動いていますので、このままでいきましょう。クリックすると拡大出来ます。
(CPLD内部のロジック間配線)
合計で8種類のロジックモジュールを使っています。VHDLで記述したソースをまとめていますので必要な方はダウンロードして頂き各自で構築をお願いいたします。
VGA_VHDLのソースはこちら
CPLDのピンアサインです。SRAMやPICとの配線に使って下さい。
(CPLDのピンアサイン)
(回路合成完了)
ロジック使用率64%でした。大変よく出来ました。さてこのロジックを書き込むのに私はトランジスタ技術のMAX10 FPGAに付属していたものを使用します。JTAG端子経由で書き込みます。CPLD基板にもJTAG用のコネクタを取り付けることが出来るので書き込みは簡単です。
(トランジスタ技術のMAX10用のライター)
(接続用コネクタ)
JTAG同志なので直接つなぎたいところですが、一部ピン配置が異なっているようなので、少し配線を入れ替えています。私と同じように書き込みをする方は気を付けて下さい。
(PIC32MXとVGA接続ユニットの全景)
ケース内部の基板配置が絶妙ですね。
(まだ前面パネルが完成しておりません)
VGAモニタへの描画は完成しましたが、私の思うシステムはまだ完了しておりませんので、前面パネルが完成しておりません。それよりも先にこのVGAモニタ接続ユニットが完成したことを皆さんにお伝えしたかったのです。ケースは以前のものを分解して使っていますのであらぬ所に穴が開いているのはご理解下さい。
(背面にはまだ使っていないスイッチが)
VGAモニタに接続する装置ですので手元で操作するために操作キーボードを作りました。本格的キーボード用のスイッチを使っていますので、とてもスムーズな入力が可能になりました。
(操作キーボード)
(LANケーブル)
本体とキーボードの接続はLANケーブルを使用します。たまたまですがLAN用のコネクタがありましたので使用しました。LANとは全く関係なく、ただ8ピンのコネクタとして使っています。
320x240ドットの画面を680x480ドットの画面に描画していますので、VGAモニタ上では偶数行とそのすぐ下の奇数行には全く同じデータを書き込んでいます。PIC上では160x240=38400バイトのデータですが、VGAモニタ接続ユニットのSRAMに送り込むデータはその2倍になります。またそのユニットの動きとPICからのデータ書き込みは全く非同期なのでタイミングによってはSRAMに書き込めないタイミングが発生します。その時には次のタイミングで書き込むようにしています。書き込みが完了するまではPICは待ち状態になり、完了の指示がCPLDから来てから次のデータを書き込みます。水平同期や垂直同期の期間はVGAへのRGBデータの出力が必要ないので、SRAMの読み出しもなく、PICからの書き込みに集中出来ます。それらを全て考慮して実測をしたところ約26msecでPICからの1画面分をSRAMに書き込むことが出来ています。これはカラー液晶に書き込んでいたタイミングとほぼ同じになりますので違和感は全くないと思います。
さあとても楽しいシステムが完成しました。今開発中のゲームも順調です。次の発表まで今しばらくお待ち下さい。今回説明しきれなかった部分についても解説する予定です。今後ともよろしくお願いいたします。

「PIC32MX HARMONYの表紙」へ戻る