コメを噛め

コメを噛め

rerofumi の電子工作メモ

Archive for the ‘CPLD’ Category

てなわけで、V850とCPLD CRTCによるインベーダーゲームの完成です。
タイトルはプロジェクト名だった「コメベーダー」をそのままタイトルにしてしまいました。考えるの面倒だったので。

まずは作成成果物の提示ということで、動作している所を紹介するムービーとスクリーンショットから。

ムービーはニコニコ動画にあるのと同じもの。

コメベーダースクリーンショット1 コメベーダースクリーンショット2 コメベーダースクリーンショット3

作成成果物としてのソースコード。

komevader V850 ソースコード

komevader CPLD VHDL ソースコード

CPLDは以前から変わっていないはず。
V850のソースコードも画面周りはCPLDとSRAMが無いと意味がないので参考程度に。でも、音声出力周りは使い回しが効くんじゃないかと。

トータルでは長いこと続けてきたインベーダーゲームとそれを動作させるハードウェアの制作ですが、ついに完成。
動作の様子はニコニコ動画にアップしてあるので、見てやってくださいな。

ニコニコ動画はアカウントがなくて見れないよ、という方用の動画や、ソフトウェア部分のソースコードと解説などはまたこのあと少しずつ用意していく予定。

V850 KOMEVADER snapshot
これまでの色々な要素はこれを作るために必要なものだったから。
といった感じで、V850+CPLD CRTC 基板によるインベーダーゲームを制作中。
スクリーンショットは、一応V850+CPLD CRTC 基板実機で動いているものを撮影しているけれども、まだまだ未完成品。

今はソフトウェア作成のターンなので、なかなかここに進捗とかが書きづらく間が空いてしまう次第。(ソフトウェアは本業なもんでいまいち語る事がないのです)

ちなみに、Interface誌の V850 アプリケーションコンテストに応募する予定はありません。
テレビゲーム製作は既に記事になっていることだし。

細かい調整も終わり、ひとまず CPLD CRTC も予定通りに仕上がった感じ。
高機能じゃないけれどもね。
cpld_ctrc_070706.zip


表示しながらの画面描画実験。
フラッシュビデオ その1

するするとシャッターの様に描かれていくのは、CRTCとCPUのSRAMバスアービトレーションを行っていないから。
CRTCが画面を描いている時というのは一生懸命SRAMからデータを読んでいる時である。そんなときにCPUから読み書きしようとするとバスが衝突してとんでもないアドレスを表示してしまうことになるし、CPUも思ったところに思ったデータが書けないことになる。
そこで、CRTCがSRAMからデータを読み出している期間はCPUからのアクセスを遮断している。この時、CPUがSRAMにアクセスできるのはCRTCが画面を描いていない時、つまりVBLANK期間だけとなる。
その隙を狙って描画するのだが、このテストコードではその VBLANK期間にだいたい5〜6ラインくらい描いているようだ。
CRTCのENABLEを下げて無効にすると画面は真っ暗になるが、フルタイムでSRAMにアクセスできるので 1枚画をその隙に転送するとか、画面をクリアするとかに使う。


そんな様子を眺めていてもつまんないだろうから、もちょっと見れるように即興でライフゲームを作ってみた。
フラッシュビデオ その2

まあ、ライフゲームを見て楽しいかどうかは人によるとは思うけれども。

一応ソースコード。やっつけ風味。
crtc_life_demo.zip

テストコードをいじりながらチェックしていたら CPLD の VHDL にケアレスミスを発見。その一点を直したらすんなりと動作を始めた。おおっ。
早速適当な絵をテスト表示。

XC95108 用の VHDL ソースコード
cpld_crtc_070627.zip

V850側の表示チェックコード(上記スクリーンショットのデータ込み)
v850_crtc_check.zip

表示しているときのアクセス許可信号となる VBlank 信号が拾えていない風味なのでまだ不具合は残っている状態。
もうちょっと調査。

さぼり気味で遅々として進まない、V850+CPLDなプロジェクト。
目的であるところの NTSC モノクロ CRTC を CPLD で書き始めた。
方式は毎度の抵抗二本方式だけれども、SRAM と CPLD CRTC で CPU 側に負荷をかけずにテレビ出力するのが狙い。
しかし、CRTC ってホントカウンターのかたまりでしか無いから、VHDL で書くと案外あっさりとしたものになるのね。

SRAM 内のノイズパターンが表示されるところまでは来た。
ジッタは無いわけじゃないけど、そこそこ小さいのでロジック様々な感じ。
一応画が出たけれども、RAMのアドレスと表示結果がなんかおかしいので、これから苦労しながら修正というパターンかと。

NTSC 信号は厳密なことをいうと chanさんところの RS-170A に沿ったものを生成しないとならないのだけれども、実際はテレビが結構補正して読み込んでくれるのでかなり適当でもなんとかなる。
私の場合は水平走査線 262.5本ではなく 262本でごまかしている。0.5の補正がないので奇数フィールドと偶数フィールドは同じ信号。
さらに言うと垂直同期信号は 3ラスタ分下げっぱなしで切り込みパルスも等価パルスも付与していない。(PSoCのときは切り込みパルスを作っていたけれども)
でもまあ、それでも画になってくれるものなのですよ。取り敢えずでも画面に何か映ると楽しいしね。

CPLD 内部をほとんどスルーで構成して、V850 から SRAM が読み書きできるかどうかをテストする。
まあ、いくつか不具合があって修正しながらなんとか動作確認ができたのでめでたしめでたし。
不具合の内訳は、配線ミス 2箇所、CPLD の inout(データバス)部分で in の時はハイインピーダンスに設定するあたりが良くわかっていなかったというのが一つ。

ひとまず動作している様に見える CPLD の VHDL ソースとピン設定。
sram_test_cpld.zip

V850側のSRAMチェックソースコード。
v850_sram_check.zip
レジスタ設定しか参考にならないと思うけれども。いちお、メモ代わりに。

実際に外部バスへメモリを接続すると、V850側からは 0×100000 以降が外部RAM領域になる。それ未満のアドレスでは、読み出し時は ROM から、書き込み時は外部RAMへと変則的なアクセスとなる。
PM+ で新しいプロジェクト作成時「外部RAMを使うか」という項目があるけれども、ここで「はい」を選ぶとディレクティブの .data 領域(変数や可変データが置かれる領域)が 0×100000 に設定されてしまう。ああ、そういう意味だったのかと思った次第。
今回 SRAM 領域をコンパイラに使われると不具合があるので、内蔵 RAM を使うような設定となることを確認しておく。

配線のリストをちょっと更新。
必要かどうか悩んだV850のクロックを一応CPLDに与える事にした。そのために一部配線を入れ替え。

記事としては面白みが無いところだけれども、私としては動いて一安心という一区切りなのでした。