PIC32MZ PROJECT(7)
更新日:2022年9月30日

PIC32MZ PROJECT完成:PLANET PILOT 2022公開
PIC32MZ PROJECTのハードウェアは今回で完成とします。今後はこのハードウェアをベースとしてゲームソフトの開発を行う予定です。ハードウェアの構成はこれまで説明してきた内容と変わりありません。それぞれの詳細は過去の記事を参照下さい。今回は少し説明しておくべき部分がありますのでその解説をしておきます。
今回CPLD_SRAM_VGA_電源回路を最終版として基板化しました。まずそこ回路図示しておきます。
(CPLD_SRAM_VGA_電源回路)
ケースに入れなくても使えるようにACアダプターのジャックを基板に載せました。さてここでひとつ気が付いたことがあります。この基板をPIC32MZでコントロールすると画面の描画が19msecで行えることを以前に説明しました。実はこれが予想していなかったことで起こっていた奇跡でした。次にCPLDのタイミングチャートを記載します。
(データ16bit幅の横640ドット表示のタイミングチャート)
当初の予定ではPICからCPLD基板に画像データを16bit分書き込んだらCPLD基板からの信号を待って次の画像データを書き込むことにしていました。上図では16bit分のデータを出力したらLATCHをHにした後、WEがLになるのを待ってから次に進むという手順です。しかしながら画面描画時間19msecを記録した時、CPLD基板からWEを確認するPICまでの配線がつながっていなかったのです。何かの機会にこの配線が正しくつながっている時があって、この時画面描画時間は28msec程度もありました。これでは描画が遅すぎます。19msecを一度体験してしまうと極端の遅いのです。実動作としてはこのCPLD基板からの信号を確認しなくてもうまく動作していたのです。それも最速で。
void disp_main2(void)
{
unsigned int i,j;
unsigned char data0;
unsigned char data1;
GPIO_PinWrite(W_AD_CLR,1);
for(j=0;j<240*2;j++){
for(i=0;i<160;i++){
data0=vram[i*2+16+j*352+11264];
data1=vram[i*2+16+j*352+11265];
GPIO_PortWrite(GPIO_PORT_A,0x00ff,data1);
GPIO_PortWrite(GPIO_PORT_E,0x00ff,data0);
GPIO_PinWrite(D_LATCH,1);
while(GPIO_PinRead(WREN)==0){}
GPIO_PinWrite(D_LATCH,0);
}
}
GPIO_PinWrite(W_AD_CLR,0);
}
(画面描画処理)
PIC側のCソースで確認しておきます。上図が画面を描画する処理部分です。PIC上には640x480ドットより広いサイズのVRAMを構成していて、必要な部分をCPLD基板に送っています。16bitデータを2回に分けて8bit毎に出力してLATCHをHにしてWRENがLになるまで待ってLATCHをLにする手順です。上図の赤で記した部分が機能していなかったのです。しかし実動作はこれでOK、しかも最速ということです。この赤い部分の配線がつながっていなかったからといって他の命令に変えるとCPLD基板とうまく同期が取れないのでそのまま残してありますが、まさしく奇跡です。さて上記のソースは説明しやすいように記していますが、実はこの表記では最速にはならないのです実際のソースは下記のようになります。
(画面描画処理の実ソース)
通常通り記述することは少なくとも関数などを呼んでいることになっているのでそれを解消すれば処理速度が早くなると予想しました。関数の中身を探し出してその中身を記述しました。実際には関数ではなくマクロ的な記述になってましたのでちょっと理解に時間が掛かりましたが上記の内容が最速の記述となります。もし処理スピードで悩まれているなら参考になるかと。上記はクリックすると大きく見れます。
最新のCPLD_SRAM_VGA_電源回路基板)
今回もPCBWayさんにお世話になりました。毎回ガーバーアップから1週間程度で着弾するのでとても重宝しております。
(2Mbit SRAM)
16bit幅の2Mbit SRAMは前回Mouserさんで購入していましたが、今回はAliexpressさんに挑戦してみました。単価と送料が比較的安いのが魅力的ですがあけてビックリかもしれないので内心ドキドキでした。それも杞憂。本物でした。ちゃんと動作しましたよ。
(100MHz水晶発振器)
水晶発振器もAliexpressさんでクリックしました。これも本物でした。大抵のものは心配ないようですね。Aliexpressさんでも。
(実装したCPLD_SRAM_VGA_電源回路基板)
手はんだなので毎回0.4mmピッチの部品取り付けは苦労します。今回もはんだショートに悩まされました。
(コネクタ周辺基板と接続)
各基板の接続端子はピンヘッダーで出しているので、ピンソケットに配線して接続しています。コネクタの向きがそれぞれ逆方向で配線がクロスしていますが良しとしましょう。
(透明板に挟んでケースを構成)
2mm厚のPET板をカットしてケースの代わりにしています。取り出しコネクタを全て基板上に設置したので上下の板のみでケースになります。前面側にはキー接続用のコネクタがあります。
(背面側のコネクタ群)
背面側は上図の左側から、DC5VのACアダプター用ジャック、VGAモニタ接続コネクタ、効果音出力のジャック、周辺機器へ5Vを提供するUSB Aジャックとなります。
(底面側にスピーカーを設置)
VGAモニタを接続した時でも効果音が聞こえるように小型スピーカーを内蔵しています。出力ジャックから外部のアンプ付きスピーカーで接続出来ます。
(PIC32MZ搭載マイコンカード)
マイコンカードもこれが最新版で最終版です。容量が大きいので今後の分まで複数のゲームが入る予定です。今はひとつしか入れてませんが。
(カードを挿すとこうなります)
なかなかコンパクトに出来たかと思います。
(操作キーユニットを接続する)
キーはひとつ増やしています。回路的にはあとひとつ、合計7キーにまで出来ます。
(完成したPIC32MZ PROJECT対応のPLANET PILOT 2022)
(全ての面をクリア出来ていませんが10面までの画面です)
PIC32MXの時に比べれば画面の大きさが4倍になったことになります。この640x480ドットの世界を一旦完成させたことで少し自作ゲーム機からは離れることにします。何が楽しかったかと聞かれたらCPLDでVGAモニタに画面を表示させたいと色々試行錯誤していた時です。こうして一旦完成するともうそれ以上ということにはなかなかなりませんね。まあ対応ゲームソフトはボチボチと進める予定ですが、この先はちょっとオーディオのほうに力を入れていきたいと思います。こちらの勝手な都合で申し訳ございませんが、VGA表示のCPLDのソースに興味のある方はメールをお願いいたします。何かしら力になれると思います。これからも引き続きよろしくお願いいたします。

「PIC32MZ PROJECTの表紙」へ戻る