ハードウェア記述言語SFLを用いた汎用ゲーム

ハード ウェア記述言語 SFL を用いた
汎用ゲームプラットフォームの設計
指導教員 清水 尚彦 助教授
0AET3230 金井 友明
東海大学 工学部 通信工学科
1
目次
1
はじめに
2
VGA
2.1 キャラクターデータ
2.2 スプライトデータ . .
2.3 cher . . . . . . . . .
2.4 sprite . . . . . . . . .
2.5 ctrl . . . . . . . . . .
2.6 col . . . . . . . . . .
2.7 cntsc . . . . . . . . .
3
4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
NTSC
3.1 走査 . . . . . . . . . . . . . . . . . . . . . .
3.1.1 順次走査 . . . . . . . . . . . . . . . .
3.1.2 飛越走査 ( インタレース走査) . . . .
3.2 同期 . . . . . . . . . . . . . . . . . . . . . .
3.2.1 水平同期信号 (Horizonal Signal) . . .
3.2.2 垂直同期信号 (Vertical Signal) . . . .
3.2.3 コンポジット同期信号 (Csync Signal)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
7
8
9
12
13
15
16
.
.
.
.
.
.
.
19
20
20
21
23
23
24
26
4
謝辞
27
5
参考文献
27
2
図目次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
VGA 全体図 . . . . . . . . . . . . . . . . . .
キャラクターデータの一例 . . . . . . . . . .
スプライトデータの一例 . . . . . . . . . . .
キャラクターの描画位置アドレス . . . . . .
メモリから取り込む際のキャラクターデータ
キャラクターデータと走査線数の関係 . . .
スプライトの描画位置アドレス . . . . . . .
ctrl の周辺 . . . . . . . . . . . . . . . . . . .
衝突検出の方法1 . . . . . . . . . . . . . . .
衝突検出の方法2 . . . . . . . . . . . . . . .
cntsc の構成 . . . . . . . . . . . . . . . . . .
cntsc の入力データ . . . . . . . . . . . . . .
ダブルバッファの図 . . . . . . . . . . . . .
NTSC の主な仕様 . . . . . . . . . . . . . . .
順次走査のイメージ . . . . . . . . . . . . .
飛び越し走査のイメージ . . . . . . . . . . .
実際の NTSC の飛び越し走査 . . . . . . . .
水平同期信号 . . . . . . . . . . . . . . . . .
垂直同期信号 . . . . . . . . . . . . . . . . .
垂直同期タイミング . . . . . . . . . . . . .
コンポジット同期信号の生成 1 . . . . . . . .
コンポジット同期信号の生成 2 . . . . . . . .
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
7
8
9
10
11
13
14
15
16
16
17
18
19
21
22
22
23
24
25
26
26
1
はじめに
本研究はハード ウェア記述言語 (HDL)SFL を用い,汎用ゲームプラッ
トフォームのビデオ回路を設計する事により,NTSC 複合同期式信号を
作成し TV 画面に表示させる事を目的とする.NTSC は同研究室の大学
院生飯田の設計によるものですが,VGA との接続にあたり必要な部分の
み恐縮ながら説明させていただきます.
4
2
VGA
図 1 は VGA の全体図です.一部カラー端子などは省略してあるものも
あります.今回設計した VGA の役割は大きく分けて三つあります.一つ
は,メモリから描画に必要なデータを取り出すこと,二つ目は,メモリか
ら取り出したデータを比較することにより衝突 (コリジョン ) の判定を行
うこと.最後に三つ目はメモリから取り出したデータを NTSC 信号に変
換することです.それでは次節からは図 1 に示されている個々のモジュー
ルに関して説明いたします.
5
req
req
data<8>
data<8>
Memory
req
Cher
data<8>
data<8>
req
req
data<8>
Sprite
I/O
Ctrl
req
data<8>
data<32>
data<4>
data<8>
req
Col
Cntsc
VGA Controller
NTSC
TV input
図 1: VGA 全体図
6
2.1
キャラクターデータ
キャラクターデータとは 8 × 8 ドットで表示され,ゲーム上では主に背
景や文字などの表示に使用されます.また一画面は 256 × 256(キャラク
ター) で構成されています.図 2 は実際にメモリに格納されているキャラ
クターデータの一例です。
図 2: キャラクターデータの一例
7
2.2
スプライトデータ
スプライトデータは 32 × 32 ド ット,つまり 4 × 4 キャラクターデータ
で表示され,ゲーム上では主にプレ イヤーが実際に動かすマスコットな
ど の表示に使用されます.スプライトデータはプレ イヤー自身がコント
ローラーなどの入力装置を操作することにより,画面上を自由に動かす
ことが可能です.
図 3: スプライトデータの一例
8
2.3
cher
cher はキャラクターデータを RAM や ROM といったメモリから取り
込むモジュールです.とは言うものの,実際は cher が直接メモリにアク
セスしてデータを取り込むのではなく,メモリコントローラ1にアクセス
することにより, その動作を実現しています.まず,ctrl から次の描画位
置のデータの読みだし命令を受けると,メモリコントローラーにリクエ
ストと,現在のキャラクターの描画位置アドレスを送信することにより,
データを取り込みます.ここでいう描画位置アドレスとは現在描画しよ
うとしている場所を示すものです.図 4 の様に縦方向・横方向に 5bit ず
つ,縦方向に関してはさらに 8 分割したするので 3bit のアドレスをふる
ことにより現在の描画位置を表します. メモリコントローラはその情報
00000
11111
00000
000
111
11111
図 4: キャラクターの描画位置アドレス
を元に,そのデータが格納されているメモリアドレスを算出し ,そこか
1
多数のリクエストに対して判別行い,状況に適したメモリアクセスを行うモジュー
ル
9
らデータを取り出し ,cher に値を返してくるのです.また実際にキャラ
クターデータをメモリから取り込む際には図 2 の様なデータをまるごと
取り込むのではなく,図 5 の様に 8 × 8 のデータを横方向に 8 分割した
データを一つの単位として取り込みます.なぜこの様な手法をとるかと
いうと,それは NTSC の規格に起因しています. NTSC の規格では一画
data<8>
図 5: メモリから取り込む際のキャラクターデータ
面辺りの走査線の数は 525 本と決められています.キャラクターデータ
は前述にもある様に一画面に 256 × 256 個存在するので,図 6 の様に横
方向に 8 分割することによりキャラクターデータと走査線の数が等し く
なります.つまりキャラクターデータを横方向に 8 分割して取り込む理
由は NTSC の走査方法に合わせるためなのです.
10
256
525 8
525
図 6: キャラクターデータと走査線数の関係
11
2.4
sprite
sprite はスプライトデータをメモリから取り込むモジュールです.スプ
ライトデータも,もちろんキャラクターデータと同じように NTSC の走
査方法に合わせるために,横方向に 32 分割したデータを取り込みます.
またメモリコントローラーの規格とも合わせるために縦方向にも 4 分割
したデータ,つまりキャラクターデータと同じ単位で取り込みます.そし
て,そのデータを 4 個つなげて 32 ビットにしたものを一つのスプライト
データとしてレジスタに格納し,ctrl に送ります.
sprite が動作するタイミングは一画面も描画する中に2回あります.1 回
目は一画面を描画する直前であり、2 回目は衝突が生じた場合である。(こ
の場合の衝突とは画面上でのマスコットと背景の衝突だけでなく、キャ
ラクターデータとスプライトデータの重なりも含む) どちらのケースにお
いても ctrl からリクエスト受けると、cher と同様にメモリコントローラ
にリクエストと現在の描画位置アドレスを送ります.sprite が送る描画位
置アドレスは 11bit です.内訳は上位 4bit がスプライト ROM の中に 16
パターン用意されたスプライトの形のどれなのかという情報で,残りの
bit が描画位置アドレスになります.7bit の描画位置アドレスをどの様に
して生成するのかというと,図 7 の様に横方向を 2bit,縦方向を 5bit で
表したものを単に連結しているだけです.
12
00
01
10
11
00000
11111
図 7: スプライトの描画位置アドレス
2.5
ctrl
ntsc からの制御信号と col からの衝突の判定をもとに cher と sprite の
動作を制御しているモジュールです.VGA 全体の制御を行う大変重要な
部分であると言えます.
ctrl は電源 ON と同時に自身を起動し ,ntsc からの描画開始の信号を待
機する状態に入ります.そして ntsc から同期信号のタイミングを計った
描画開始の信号 (後述の NTSC で詳細を示す) を受け取ると,まず,図 8
の (1),(2),(3) の動作を独立したステージで動かし各々のデータの取り込
みを行います.独立なステージで動作させるということはパイプライン
化するということで,クロック数の削減を実現しています.また,ここ
での I/O から取り込んでいるデータはスプライト ROM の中にある,16
パターンのスプライトのどれかというデータになります.もちろんスプ
ライトデータは一画面中は変わることはないので,一画面を描画する一
番初めのときにのみ取り込みます.また,実際のスプライトデータに関
しては一画面を描画する前に,スプライトを構成する最上部の 32bit を予
め持っておき,それ以降のデータは衝突の判定が生じたら取り込みを始
13
sprite
req
I/O
req
ctrl
data<32>
cher
color_data<4>
(2)
req
(1)
color_data<4>
data<8>
めます.全てのスプライト情報を取り込むと,sprite から制御出力がくる
ので,それを待って取り込みの作業を終えます.キャラクターデータに
関しては NTSC の水平ブランキング期間,垂直ブランキング期間以外は
常にデータを取り込みます.
cher_color_data<4>
sprite_color_data<4>
data<4>
cher_data<8>
(3)
sprite_data<32>
NTSC req
図 8: ctrl の周辺
14
col
2.6
col
ctrl からの入力データを元にキャラクターデータとスプライトデータの
間で,コリジョン (衝突) が発生していないか判定を行います.まず,cher
で計算された現在のキャラクターの描画位置アドレスと,I/O から ctrl に
送られてきたスプライトの左上端の (x.y) 座標から図 9 の様に縦座標にお
いて衝突が発生していないかの判定行います.(1)(3) の場合は衝突がな
く,(2) の場合は衝突が起きたと判定されます.次に縦座標でのコリジョ
ンが確認された場合は,図 10 の様に横座標での判定を行います.(1)(5)
の場合は衝突がなく,(2)(3)(4) の場合は衝突が起きたと判定されます.そ
して,この判定の結果から生成された,mask と mc のデータを cntsc に送
信します.この2つのデータに関しては,次セクションである cntsc で詳
細を示します.また衝突が起きたか起きていないかという情報を ctrl に
知らせ,次のスプライトデータを取り込みにいくかを判断しています.
(1)
cher
(2)
cher
sprite
(3)
cher
TV-Field
図 9: 衝突検出の方法1
15
(1)
(2)
(3)
(4)
(5)
cher
cher
cher
cher
cher
sprite
TV-Field
図 10: 衝突検出の方法2
2.7
cntsc
cntsc の役割は二つあります.一つ目は col からの出力を予め用意された
バッファに格納すること.二つ目はバッファに格納されたデータを NTSC
信号に変換することです.今回の設計ではこの 2 つの動作を図 11 が示す
様に 2 つのステージを作ることによって実現しています.ここで,stage1
の中にレジスタが並列して存在していますが,これはダブルバッファを
実現しています. cntsc の入力データには図 12 の 4 つが存在します.カ
reg
col
Stage1
Stage2
NTSC
reg
NTSC
cntsc
図 11: cntsc の構成
ラーデータはキャラクター・スプライト共に 4bit のデータであり,mask
はスプライトのみの輝度情報で,mc はキャラクター・スプライト両方の
輝度情報です. 動作としては,まず col からの出力データを図 13 の様な
16
ch color<4>
sp color<4>
mask<8>
mc<8>
図 12: cntsc の入力データ
ダブルバッファに格納します.このダブルバッファにはトリガが付いて
おり,それによりバッファの空き状況確認することができます.そして,
その状況を確認することにより,ctrl に次のキャラクターやスプライトの
データを取り込むように指示を出します. データのダブルバッファへの
格納が済んだら,次のステージへ進み今度は NTSC 信号への変換を行い
ます.ここでの変換というのは,バッファに格納されている 8bit のデータ
を 1bit ずつ取り出して,NTSC で認識可能な色の信号に変換することで
す.つまり,その 1bit が何色として画面上に表示させれば良いのかとい
うことです.例えばその 1bit の位置には何も存在しないのであれば黒色
を表示しますし ,スプライトが存在するなら青や赤といった色が表示さ
れるかもしれません.また,色を確実に表示させるために NTSC にデー
タを出力する際に,そのデータを 2clk 送り続けています.つまり,出力
の値を 2clk ごとに変わる仕様になっています.そして,この 2clk という
のが VGA 全体の制御において大変重要な数値になりました.なぜかとい
17
A 8bit
8bit data
double_buffer
6bit data
B 8bit
Cntsc
図 13: ダブルバッファの図
うと,2clk ごとに値を切替えながら描画を進めていくということは,バッ
ファのデータは 8bit なので,バッファのデータを全て表示させるのに要
するクロック数は 16clk ということになります.ということは,バッファ
を空にしないようにするためには 16clk 以内に次のデータをメモリから取
り込み,衝突判定を行いバッファに格納しなければいけないということ
になります.今回の設計においてこの制約は一番の難関になりました.
18
3
NTSC
NTSC とは「 National Television Standards Committee 」のことで,地
上波アナログカラーテレビ放送の方式を策定するアメリカの標準化委員
会の名称です.また同委員会が 1953 年に策定した方式の名称でもありま
す.この方式は日本や北米,中南米で採用されています.主な仕様は,水
平方向の走査線が 525 本で毎秒 30 フレームの飛び越し走査 ( インタレー
ス) 方式で,水平動作周波数は 15.75Mhz,垂直動作周波数は 60Hz となっ
ています.
!"$#%
&'() *+,&'( -./0 (FM12
345,67 89: (SSB12
;7 89,:
30Hz
29.97Hz
60Hz
59.94Hz
15.75Hz
15.734Hz
<>=
3.579545MHz
525
?
483~485
)
4.5MHz
)
4.2MHz
6MHz
図 14: NTSC の主な仕様
19
?
3.1
走査
テレビなどの映像信号は二次元の情報をもち,リアルタイムに変化し
ます.ということは,この情報はそのままでは一次元の電気信号を伝送
することが出来ないので,映像に一定の順序をつけ一次元信号に変換す
る必要があります.
一般的にゲームやテレビカメラなどで撮影された映像は画素と呼ばれる
最小単位で構成されており,この画素を一定の順番で並べることにより
一次元に変換します.具体的には画面の一行目の左端から右端に横方向
に画素を取り込んでいき.右端に到達したら次の行も同じ様に左端から
右端に取り込んでいきます.そして最後の行に到達したら,また一行目
に戻り同じ動作を続けます.
このように画像を取り込み,またそれを組み立てなおす動作のことを「走
査」と呼びます.
3.1.1
順次走査
順次走査のイメージを図 15 に示します.この時に,横方向に移動して
いる走査を「水平走査」,走査線を上から下に少しずつずらしている走査
を「垂直走査」と呼びます.また,水平走査と垂直走査を同時に行い,そ
の結果できる走査線の軌跡をラスターと呼びます.
20
1
2
1’
3
2’
4
3’
5
4’
5’
図 15: 順次走査のイメージ
3.1.2
飛越走査 (インタレース走査)
飛び越し走査のイメージを図 16 に示します.まず 1,2,3,4,5 のよ
うに間を開けて走査し,次に 6,7,8,9 の走査線が最初の走査線の間に
入るように走査します.そして,2 回の垂直走査によって画面全体の走査
が完了します.実際のテレビでは 525 本の走査線が並びます.
NTSC の飛び越し走査 ( インタレース) は,1 秒間に 30 枚の画面を作る間
に垂直走査を 60 回行うことになります.飛び越し走査 1 回の垂直走査を
フィールドと呼び,2 回のフィールドによる完全走査をフレーム走査と呼
びます.
2 つのフィールドには呼び名があり奇数フレーム,偶数フレームと呼ばれ
ています.飛び越し走査の利点は,人間の目の残像効果を利用し,一度の
伝送量を減らした上で,与えられた電波の帯域内で最大限の情報を送れ
るということです.フィールド の送出で 1 回目と 2 回目に時間差が生じ ,
動画に対して映像がぼけてしまいますが,人間の目は,動画に対しての
解像度は低いという特性を利用した巧みな方法なのです.
また今回の NTSC の設計においてはハード ウェア記述言語 (SFL) を用い
て,10bit のカウンタを設計し ,その値から奇数/偶数フレームを判別し
ています.図 17 は実際の NTSC の飛び越し走査を図示したものです.
21
1
6
5’
2
1’
7
6’
3
2’
8
7’
4
3’
9
8’
5
4’
9’
図 16: 飛び越し走査のイメージ
1
262’
2
263’
3
264’
260
523’
261
524’
262
525’
図 17: 実際の NTSC の飛び越し走査
22
3.2
同期
ゲームやテレビカメラで撮影された映像をテレビ上に全く同じ様に再
現するためには,送信側と受信側で走査線を組み立てるタイミングを完
全に一致させる必要があります,このことを「同期」と呼びます.
同期をとるためには,水平走査,垂直走査の開始タイミングを知らせる
ための水平同期信号,垂直同期信号を付加して送信し ,受信側は水平同
期信号,垂直同期信号を検知して水平走査,垂直走査を同期させる必要
があります.また,カラー映像の場合は色同期信号 (カラーバースト ) も
送信する必要があります.
3.2.1
水平同期信号 (Horizonal Signal)
水平同期信号とは画面の右端に達した走査線を左端に戻す働きをする
信号です.図 18 に水平同期信号を示します。まず、e の期間は水平ブラ
ンキング期間と呼ばれ 、走査線を画面の右から左に戻す期間なので映像
は一切表示されません。a,b,c は水平ブランキング期間の中で内訳られた
期間で、a はフロントポーチと呼ばれ、水平ブランキング期間が始まって
から水平同期信号が始まるまでの期間を指します。b は水平同期信号期間
で、c はバックポーチと呼ばれカラー放送で重要なカラーバースト信号が
重畳されています.水平ブランキング期間に映像表示期間を足し合わせ
た期間 63.555[µs] を H と表します.また、図 18 のクロック表記に関して
は、NTSC の動作周波数= 14.318MHz を用いて算出した値です。そして、
今回の NTSC の設計においてはそのクロック数を 10bit のカウンタで数
えタイミングを計っています。
e
a
b
1.5µs 4.7µs
21clk 67cik
c
d
4.7µs
67cik
52.65µs
754cik
図 18: 水平同期信号
23
3.2.2
垂直同期信号 (Vertical Signal)
254H
254H
255H
255H
256H
256H
257H
258H
a
257H
258H
b
259H
260H
261H
262H
259H
260H
261H
262H
図 19: 垂直同期信号
垂直同期信号とは走査線が画面の一番下に達した時に,それを上に戻
す働きをする信号です.走査線を下から上に戻す期間を垂直帰線期間 (垂
直ブランキング期間) といい,一画面を描画するにあたってはその期間が
2 回存在し (飛び越し走査のため),その期間は 20H です.垂直同期信号期
間は 3H と決められています.図 19 の値は走査線に合わせてカウントを
行っている NTSC 内の 10bit カウンタの値です.また,奇数・偶数フィー
ルド というのは前述の飛び越し走査によるもので信号発生時のカウンタ
の値がずれているのは図 16 からも見てとれるように飛び越し走査の, 場
合画面中央から走査が始まるためです.飛び越し走査では,垂直同期信号
が 262.5H 毎に入ります.何もせずに垂直同期信号を合成すると.垂直同
期信号前後の波形が奇数フィールドと偶数フィールドで異なってしまうと
いう事態が生じてしまいます.この様な事態を防ぐ ために垂直同期期間
の前後に等価パルス (Equivalent Pulse) 期間を 3H 分入れます.また垂直
同期信号には水平同期信号との区別をつけるために,切れ込みのある切
り込みパルス (Vs Pulse) を用います.そして,これらパルスの切替えは
10bit カウンタの H の値を見ることにより実現しています.図 20 は,そ
れぞれのパルス発生時の 10bit カウンタの値を示したものです.そして,
NTSC からはカウンタの値を VGA に知らせることによって,NTSC によ
る描画の制御を実現しています.
24
256.5H
253.5H
253H
262.5H
259.5H
254H
257H
260H
図 20: 垂直同期タイミング
25
3.2.3
コンポジット 同期信号 (Csync Signal)
コンポジット同期信号とは,実際にゲームやビデオの信号を送るとき
にはもっとも使われている同期信号の形態です.どの様な信号かという
と,水平同期信号と垂直同期信号を重ね合わせたものであり,それ以上
でもそれ以下でもありません.つまり単純に水平同期信号と垂直同期信
号で図 21 の様に AND をとれば生成することができます.しかし,図 21
を見れば分かる様に,この波形では水平同期と垂直同期の区別がつかず
同期が乱れてしまいます.そのために前述で述べた様に垂直同期信号期
間にはには切り込みパルスや等価パルスを挿入することにより区別をし
ているのです.これらのパルスを入れたものが図 22 です.
Hsync
Vsync
Csync
図 21: コンポジット同期信号の生成 1
Hsync
Vsync
Csync
図 22: コンポジット同期信号の生成 2
26
4
謝辞
本研究は,精神的にも技術的にも指導して頂いた清水先生をはじめ,研
究室の先輩,同級生の力添えなしには到底進める事はできませんでした.
この場をお借りして皆様に感謝の意を表します.
5
参考文献
・MY80 を用いたコンピューターシステムの開発 山口 克明
・ハード ウェア記述言語のよる NTSC 複合同期信号合成実験指導書の作
成 宮島 伸孝
・http://www.dive-in.to/ hideto/NTSC/index.html
・http://nahitech.com/nahitafu.index.html
27