2012年05月25日

スクリーン3と4の混在のバグ

  今更ながら、画面周りにバグが見つかりました。

  ずっと以前にアップした EFORMN の動作画面ですが、

EFORMN


  境界線がヘンな事になっています。

  これ、プログラムの入力ミスだと思っていたんですが、回路のバグでした。


  PC-6001VW が全く同じように表示されるので、てっきり入力ミスだと思ってたんですが、他のプログラムでも同じ問題が起こるものがあります(MAD-CHASERなど)。


  ちなみに、PC-6001V の方は、正常に表示されていました...



  次のリリース時には対応したいと思います。



posted by えすび at 23:48| Comment(6) | FPGA化:画面周り | このブログの読者になる | 更新情報をチェックする

2011年12月30日

mk2設計(2)

  画面周りの設計が一通り終わりました。

  今のシステムから確認するために無理やり回路をつないで、PC-6001 のままで画面の確認ができるようにしました。

  画面のデータは、PC-6001VW でデータをセーブしたものを使って、RAM上にロードしています。


  画面確認用のスクリーンショットです。例によってDSi で撮影したので画面が汚いですが、本物はきれいです。


ノストロモ

 60モードSCREEN1 ノストロモ


マジック

 60モードSCREEN2 マジック


アステロディアン

 60モードSCREEN3 アステロディアン


野豚の異常な食欲

 60モードSCREEN3 野豚の異常な食欲


ロードランナー

 60モードSCREEN3 ロードランナー


オリオン

 60モードSCREEN4 オリオン(色にじみの対応はまだ)


キャラクタ2

 60mモードSCREEN1/2


ドアドアmk2

 60mモードSCREEN3 ドアドアmk2


ハイドライド

 60mモードSCREEN3 ハイドライド


レッドゾーン

 60mモードSCREEN4 レッドゾーン


posted by えすび at 19:02| Comment(0) | FPGA化:画面周り | このブログの読者になる | 更新情報をチェックする

2011年12月25日

mk2設計(1)

 カスタムLSIの内容が大体わかったので、mk2 の設計に取り掛かっています。

 一番問題なのは画面周りなので、今回もそこから着手しています。


 256×192 が、320×200 になった事によって、画面の表示のためにデータの乗せ換えをしている内蔵のRAMの容量

を増やす必要が出てきました。

 ただ、PC-6001 の段階で、内蔵RAMをほとんど使用していて(56個中51個使用済み)、まともに増やしたらダメな事が判明。
 (36個→48個となり、12個増加する)

 さらに、現在内蔵RAMで実現している、キャラクタROMも、4Kバイトから16Kバイトになり、これも内蔵RAMが増える要因に。
 (4個→16個となり、12個増える)


 まともに実現すると、56個中75個使う事になり、全然入らない状態になりました。


 結局、乗せ換え用のRAMは、ビット数を減らす事で何とか対応(36個→40個)。
 キャラクタROMは、内蔵RAMではなく、SDRAMに追い出す事で対応しました。


 PC-6001 の回路から若干変わりますが、動作としては同じ動きになるので、とりあえずヨシとします。

posted by えすび at 17:41| Comment(0) | FPGA化:画面周り | このブログの読者になる | 更新情報をチェックする

2011年11月19日

液晶基板

 現在、動作している液晶基板の情報です。


 !注意!

 ・ここに書いている部品は、入手性が悪いものが多いです。
 ・工作がかなり大変です。1.0mmピッチの半田付けは当たり前。液晶周りは、0.5mmピッチです。
 ・書いている内容に間違いがあるかも知れません。

  もし実践するなら、以上を踏まえて自己責任で行ってください(質問などはして頂いても構いませんが)。



 それなりに大きな液晶で動作するものはないかと探した結果、以下のものを使いました。

 「液晶市場」 http://www.ekisho-ichiba.com/

 で通販で購入した液晶です。


 http://www.ekisho-ichiba.com/shopdetail/028000000003/order/

 または、

 http://www.ekisho-ichiba.com/shopdetail/028000000001/order/

 になります。

 『RD35003』 という3.5インチ液晶です。売れ筋のようですね。


 今回、P6FPGA化での回路は、このようになります。


液晶基板回路


 FPGAと液晶の端子は、単純に接続しているだけで、FPGAの方で全部制御しています。

 問題は液晶のバックライトで、19.2V、15mA を出力する必要があります。
 いろいろと調べた結果、LEDドライバのIC(LT1932)を使いました。

 http://www.linear-tech.co.jp/product/LT1932


 LT1932 を使う時に、周りの部品も結構特殊です。以下で入手しました。

 LEDドライバ         :LT1932    マルツパーツ館(通販)
 積層セラミックコンデンサ  :2.2uF、4.7uF マルツパーツ館(通販)
 ショットバリアキーダイオード:RB441Q-40   マルツパーツ館(通販)
 インダクタ         :6.8uH     共立電子


 『マルツパーツ館』 http://www.marutsu.co.jp/


 インダクタもマルツパーツ館で入手可能です。



 で、実際に出来たのが、これです。


液晶基板表

 基板の大きさをDE0に合わせました。


液晶基板裏

 裏の配線。もうちょっとキレイに作ればよかった...右の方が、LEDドライバです。
 

液晶基板動作中1

 バッテリーのみで動作させました。どれだけ電池が持つのかは分かりません。


液晶基板動作中2

 液晶のアップ。キレイに写ってます。


 実際に画面を写すと、「小っさいなー」、という感想です。もう少し大きな液晶が手に入ればよかったんですけどね。



posted by えすび at 12:33| Comment(0) | FPGA化:画面周り | このブログの読者になる | 更新情報をチェックする

2011年10月25日

VGA出力の設計(4)

 SCREEN4 の色を実装しました。

 Bernie さんのHP のBarnOut に、JOTさんが書かれている情報を元に実装してみました。
 色ずれじゃなくて、原理的に色が出るのかー。コンポジット信号の資料を見れば分かるんでしょうけど、勉強不足ですね。


 結局、JOT方式をそのまま実装してもうまく行かなかったので、いろいろ試行錯誤した結果、以下の通りにしました。

色変換テーブル


 表示するドットが1の場合は、左右1ビットの値を見て、白か緑(桃)を決めます。
 表示するドットが0の場合は、左右2ビット(つまり5ビット見る)を見て、色を決めます。

 さらに1ドットを左右半分に分け、片方を黒、もう片方を桃(緑)、という風に色を出します。

 今のFPGAの実装ではVGA に表示しているため、PC-6001 の1ドットは VGA では2ドットになるため、1ドットを左右違う色を出力できます。



 実装した結果、まあまあ満足する結果となりました。まだ改善の余地はあります(例えば、左右は非対称なだとか)。


 AXシリーズのゴットハリケーンの画面です。上が実機(PC-6601SR)、下が FPGA の出力です。字は読みやすくなっていますが、下の緑に塗っている所と白の枠線の間に、黒のすき間が空いています。

実機画面1

動作画面1




 MIAのSPACYのタイトル画面です。上が実機、下がFPGA の出力です。緑の字と、左の白の間のすき間が目立ちます。

実機画面2

動作画面2


 このすき間は意図的に空けているので、とりあえずこのままとして、また次の機会に修正する事にします。
 カラーセット1についても今回は実装しなかったので、また次の機会ということで。




posted by えすび at 11:29| Comment(0) | FPGA化:画面周り | このブログの読者になる | 更新情報をチェックする

2011年09月30日

VGA出力の設計(3)

 実は、今の表示周りには、問題が3つほどあります。

 1)表示間隔が、1フレーム262ライン×2フレームの524ラインになっています。

  実機は、多分525ラインです。一応、実機(といっても66SRですが)を調べてみた結果、修正することにします。


 2)RAS、CASの出力が、組み合わせ回路の出力になっている。

  これは設計の問題です。後段の回路が、非同期になるので、FF出力をする必要があります。


 3)モード4のにじみが出ない。

  これが一番問題かも。実現方法をまだ考えていません。


 以上、自分のための健忘録です。



posted by えすび at 19:11| Comment(0) | FPGA化:画面周り | このブログの読者になる | 更新情報をチェックする

VGA出力の設計(2)

 VGA に表示させることが出来たので、いよいよVDGの出力データを表示させるようにしました。

 縦のライン数は一緒(というか倍)だけど、横のドット数が違うので、2ポートのRAMで乗せ換える事にしますが...

 よーく考えてみると、

 VDG の出力 → 254ライン分を順番に出力する を2度繰り返す。
 VGA の入力 → 525ライン分を順番に入力する。

 1ライン毎に乗せ換えはダメだー。


 という事で、1面分の2ポートRAMを用意して乗せ換えようと考えました。

 が...DE0 に搭載されているCycloneIII の内蔵RAMの容量が 500Kbit 程度しかありません。

 VGA の表示エリアである640×480×12bit のRAM を用意するとなると、3.7Mbit 程度のRAMが必要になります。

 いろいろ考えた結果、次のようにしました。

 PC-6001 の表示エリア(256×192)→1ピクセル当たり、6ビットのRAMを用意(295Kbit)
 PC-6001 の背景エリア      →その行の最後のアトリビュートの値を覚えておく(192×6bit)

 これで何とかなりそうです。


 後は、読み出したデータを色データに変換すれば、表示が可能になります。


 このようにして作成したのが、これです。

VGA出力回路 VHDLファイル


 色データは、PC-6001V の初期設定のものを(勝手に)使いました。

 実際にVGAに画面に表示させると、こんな感じです。

画面出力例


 実機で画面に映ると、感激しますねー。

 ただ、画面の写真だけ見ると、FPGA化から出力したか、エミュレータから出力したのか、本物のPC-6001から出力したのか、判別がつかないんですが(^^;

posted by えすび at 19:05| Comment(0) | FPGA化:画面周り | このブログの読者になる | 更新情報をチェックする

VGA出力の設計(1)

 VDG周りが出来たので、それを表示するためにVGAモニタ出力の回路を設計する事にしました。

 ビデオ出力も考えましたが、ハードルがかなり高いようです。

 詳しく書かれているページはこちら → http://picavr.uunyan.com/
 この中のAVRの工作、の所にいろいろ書いています。


 VGA出力は、かなり簡単なようです。

 VGA出力の仕様はこちら → http://www.epanorama.net/documents/pc/vga_timing.html

 このページによると、HSYNC、VSYNC、を適切に出力すれば、出力できるようです。


 とりあえずテスト的にカウンタを組んで、HSYNC、VSYNC、を出力するように HDL を組みました。
 データはとりあえずベタ"1111"としました。

 で、QuarutsII でレイアウトすると...画面が出ない。

 ロジアナで見てみると、カウンタの値がめちゃくちゃ。


 ちゃんとタイミング制約ファイル(〜.sdc)を作らないとだめかー、という事で(どうせ必要なので)、作成してみることにしました。

 その制約ファイルがこれです。

sdc ファイル


 この際なので、後から必要なものも入れました。

  2〜 3行目:外部からのクロックの設定
  5〜12行目:PLLの逓倍/分周の設定
 14〜18行目:clock uncertainty の設定
 20〜25行目:それぞれのクロックは非同期なので、それらの間のパスはタイミング検証しないようにする。
 28〜37行目:出力信号の遅延値の設定

 PLLの分周比は変な数字ですが、出来るだけオリジナルのクロック周波数に近づけた結果です。

 50MHz × 63/220 = 14.318MHz(VDG周りのクロック)
 50MHz × 23/ 72 = 15.972MHz(CPUのクロック)
 50MHz × 1/ 2 = 25MHz  (VGA出力のクロック)


 これで、レイアウトしてみると...やはりまだだめ。

 ロジアナで見たカウンタ値もめちゃくちゃ。

 ....と思ったら。ロジアナの信号のアサインが、MSBとLSBが逆でした。


 カウンタはキチンと動いていて、パルスもちゃんと出力されているのに、画面が出ない...


 もしやと思って、表示期間以外を"0000"にするようにすると...おー、ちゃんと色がでたー。

 しょーもないミスをしてしまいました。


posted by えすび at 19:04| Comment(0) | FPGA化:画面周り | このブログの読者になる | 更新情報をチェックする

VDG周りの設計(2)

 ついでに 6847 の周りの回路(キャラクタROMや、RAS、CAS の生成)を、PC-6001 の回路を元に作って、それを同期化してみる。

 できたのがこれです。

VDG周辺回路のVHDLファイル


 で、外付けにRAMを付ければ動くはずなので、そういうテストベンチを組んでみる。
 が、シミュレーションでは波形しか見えないので、ちゃんと画面が出てるかよくわからない。

 ので、テストベンチに仕掛けを入れてみる。

 1)外付けRAMの値を外部から設定できるようにしておく。その値は、PC-6001エミュレータからメモリイメージを変換したものを使う。
 2)テストベンチから、1ピクセル毎の値をテキストファイルに出力させる(vdgout.txt)。カンマ付きにしておくのがミソ。
 3)vdgout.txt をEXCEL に取り込む。。
 4)取り込んだものをvdgout.xls としてセーブする。

 5)これとは別に、vgaout.xls のファイルを参照して、セルの色が変わるようなEXCELファイルを作っておく(vdgdisp.xls)。セルの『条件付き書式』とかいうヤツで、セルの値によって色を変えられる。


 そのようにしたテストベンチ、EXCELファイルがこれです。

テストベンチ
表示用EXCELファイル


 参考用に、シミュレーションした結果の vgaout.xls も載せておきます。

シミュレーション実行結果(をEXCELに変換したもの)
シミュレーション実行結果(をEXCELに変換したもの)


 EXCEL でゲーム画面がきれいに表示されます。


EXCEL画面


posted by えすび at 17:06| Comment(0) | FPGA化:画面周り | このブログの読者になる | 更新情報をチェックする

VDG周りの設計(1)

 PC-6001 のFPGA化計画で、とりあえず画面周りから手を付けてみました。

 MC6847 のドキュメントを探してきて、読んでみる。
 PC-6001 の周辺回路と併せていろいろ考えてみるが、動作が判りにくい。


 うーんと読み込んだ結果、以下の通りのようです。

 ・カウンタ関係は自走。
 ・水平方向に、227.5 クロックで1ラインを構成。
 ・垂直方向に、262ラインで1画面。ただし、2画面分を送信して、1フレームの完成(インターレース)。
 ・インターレースの時は、2画面分出力してから1ライン分出力。合計で525ライン。
 ・出力は、Y、C-A、C-B、でアナログ信号で出力される。Y はアナログ6値、C-A はアナログ4値、C-B はアナログ3値。

 ・水平方向の同期用に、HSN信号を出力
 ・垂直方向の同期用(というか、フレームの右隅から、FSNがアサートされ、フレームが開始される随分前にネゲートされる。
 ・RPN は外部キャラクタROM 用のロードパルス。キャラクタが縦方向に12ラインなので、外部カウンタが0〜11になるように制御するためのパルス。

 ・V-RAM へのアクセスのためのアドレスA(12:0)を出力している。
 ・アドレスの下位A(4:0)、もしくはA(3:0) は水平方向で4クロック、もしくは8クロックで+1される。
 ・アドレスの下位が2種類あるのは、画面モードによる。256×192 で考えた場合、8ドット1バイトの時は、A(4:0) を使い、4クロックで+1され、16ドット1バイトの場合は、A(3:0) を使い、8クロックで+1される。
 ・アドレスの上位は、1ライン描画した後に変化される。


 で、肝心のV-RAMへのアドレスの変化の仕方の記載が全くない。また、HSN、FSN、A(13:0) の相互のタイミング関係に関しても、明示されていない。


 仕方ないので、周辺回路と併せて考えた結果、こんな感じになるようです。

6847 タイミング


 これを元に作ったのがこれです。

6847 VHDLファイル
6847 VHDLファイル(下位階層1)
6847 VHDLファイル(下位階層2)


 アナログ信号は出せないので、Y、C-A、C-B、はとりあえずダミー。映像データの出力は、DISPDとDISPMDの2種類で、DISPDは画面の色データ、DISPMDは画面のモードになります。



posted by えすび at 16:58| Comment(0) | FPGA化:画面周り | このブログの読者になる | 更新情報をチェックする