今回はキャラクタ生成コントローラの仕様を書いていこうと思う。
まずは、CPUからのキャラクタ描画の方法だが、コマンドレジスタとステータスレジスタをCPUにアドレスマップする。そして、コマンドレジスタに、CPUからキャラクタデータを書きこむことによって、キャラクタを描画するものとする。CPUからのキャラクタ描画コマンドは、16深度のコマンドFIFOにためられて、キャラクタグラフィックプロセッサ(名前負けかもしれないけど。。。)に送られる。ここでDDR2 SDRAMのアドレスを計算しながら画像データに変換して、画像データ書き込み用FIFOに送る。その際に、キャラクタグラフィックプロセッサは、フォントのデータとして、キャラクタジェネレータROMを参照する。画像データ書き込み用FIFOは、画像データが入ってきたらアービタに画像データのデータ転送を要求して、データ転送を行う。ブロック図を下図に示す。

(2010/01/19:追記)クロックドメインを分けるのを忘れていた。画像データ書き込み用FIFOまでの回路はCPUの動作希望周波数の65MHz動作となり、画像データ書き込み用FIFOは非同期FIFOとして、アービタの出口は150MHz動作とする。
次に下図にキャラクタ生成コントローラのアドレスマップを示す。

オフセット0番地は漢字も持てるように、16ビット幅のキャラクタコード(とりあえずはアスキーコードのみ)とその色データがある。ビット15には背景を描画するかどうかのビットがある。0を指定すると背景も描画する。その色データは4番地のに書かれている。4番地には倍率の設定もある。等倍にフォントを引き伸ばす。これはスムーズィングできれば良いのだが、今のところ単純に等倍にするので、フォントはでこぼこになるが、とりあえずはこれで行くことにする。
8番地にキャラクタを書くVRAMの先頭番地を書き込む。このアドレスにCPUから書きこむことにより、コマンド用FIFOに入力される。同じ属性の同じキャラクタを異なるVRAMのアドレスに書く場合は0番地、4番地に改めて書き込む必要はなく、8番地にVRAMのアドレスのみを書き込む。
さらに、同じ背景色のキャラクタを並べて書く場合は、0番地のbit14を1にしてキャラクタコードと文字の色を0番地に書き込めば、他の番地の書きこむことなしにコマンド用FIFOに投入される。このように2つのコマンド用FIFO投入パスがある。これによって、CPUのIOアクセス数を減らすことができる。
次にステータスレジスタだが、0番地のみステータスレジスタが実装されている。このbit4~0には、コマンドFIFOの残りの容量が割り当てられていて、Readするとその値が読める。最大値は"1000"である。残り容量をCPUが読んで、残り容量分を連続して書き込むことができる。これはFIFOを実装しないで、busyビットを実装するのに比べてCPUのポーリング負荷を減らせる可能性があるが、CPUの書き込みスピードより、キャラクタグラフィックプロセッサが十分に早いと、FIFOが必要ないという可能性も残る。
次回はさらにもう1つ下の仕様を考えて行きたいと思う。
(2010/01/23:変更)
キャラクタ生成コントローラのアドレスマップを変更しました。
(2010/01/31:変更)
キャラクタ生成コントローラのアドレスマップの8番地、VRAMのアドレスを32ビットに拡張しました。
- 2010年01月16日 06:30 |
- VGAコントローラ
-
| トラックバック:0
-
| コメント:0