FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3...

54
1 � � FPGA LCD ������������� � �� ��� �� �� ��� �� 18 2 20 ������ �����������

Transcript of FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3...

Page 1: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

1

卒 業 研 究 報 告

題 目

FPGAと LCDを用いたゲームマシンの設計

指 導 教 員

橘 昌良 助教授

報 告 者

笠原 拓二

提出日 平成 18年 2月 20日

高知工科大学 電子・光システム工学科

Page 2: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

2

目次 はじめに・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1 第1章 ゲームの内容・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2 1.1 テトリス・・・・・・・・・・・・・・・・・・・・・・・・・・・2 1.2 ルール・・・・・・・・・・・・・・・・・・・・・・・・・・・・2 第2章 設計方法・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・3 2.1 設計の概要・・・・・・・・・・・・・・・・・・・・・・・・・・3 2.1.1 FPGAについて・・・・・・・・・・・・・・・・・・・・・4 2.1.2 VHDLについて・・・・・・・・・・・・・・・・・・・・・4 2.1.3 LCD・・・・・・・・・・・・・・・・・・・・・・・・・・4 2.1.4 SRAM・・・・・・・・・・・・・・・・・・・・・・・・・4 2.2 設計の流れ・・・・・・・・・・・・・・・・・・・・・・・・・・5 第3章 ゲームマシン仕様定義・・・・・・・・・・・・・・・・・・・・・・・・・7 3.1 仕様検討・・・・・・・・・・・・・・・・・・・・・・・・・・・7 3.1.1 テトリス本体の仕様・・・・・・・・・・・・・・・・・・・・7 3.1.2 テトリスの動作周波数・・・・・・・・・・・・・・・・・・・8 3.1.3 テトリスのアルゴリズム・・・・・・・・・・・・・・・・・・9 3.1.4 SRAMの動作・・・・・・・・・・・・・・・・・・・・・・11 3.1.5 ディスプレイの仕様・・・・・・・・・・・・・・・・・・・13 3.2 大まかな機能分割・・・・・・・・・・・・・・・・・・・・・・15 第4章 HDL設計・・・・・・・・・・・・・・・・・・・・・・・・・・・・・17 4.1 VHDLによる記述・・・・・・・・・・・・・・・・・・・・・・17 4.1.1 VHDL宣言部・・・・・・・・・・・・・・・・・・・・・・18 4.1.2 同期回路設計とリセット信号・・・・・・・・・・・・・・・19 4.2 ディスプレイ制御回路・・・・・・・・・・・・・・・・・・・・20 4.2.1 同期信号用のカウンタ設計・・・・・・・・・・・・・・・・21 4.2.2 アドレス計算・・・・・・・・・・・・・・・・・・・・・・23 4.2.3 LCD_controllerの状態遷移・・・・・・・・・・・・・・・・24 4.2.4 LCD_controllerのシミュレーション結果・・・・・・・・・・25 4.3 SRAM制御部の設計・・・・・・・・・・・・・・・・・・・・・26

Page 3: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

3

4.3.1 SRAMアクセスタイミング・・・・・・・・・・・・・・・・27 4.3.2 メモリーコントローラの状態遷移・・・・・・・・・・・・・29 4.3.3 Memory_controllerのシミュレーション結果・・・・・・・・30 4.4 テトリス本体の設計・・・・・・・・・・・・・・・・・・・・・31 4.4.1 テトリスの状態遷移回路・・・・・・・・・・・・・・・・・31 4.4.2 データ構造・・・・・・・・・・・・・・・・・・・・・・・33 4.4.3 アルゴリズム詳細・・・・・・・・・・・・・・・・・・・・35 4.4.4 テトリスのモジュール構成・・・・・・・・・・・・・・・・39

おわりに・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・40 謝辞・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・41 参考文献・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・42 付録1 LCD_controllerの VHDL記述・・・・・・・・・・・・・・・・・・・・43 付録2 Memory_controllerの VHDL記述・・・・・・・・・・・・・・・・・・48

Page 4: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

4

はじめに

携帯電話に代表される情報端末やカーエレクトロニクスなどでは、ソフトウェアとハー

ドウェアから構成されている組み込みシステムとして製品化されている。このような組み

込みシステムでは、小型化、低価格化、低消費電力化への要求から、回路の高機能化とと

もに複雑化が進んできた。そのため、システム LSI の設計には、大規模な回路を短期間で設計し、さらに設計資産を再利用できるような設計方法が考えられてきた。 近年の LSI 設計・開発現場ではハードウェア記述言語(HDL:Hardware Description Language)による設計が主流になってきている。HDL は、プログラミングの構文に似ていて、回路の機能を言語レベルで記述するだけで論理合成することができ、容易に回路の

設計、シミュレーションを行うことができる。これにより、従来のゲート・レベルでの設

計よりも大幅な設計期間の短縮がかなった。[1] 本研究では、HDLによる回路設計を学ぶために、プログラムによる回路の作成・書き換えが可能な FPGAを用いて、テトリスというゲームマシンの設計を行なった。研究の概要、経過について本論文に報告する。 本論文は全 4 章構成になっている。まず、第 1 章で設計するゲームの内容について説明し、次の第 2章で設計の流れ、各装置の概要などを説明する。第 3章は 2章の内容をより具体化したもので、第 4 章から実際の設計の内容についての解説になっている。最後に、付録として VHDLのソースを添付する。

Page 5: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

5

第 1章 ゲームの内容

この章では、今回製作するゲーム『テトリス』の概要を簡単に紹介する。 1.1 テトリス

テトリス(Tetris, 露Тетрис)は、1980年代末から 1990年代初めにかけ、世界各国で大流行したコンピューターゲームである。もともとは旧ソ連の科学者アレクセイ・パジ

トノフ(w:Alexey Pajitnov)が教育用ソフトウェアとして開発したものであったが、その後ライセンス供給が様々なゲーム制作会社に対してなされ、各種のプラットフォーム上で乱立

する状態になった。なお、テトリスのもつ数学性、動的性、ならびに知名度から、テトリ

スをゲームプログラミングの練習題材として用いられる例がしばしばみられた。 ゲームの内容は、1つの画面を次々と落下してくるブロックを積み上げ、それをひたす ら消していくという単純なアルゴリズムのパズルゲームである。次に、ゲームのルールに

ついて解説する。[10]

1.2 ルール フィールドは格子状のブロックを敷き詰めることが可能な領域からなる。 片面型テトロミノ状のブロックピースがフィールド上方から 1つずつ落下してくる。 プレイヤーは、落下中のブロックピースを 90度単位で回転させるか、格子単位で左右に移動させるか、ブロックピースを高速に落下させるかのいずれかの操作をすること

ができる。 ブロックピースがフィールド最下段、または他のブロックの上に着地すると、そのブ

ロックピースはブロックとしてフィールドに固定される。そして新しいブロックピー

スがフィールド上方に出現し、再び同じ処理が繰り返される。 格子の特定の行がすべてブロックで埋め尽くされると、その行にあるブロックが消滅

し得点となる。同時に多くの行を消去するほど高得点が得られる。(特に 4段消しを「テトリス」と呼ぶ。)消滅した行の上にあったブロックは、消えた行数分落下する。

固定されたブロックがフィールドの最上段まで積み重なるとゲームオーバーとなる。 以上がテトリスの基本的なルールである。詳しいアルゴリズムについては第 3 章から解説する。

Page 6: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

6

第 2章 設計の方法

この章では、設計に関する概要や使用したデバイスについて説明する。 2.1 設計の概要 本研究では、近年、デジタル回路設計手法として一般的になってきたハードウェア記述

言語の 1つである VHDLを用いて回路の機能設計を行う。設計した回路の実装には、源発振 30MHzほどで動作する FPGAを用いる。また、ゲーム画面表示用として LCD、フレームバッファ用として SRAMを使用する。(図 2.1参照)

図 2.1 全体の構成イメージ

FPGA

SRAM

Controller

LCD

テトリスの動作

全体の制御

VHDLで記述

Page 7: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

7

2.1.1 FPGAについて FPGA(Field Programmable Gate Array)とは PLC(Programmable Logic Device)の一種で、その名前のとおり内部の倫理を回路設計者がプログラムできる LSI である。プログラムによって容易に内部倫理を再構成できるため、回路実装後の動作シミュレ

ーションをした後でも機能の変更、追加を行うことができる。[1] 2.1.2 VHDLについて VHDL(Very high speed integrated circuit Hardware Description Language)とはアルゴリズム・レベルからゲート・レベルまでの抽象度の広い範囲においてデジタル

システムをモデル化することができるハードウェア記述言語である。言語レベルでの

記述から、自動設計(Design Automation : DA)ツールにより論理合成、配置配線を自動化できるため、従来の回路図入力に比べ大幅に設計期間を短縮することができる。ま

た、大きな特徴として C 言語のようにプログラムを先頭から順に処理するソフトウェア記述と違い、ハードウェアを設計する上で欠かすことのできないデジタル回路での

並列動作を、正確にモデリングすることができる。詳しい記述方法については第 4 章で解説する。[1][2]

2.1.3 LCD(Liquid Crystal Display)

液晶を利用した表示装置。2枚の偏光板と液晶分子を利用して光の透過率を調整することにより、画像を表示する。液晶分子自体は発光しないため光源となるバックライ

トが必要となる。 CRTディスプレイや PDPなど他の表示装置に比べて薄くて軽いので、携帯用コンピュータや省スペースデスクトップパソコン等によく使われている。以前まで LCDを代表とする表示デバイスはコストが高く、自動車や民生機器などの組み込み機器で使わ

れることはあまりなかったが、携帯電話や薄型テレビなどの普及により LCDのコストがかなり下がった。そのため、最近では組み込み機器向けに必要十分な機能に絞り込

んだグラフィックス LSIも生産されている。

2.1.4 SRAM(Static Random Access Memory) プログラムやデータを記録保持する装置の一種。記憶素子としてフリップフロップ

回路を用いるもので、アクセス速度が速く消費電力が小さいという特徴があるが、回路

が複雑になり集積度を上げにくいという欠点を持つ。電源を切ると記憶内容は失われる。 非同期 SRAM、シンクロナス(同期)SRAM、デュアル・ポート SRAM などいろいろなバリエーションがあるが、本研究ではもっとも一般的な非同期 SRAMを使用する。

Page 8: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

8

2.2 設計の流れ 工 程 設計データ

図 2.1 FPGA開発フロー 図 2.1 は FPGA 設計の基本的な流れである。上位レベルの工程から順に設計を行っていくが、下位レベルで問題がでたら上位レベルに戻って検討しなおす必要がある。次に、順

を追いながら各工程について簡単に解説していく。[6]

1. 仕様検討 これから作成する回路の機能を決める。実際の設計では要求仕様が提示されるので、

制約事項を踏まえて設計に着手できるレベルまで仕様を詳細に決めていく。この段階

で、どの機能をどのように実現するかのイメージがあれば、後の工程がスムーズに進

められる。

RLTシミュレーション

仕様検討

ブロック分割

HDLコーディング

コンパイル

論理合成・配置配線

FPGAダウンロード

実機検証

仕様書

ブロック図

ソースコード

テストベンチ

ネットリスト

回路情報

概念設計

動作設計

データパス設計

論理設計

物理設計

製造

Page 9: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

9

2. ブロック分割 仕様が決定してもいきなりHDLで記述するのは困難なので、機能別にいくつかのブロックに分割する。機能の切り分けが終わったら、それぞれの機能ブロック間でどの

ようにデータ、制御信号が流れているのかブロック図を書いて明らかにする。

3. HDLコーディング 分割した機能モジュールごとに、HDLを用いて RTL(Register Transfer Level ; レジスタ転送レベル)で記述する。

4. コンパイル

FPGA化できないHDLコードをシミュレーションしても意味がないので、まずは記述したコードに問題がないかどうかを FPGA開発ツールでチェックする。

5. RTLシミュレーション

テストベンチを作成して、シミュレーションでHDLコードの論理検証を行う。

6. 論理合成・配置配線 論理合成ツールを使用して RTLの HDLコードをゲート・レベルのネットリストに変換する。生成されたネットリストに従って、FPGA 開発ツールで部品を配置し、配線する。必要に応じてバック・アノテーション(配置配線後の遅延情報を反映したシ

ミュレーション)を実施する。

7. FPGAダウンロード FPGA開発ツールで FPGAへ渡す回路情報(ビットストリーム)を生成し、ダウンロード・ケーブルを介して回路情報を FPGAへ転送する。

8. 実機検証

FPGAを実際に動作させて検証する。 以上の手順で、次章から実際にテトリスを製作した流れにそって解説していく。また、

本論文では工程 1~2が第 3章、工程 2~5が第 4章、工程 6~8が第 5章にそれぞれ対応する。

Page 10: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

10

第 3章 ゲームマシン仕様定義 この章では、本研究で使用したデバイスの動作の仕組み、制約条件や、テトリスの動作

仕様について大まかに説明する。 3.1 仕様検討 初めに、ゲームのルールや動作、各デバイスの仕様を解説する。 3.1.1 テトリス本体の仕様 まず、ユーザーインターフェースの部分について下図に示す。

図 3.1 テトリス画面 図 3.3 使用するブロック

左 右 回転 下

図 3.2 入力インターフェース

Start Reset

Page 11: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

11

図 3.1は実行中のゲーム画面である。ゲームフィールド内は 10*24段で構成され、画面の右上に次のブロック、右下に各データを表示する。データの意味はそれぞれ次のとおり

である。 SCORE : ゲームの得点。ブロックを消すと加算される。一度に消す段数に比例して

多くの点数が加算される。 Lines : 消去した段数をカウントする。一定値に達すると Levelを加算する。 Level : ブロックピースの自動落下速度に影響する。 図 3.2はゲームコントローラーである。以下に説明する5つのキーで、回路全体を制御する。 Right_key : ゲーム実行中において、ブロックピースの右方向移動を入力する。 Left_key : ゲーム実行中において、ブロックピースの左方向移動を入力する。 Down_key : ゲーム実行中において、ブロックピースの下方向移動を入力する。 Turn_key : ゲーム実行中において、ブロックピースの回転を入力する。

Start/Stop_key : ゲーム待機状態の時、ゲーム開始信号 Startを入力する。また、ゲーム実行中の場合、ゲーム内容を保持したままゲーム待機状態へ遷移する。 その間ディスプレイの表示はオフになる。

Reset_key : ゲームを初期状態にもどす。 図 3.3はゲーム内で使用するブロックである。基本となる各色 7種に回転後のブロックも含め、計 19 個のブロックが登場する。回転後のブロックデータもそれぞれ SRAM に記憶しておく。 3.1.2 テトリスの動作タイミング ブロックの自動落下速度を 100ms~500msくらいとして回路設計を考えた場合、内部 クロック(30MHz=33.3ns)に比べて極端に遅い。また、キー入力による操作を考えても、あまり高速で動作する回路だと設計しづらくなる。よって、テトリス本体の回路には内部ク

ロックを分周した 1KHz程度(1ms)で設計する。

Page 12: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

12

3.1.3 テトリスのアルゴリズム ここでは、テトリスの動作について解説する。テトリスのアルゴリズムについては、す

でにWebで C言語によるソースコードが紹介されているので、それを参考にアルゴリズム確認、動作検証をおこなった。[9] まず、テトリスの主な処理として、以下のようにまとめられる。 ○ メイン…トップモジュールとして、各処理の呼び出しとゲーム実行中か否かの判定

を行う。 ○ 初期化処理…ゲーム内の各データを初期化する。 ○ ブロック生成処理…新しいブロックをランダムに生成する。 ○ ブロック落下処理…ブロックの自動落下の処理。 ○ ブロック操作処理…キー入力に応じた制御を行う。 ○ ブロック移動処理…ブロックを移動させる処理。 ○ ブロック回転処理…ブロックを回転させる処理。 ○ 重なり検査処理…移動、回転後のブロックが壁と重なってないか判定する。 ○ 画面描画処理…画面の表示を更新する。 ○ ブロック固定処理…壁と接触したブロックを固定する。 ○ 消去判定・消去処理…フィールド全段において消去判定を行い、ブロックの横 1列

揃ったラインを消去し、得点を加える。 図 3.4 はテトリスのプログラム構造を大まかにまとめた関係図である。SPD(Structured

Programming Diagrams)という表記法を使用している。基本的な処理の流れとしては、各ブロックを結んだ線上を上>右>下の優先順位で進んでいき、枝の端まできたら最初の枝

の下方向へ進んでいく。[3]

Page 13: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

13

図 3.4 テトリスプログラム SPD

前処理

後処理

回転

else

then

(IF : キー入力検出)

時間をカウント

カウントの初期化

ゲーム終了

テトリス

(IF : カウント一定未満)

(WHILE : 否ゲームオーバー)

各初期値の設定

入力キー判定

(SWITCH : 入力キー)

(IF : 重なり検査)

(IF : 重なり検査)

(IF : 重なり検査)

移動処理

(IF : 重なり検査)

移動処理

ブロック固定処理

画面更新処理

移動処理

回転処理

ブロック座標初期化

乱数発生

ブロックデータ再配置

ブロック座標更新

画面更新処理

(IF : 消去判定)

回転後ブロックロード

回転前ブロックに戻す

画面更新処理

消去処理

得点計算

画面更新処理

ゲームオーバー処理

ゲーム初期化処理

ブロック操作処理

ブロック落下処理

画面更新処理

(IF : 重なり検査)

(IF : 重なり検査)

移動処理

ブロック作成処理

ブロック作成処理

レベル1 レベル2 レベル3

Page 14: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

14

3.1.4 SRAMの動作 メモリとして、512k×8 ビット構成の非同期 SRAM を使用した。アドレスバス幅 19 ビット、データバス幅 8ビットで、CS(チップセレクト)、OE(アウトプット・イネーブル)、WE(ライト・イネーブル)の 3つの制御信号により動作を決定する。各制御入力と動作状態の関係は表 3.1のようになっている。[8]

表 3.1 FUNCTIONAL DESCRIPTION(データシートより) CS OE WE I/O Pin Mode Power H X X High-Z Deselected Standby L H H High-Z Output disabled Active L L H Dout Read Active L X L Din Write Active

CS はデバイスの選択状態をあらわす。制御信号は負極性であるので“L”のとき信号がオンとなり、デバイスが選択状態になる。選択状態でないとき、ほかの入力ピンはすべて

無視される。OE はデータ出力バッファを開く信号を意味し、WE は SRAM への書き込み信号を意味する。ただし、WEと OEの両方を“L”にした場合WEが優先されるため、リード動作を行うときはWEを“H”にしておかなくてはならない。 非同期 SRAMはその名のとおり、特定のクロック信号に同期して動くようなことはなく、入力信号の状態に対応して動作する。また、リード時に有効なデータが確定したことや、

ライト時にデータを受け取ったということを示す信号はないので、データシートのタイミ

ング図から読み取りながら設計する必要がある。リード・ライトサイクルについて、それ

ぞれ 2パターン計 4種類のアクセス方法を解説していく。

Page 15: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

15

○OEコントロールド・リード アドレスを制定させて、CS=”L”、WE=”H”とした状態で OEをアサート(Lレベル)することによりデータを I/Oピンに出力する。また、CS、WE、OEがリード状態の条件を満たさなくなると、SRAMは I/Oピンのドライブをやめ、ハイ・インピーダンスになる。(図 3.8参照) ○アドレスコントロールド・リード 上記の CS=”L”、WE=”H”、OE=”L”の状態のままアドレスを変化させることにより、新しいアドレスのデータを I/Oピンに出力させる。つまり、アクセス状態のままアドレスだけを変えて違うアドレスのデータを読み込む。ただし、高速 SRAMの一部にはデバイスが選択状態でアドレス変化をさせると誤動作するような物もあるので、この使い方が許される

か否かは事前の確認が必要である。 ○WEコントロールド・ライト アドレスを制定させて、CS=”L”の状態でWEをアサート(Lレベル)すると、I/Oピンはハイ・インピーダンス状態になり、その後ホストがデータを確定させる。データの書き込み

動作はWEの立ち上がりエッジで行われる。 ○CSコントロールド・ライト WEをあらかじめアサートした状態で、CSを利用してデータを書き込む。WEが先にアサートされているので、デバイスが選択状態になるのと同時にライト状態になる。

Page 16: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

16

3.1.5 ディスプレイの仕様 本研究では、SHARP製 5.5インチ パッシブカラー液晶モジュール LM32C041を使用した。LCD の外形は 150mm(W)×116mm(H)×25mm(D)。表示画素は 320(縦)×240(横)×RGB。間引き式階調コントロール回路を内蔵しており、垂直同期信号、水平同期信号、ドットクロック、RGB各ビットの表示データ入力により RGB各 8階調 512色を表示する。 表 3.2はタイミングの定格値、図 3.5、3.6はそれぞれ同期信号に対するデータ入力のタイミングを示している。[7]

表 3.2 インターフェースタイミング定格表 定 格 値 項 目

MIN TYP MAX

フレーム周期 12.5ms - 20ms

クロック周期 100ns - -

HSYNC”H”レベル幅 376DCK - -

HSYNC”H”レベル幅 248HSYNC - -

”L”レベル HSYNC 幅 3DCK - -

”L”レベル VSYNC 幅 3HSYNC - -

(a) 水平方向のタイミング

(b) 垂直方向のタイミング

図 3.5 データ入力タイミング図

X=320 X=1

+8DCK 48DCK 320DCK 3DCK

RGB data

DCK

Y=240 Y=1

240H +4H

Line data

HSYNC

VSYNC

4H 3H

HSYNC

Page 17: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

17

(a)通常の配置画面 (b)ゲームでの配置 図 3.6 画面上での動作

○タイミング図の動作の説明 VSYNCは画面縦方向の同期信号、HSYNCは横方向の同期信号を表している。データ入力の流れとしては、図 3.5(a)に示すように、まず VSYNCの立ち上がりからHSYNC4周期(379DCK)をカウントし、その後HSYNC1周期ごとに 1行分のデータ入力が開始される。 1行分のデータ入力に関しては、図 3.5(b)に示すようにHSYNCの立ち上がりからDCK(dot clock)48周期をカウントし、その後DCK(に同期して1画素のデータがLCDに入力される。この流れを繰り返しながら、図 3.6(a)に示すように画面左上隅から掃引を開始し、右下隅で1画面分の掃引を完了する。 ○本研究での使い方 テトリスのゲーム画面は縦長であるので、LCDを 90度 時計回りに回転した配置で使用し、よって、x,y座標の進み方は図 3.6(b)のようになる。 また、デジタル入力の液晶の場合、アナログ入力の液晶と違い画像データを送り続けな

くても画面を保持し続けることができる。図 3.4を見てもわかるとおり、テトリスの場合、画面更新処理はそう多くない。したがって、通常時 LCDの同期信号を止めておき、テトリス本体回路からの画面描画要求があった時のみ1フレーム分動作するよう設計する。画面

を連続して描画し続ける場合、DCKの 1周期を LCDからの SRAMアクセスとテトリス本体からの SRAMアクセスに二分して割り当てなくてはならないため、連続描画よりかなり設計を簡素化できる。LCDのフレーム周期 12.5ms~20msと、テトリス本体の動作周波数(1KHz=1ms)を考えると、ゲーム動作への影響も少ないと思われる。 Vシンク(VSYNC:vertical synchronous)、 Hシンク(HSYNC : horizontal synchronous)

x座標

240H

320DCK

HSYNC

VSYN

C

(1.1) (1.320)

(2.1)

(239.320)

(240.1) (240.320)

(240.1) (1.1)

(240.320) (320,1)

y座標

Page 18: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

18

3.2 大まかな機能分割 前節で得られた要求仕様をもとに、大まかな機能分割を行い、入出力を明確にする。

1つのモジュールだけで記述することもできるが、大規模で複雑な機能だと機能記述が散乱し、不具合が発生しやすくなりデバッグも大変になってしまう。設計データの再利用性を

高めるという意味でも、見通しのよい機能ブロックへ分割していく。 まず、最上位ブロックの入出力を明らかにする。(図 3.7参照) 図 3.7のブラックボックスを、いくつか機能ブロックに分割したものが図 3.8である。内部の主な回路はほとんど順序回路であるので、複数の有限状態機械(finite state machine : FSM)で構成される。

図 3.7 最上位ブロックの入出力仕様

図 3.8 大まかな機能ブロック図

SRAM data bus(8bit)

address bus(19bit)

CS

LCD data bus(9bit)

h_sync v_sync DCK

OE WE

FPGA

Right key Left key Down key Turn key Start/Stop Reset key

Clock

LCD

SRAM

スイッチ パルス制御部

テトリス メイン回路部

LCD・メモリ 制御部

LCD

SRAM

Page 19: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

19

図 3.8 全体の機能ブロック図 図 3.8について、右のモジュールから順に簡単に説明する。 ○LCD制御 FSM テトリス本体からの制御信号により LCD同期信号を発生し、画面を描画したり非表示にしたりする。L_con(LCD_controller)というモジュール名で設計する。 ○メモリ制御 FSM テトリス本体からの SRAM アクセスと、LCD からのアクセスに対しバス調停を行い、SRAM アクセス用の制御信号を操作する。Mem_con(Memory_controller)というモジュール名で設計する。 ○tetris FSM テトリスの動作を記述します。図 3.4のアルゴリズムを参考に、さらにいくつかのステートマシンで構成される。Tetris_mainというトップモジュールから設計していく。 ○DFF・T_CLK コントローラーからの入力信号のチャタリングを防止するとともに、入力パルスを DFFによって保持する。T_CLKでは、源発振からのクロックを分周してテトリス本体用のクロック(1kHz程度)を生成する。

LCD制御

FSM

Memory制御

FSM

DFF

DFF

DFF

DFF

DFF

DFF

T_CLK

Cont

rolle

r

GEN

tetris FSM

LCD

SR

AM

Page 20: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

20

第 4章 HDL設計 この章では、まず VHDLの基本的な記述のしかたについて説明する。その後、各機能ブロックについて RTLで記述できるところまで詳細に設計する。[1][2][4]

4.1 VHDLによる記述 VHDL の基本構造は図 4.1 に示すように、ライブラリ宣言とパッケージ宣言で始まり、エンティティ宣言で入出力ポートを定義し、アーキテクチャ宣言に動作を記述していく。

図 4.1 VHDLの言語構造

library ライブラリ名; ライブラリ宣言 use ライブラリ.パッケージ名.all; entity エンティティ名 is port(

信号 1 : in std_logic; 信号 2 : out std_logic);

end エンティティ名; architecture インプリメンテーション名 of エンティティ名 is signal node1 : std_logic; begin 動作記述部 end インプリメンテーション名;

エンティティ宣言

内部信号宣言部

アーキテクチャ宣言

Page 21: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

21

4.1.1 VHDL宣言部 ○ライブラリ宣言 ライブラリは、あらかじめ定義されたデータの集まりである。このライブラリを使用す

るための宣言を行う。IEEEライブラリは、VHDL記述において必須であり最初に必ず library IEEE;

と記述する。 ○パッケージ呼び出し パッケージは、データ・タイプなどをまとめたものである。とりあえず基本的な型が定

義されている std_logic_1164は必須。また、最後の allはパッケージ中のすべてを使うという意味である。 ○エンティティ宣言 エンティティは、回路の入出力ポートを定義する。

entity エンティティ名 is と

end エンティティ名; の間に信号の方向と属性を列挙する。 信号の方向は、入力(in)、出力(out)、双方向(inout)の 3種類、属性はビット(std_logic)とバス(std_logic_vector)を主に使用する。std_logic_vectorではデータ幅を指定する。このとき、downtoで定義すると最上位ビットが番号の大きい信号に割り当てられる。toで定義した場合逆になる。 ○アーキテクチャ宣言 アーキテクチャ宣言は、

architecture インプリメンテーション名 of エンティティ名 is で記述する。本体は、ノード宣言部と動作記述部からなる。ノード宣言部では、動作記述

部で用いるノード名(モジュール内部でのみ使い、外部には出力しない内部信号名)を宣

言する。 signal ノード名 : 属性;

動作記述部は、回路の動作について記述していく部分である。beginと endで囲み、この間に記述する。

Page 22: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

22

4.1.2 同期回路設計とリセット信号 ○同期回路 大規模な回路を確実に動作させるためには、すべてを同期回路で設計する必要がある。

同期回路とは、一定周波数の信号(クロック)に従ってすべてのフリップフロップが同じ

タイミングで動作する回路を意味する。よって、一定の順序で処理していく回路やフリッ

プフロップを使うような回路では、プロセス文のセンシティビティリストに clkを記述する。 プロセス文については下記に説明している。[1][2] ○リセット回路 回路の電源投入時の過度状態では回路の内部状態がどう定まるかが全く不明である。ま

た、プログラムが暴走して制御不能になった場合、回路を再び初期状態にしてリスタート

する必要がある。このような目的で回路を初期化するのがリセット信号である。上記の clkと同じくセンシティビティリストに加えて記述する。 ○同期信号と非同期信号

Dフリップフロップの一般的な記述を下に示す。 動作記述部の beginから endの間は全て同時に実行されるが、process文で囲まれた部分は上から順に実行され、下の process文で最初に戻る。1行目の()内はセンシティビティリストと呼ばれ、()内に記述された信号の値が変化した時のみ process文が実行される。

5行目の識別子 eventは遅延属性というもので、信号 CLKが変化しているとき真(TRUE)を返す。すなわち、5行目によりクロックの立ち上がりを検出し、クロックに同期して入力を出力に伝盤させている。一方 reset信号はクロックに同期した信号ではないため、if文の最初に記述している。 なお、同期信号によるデータ入力では、入力信号を保持・確定するための時間(セット

アップ・タイム)と(ホールド・タイム)が必要であるため、クロックの周波数とデータ

の入力タイミングに注意しなければならない。[1]

1 process( CLK, reset ) 2 begin 3 if ( reset = ‘0’ ) then 4 Q <= ‘0’; 5 elsif ( CLK ’event and CLK = ‘1’ ) then 6 Q <= D; 7 end if; 8 end process;

Page 23: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

23

4.2 ディスプレイ制御回路の設計 第 3章で分割した機能のうち、画面表示を制御するモジュール(LCD_controller)について解説する。図 4.2は信号入出力を表したブロック図であり、信号の内容については表 4.1に示している。 LCD T_main SRAM

図 4.2 LCD_controllerのエンティティ図

表 4.1 LCD_controllerの入出力仕様

信号 意味 clk システム内部クロック(30MHz) reset リセット入力 LCDRD_en テトリス本体からの画面更新要求 DISP_en テトリス本体からの画面表示 off要求 SD SRAM直結のデータ入力(8bit) A_count_N 表示画素アドレスの SRAM出力(17bit) LCDRD_en_off テトリス本体への画面更新終了出力 v_sync LCDの垂直同期信号 h_sync LCDの水平同期信号 DCK LCDの画素同期信号 DISP ディスプレイ表示オフ出力 LCD_red 赤色画素データ(3bit) LCD_green 緑色画素データ(3bit) LCD_blue 青色画素データ(3bit)

SD(8bit)

reset

LCDRD_en

DISP_en

clk v_sync h_sync DCK DISP RGBdata(9bit)

LCDRD_en_off

A_count(17bit)_N

LCD_controller

T_main

Mem_con

Page 24: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

24

33.3ns

内部の動作は、テトリス本体の制御信号によるステートマシンと、v_sync1周期分のカウンタで構成される。SRAMへのデータアクセスについては、SRAMをリード状態にしたままアドレスの値を変更することで 1フレーム分のデータを連続で読み出す構成としている。 また、LCDへ出力するデータ幅は 9bitであるが、SRAMのデータ幅が 8bitであるため青色出力 3bitのうち B1と B2に同じ値を出力するようにしている。[5] 4.2.1 同期信号用のカウンタ設計 LCDの画面表示は VSYNC、HSYNC、DCKの 3つの同期信号により動作しているため、それぞれの同期信号用の 3 つのカウンタが必要になる。また、表示させる画素を選ぶための、SRAM のフレームバッファ対するアドレスカウンタも必要である。そのため、モジュ

ールの内部に次のような 4つのカウンタを設計した。 ○S_count(2bit)

DCKを発振させるためのシステム内部クロックの 2bitカウンタ。clkの立ち上がりに同期して1ずつ加算されていき、0~3 の範囲を遷移していく。S_count0~1 の間 DCK=0、S_count2~3の間 DCK=1という条件付信号代入により、DCKを発生させる。システムクロックが 30MHzなので DCKは 7.5MHzとなる。

0 1 2 3 0 1 2 3

図 4.3 DCK発振タイミング図

133.3ns

DCK

S_count(3bit)

System clock(30MHz)

Page 25: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

25

… 562, 0, 1, 2, 3, … 50, 51, … 370,371 …

H_count 0, 1, 2,3,4, 5,6, 7, 8 … 246

○D_count(10bit) HSYNC用の DCKカウンタ。563個のドットクロックをカウントする。D_count0~2の時のみHSYNC=0としてHSYNCを発生させる。 D_count

図 4.4 HSYNC発生タイミング図 ○H_count(8bit)

VSYNC 用の HSYNC246進カウンタ。DCKカウンタ 562→0により HSYNCをインクリメントする。247カウントで 1画面の表示終了であるので、ここで全てのカウンタを初期化状態にして VSYNCとHSYNCを 1に固定する。

図 4.5 VSYNC発生タイミング図

○A_count(17bit) 読み込む画素データのアドレスを計算する。LCDの画素数が 320×240 であるため 320×240のカウンタを作ればよいが、テトリス本体から SRAMにアクセスする時のアドレス計算を簡潔にするため、512×240までカウントする。画像データの表示はVSYNC、HSYNCの立ち上がりからそれぞれ 4H、48DCK後となるため、図 4.4、4.5のカウンタのタイミング図を参照に D_count=51,H_count=7からカウントを開始する。

HSYNC 4H 3H

DCK 3DCK

HSYNC

48DCK 320DCK 192DCK

VSYNC

240H

Page 26: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

26

4.2.2 アドレス計算 SRAMのアドレス幅は 19bitであり 0~524288番地までデータを格納することができる。 本研究では x座標に下位 9ビットを割り当て、上位 10ビットを y座標に割り当てて使用する。すなわち横方向 512画素、縦方向 1024画素のメモリ空間が作成される。(図 4.6参照) こうすることにより、アクセスしたいアドレスの計算はy座標の値を左に 9 ビットシフトした値とx座標の値の orをとるだけで、アクセスしたいアドレスを生成することができる。(図 4.7参照)

図 4.6 メモリ領域 図 4.7 アドレス計算例 上記のアドレス計算を満たすため、アドレスのカウント(A_count)は、x 座標 9bit512分までカウントしている。

図 4.8 フレームバッファのアドレス空間

y座標

8bit

x座標 9bit

512

512*240-1

320

511

012

(x,y) (0,0) (1,0) (2,0)

(320,0)

(551,0) (0,1)

(511,239)

(0,0) (319,9)

表示領域

(511,0)

非表示領域

深さ

表示領域

非表示領域

(320,0)

(511,0)

(511,0)

他画像 格納用、その他

(0,1023) (511,1023)

(0.0) (319,0)

1フレーム

(0,239)

アクセスしたいアドレス(10,1) x座標 ”000001010”

or y座標 “0000000001000000000”

= “0000000001000001010”

アドレスの深さ 10進数 512+8+2=522 番地

y× 512 + x = アドレス

Page 27: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

27

4.2.3 LCD_controllerの状態遷移 LCD_controllerの状態遷移図を下に示す。通常 LCDには同期信号をとめた Idle状態であり、画面には前の画面更新処理で表示された画像が保持されている。 テトリス本体からの画面更新要求(LCDRD_en=1)が入ると活性化状態となり、各種カウンタにより同期信号を発生し、1画面表示処理をおこなう。1画面の処理が終わるとテトリス本体へ終了信号(LCDRD_en_off=1)を返し、(LCDRD_en=0)の入力により Idle 状態へ遷移する。 また、ユーザーインターフェース部のコントローラーの stop信号入力により、ディスプレイ表示オフ要求(DISP_en)が入力されると DISP_off 状態へ遷移する。テトリスの実行が停止している間、画面の表示がオフになる。

図 4.9 LCDコントローラーの状態遷移図

Idle 待機

LCD_act 画面描画 実行

DISP_off 画面表示 オフ

DISP_en=1

DISP_en=0

LCDRD_en=0

LCDRD_en=1 not DISP_en=0 not LCDRD_en=0

Page 28: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

28

4.2.4 LCD_controllerのシミュレーション結果 VHDLコーディング、論理合成、シミュレーションには ALTERA社の PLD総合開発ツール QuartusⅡ WebEdition(v5.1)を使用した。LCD_controllerのシミュレーション結果を以下に示す。なお、VHDLコードについては論文末の付録 1に示している。

(A) 0~1μsのシミュレーション結果

(B) 0~2msのシミュレーション結果 図 4.10 LCD_controllerのシミュレーション結果

Page 29: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

29

4.3 SRAM制御部の設計 SRAM アクセスに関する制御信号の発生、テトリス本体とLCDコントロール部からの

SRAM アクセスの際のバス調停を行う回路を設計する。この回路の入出力は以下のように

なる。

図 4.11 メモリコントローラーブロック図

表 4.2 メモリコントローラーの入出力仕様

信号 意味 clk システム内部クロック(30MHz) reset リセット入力 LCDRD_en テトリス本体からの画面更新要求 TR_en テトリス本体から SRAMへのデータ要求 TW_en テトリス本体から SRAMへの書き込み要求 TD テトリス本体とのデータバス(8bit) TA テトリス本体とのアドレスバス(19bit) A_count_N LCD_contからのフレームバッファアドレス(17bit) CS チップセレクト(非極性) OE アウトプットイネーブル(非極性) WE ライトイネーブル(非極性) SD SRAMとのデータバス(8bit) SA SRAMとのアドレスバス(19bit)

SD(8bit)

SA(19bit)

Memory contoroller

LCDRD_en TR_enTW_en

TD(8bit)

Reset

Clock

CS OE WE

TA(19bit)

A_count_N(17bit)

SRAM Tetris

LCD_controller

Page 30: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

30

4.3.1 SRAMアクセスタイミング SRAM へのアクセスタイミングとして、データシートのタイミング定格値を参考に次の

ようなアクセスサイクルを設計した。[8] リードサイクル、ライトサイクル共に3ステートでクロックに同期した制御信号の操作

を行い、全4クロックサイクルでの SRAMアクセスとなっている。また、LCDによるリードサイクルにはアドレスコントロールドリードで行っているため、テトリス本体からのリ

ードアクセスとは別のステートにより操作する。

図 4.12(a) テトリス本体からのリードサイクル

33.3ns

Data Valid

clk

CS

OE

Data out

Address

R0 R1 R2 Idle R0 R1 R2 Idle

trc=70ns~

taa=~70ns

Page 31: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

31

図 4.12(b) テトリス本体からのライトサイクル

図 4.12(c) LCDからのリードサイクル

図 4.12 SRAMアクセスタイミング図

Data Valid

Data Valid

CS

WE

Data in

clk

Address

W0 W1 W2 Idle W0 W1 W2 Idle

clk

Address

Data out

DCK

CS

OE

Page 32: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

32

4.3.2 メモリコントローラーの状態遷移 図 4.12を参考に状態遷移図でまとめたものが図 4.13である。

図 4.13 メモリーコントローラーの状態遷移図

LCDRD_en=0 LCDRD_en=1

TR_en=1 TW_en=1

Idle CS=H OE=H WE=H

W0 CS=L WE=L

R0 CS=L OE=L

W1 R1

W2 CS=H WE=H

R2 OE=H

LCD_act CS=L OE=L

Page 33: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

33

4.3.3 Memory_controllerのシミュレーション結果 Memory_controller のシミュレーション結果を以下に示す。なお、VHDL コードについては論文末の付録 2に示している。

図 4.14 Memory_controllerの単体シミュレーション結果

Page 34: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

34

4.4 テトリス本体の設計 第 3章でまとめたテトリスの仕様、大まかなアルゴリズムをもとに、HDLで記述できるまでに詳細に分析していく。 4.4.1 テトリスの状態遷移回路 第 3 章では処理の内容、順序についてまとめてプログラム構造図(図 3.4)を作成した。しかし、逐次実行のソフトウェアプログラムから作成したものであり、すべての回路が同

時に動作するように記述する HDL でそのまま構成を設計するのは困難である。そのため、HDLでは外部信号によって内部の状態が遷移する、状態遷移回路によって構成を考えていく。 本状態遷移回路は、以下のような 11種類の状態とする。状態遷移図を図 4.15に示す。

① Init – 各信号、レジスタの値を初期化する。 ② Idle – ゲーム開始の待機状態。画面表示はオフになっている。 ③ Run – ゲーム実行状態。各種入力信号により複数のステートに分岐する。 ④ R_shift – Right_keyの入力により、ブロックを右に移動させる。 ⑤ L_shift – Left_keyの入力により、ブロックを左に移動させる。 ⑥ Rot – Turn_keyの入力により、ブロックを回転させる。 ⑦ Drop – Down_key入力、もしくは一定時間経過により、ブロックを下移動する。 ⑧ Check_L – ブロックが横一列揃ったラインがないか調査する。 ⑨ Delet_L – 横一列揃ったラインを消去し、上のブロックを 1段ずらす。 ⑩ Create_B – 新しいブロックを作成し、画面初期位置へ配置する。 ⑪ End – ゲームオーバー画面を表示し、初期化の実行を待つ。

各状態の詳しい処理については、4.4.3節より順番に解説していく。

Page 35: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

35

図 4.15 テトリスの状態遷移図

移動完了

Down_key

時間経過

or

Turn_key

Left_key

Right_key

start_key

初期化完了 start_key

ブロック

配置完了

ブロック

配置 error ゲーム準備中サイクル

ゲーム実行中サイクル

Init 初期化

Idle 実行待機

End 再開待機

Run 実行状態

Create_B ブロック生成 R_shift

右移動

L_shift 左移動

Rot 回転

Drop 下移動

Check_L line調査

Delete_L line消去

消去列なし

消去完了消去列

発見

移動 error

Page 36: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

36

4.4.2 データ構造 各状態についての解説の前に、まず、テトリスの画像データの扱い方について解説する。

ゲーム画面の構成を図 4.16、ブロックの構成について図 4.17に示す。 ○画面構成 ゲーム画面は LCD を時計周りに 90°回転させた配置であるから、ブロックの落下方向は x座標系で考える事になる。すなわち、ブロックの下移動=x加算、右移動=yの減算、左移動=yの加算、という具合になる。また、ブロックの移動範囲は(40,100)~(279,199)の格子内とする。ゲーム画面の右上は、次に出現するブロックを表示する。(図 4.16参照)

図 4.16 ゲーム画面の構成

y座標

240

dot

x座標 320 dot (0,0) (319,0)

(0,239) (319,239)

(40,100) (279,100)

(40,199) (279,199)

Page 37: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

37

○ブロックデータの構成 ブロックの取り扱いに関しては、図 4.17左上のように 10×10ドットを 1セルとし、このセルを 4 つ組み合わせたものとして考える。各セルごとにそれぞれ位置情報を示すアドレスを持ち、ブロックの移動・回転はこのセル単位ごとに管理する。ブロックデータをフ

レームバッファに書き込む際も、1セル分の処理を 4回繰り返すことによりデータを書き込んでいく。 また、ブロックには 7 つの種類があり、さらにそれぞれ対応する回転後のデータがあるため、ブロックの種類ごとに 7 つの識別子を用意する。この識別子は、ブロックの回転動作だけでなくブロックの色分けの判定にも使用する。

図 4.17 ブロックの構成

保持する

座標

画素構成

1セル

1 8ドット 1

(0,0) (10,0)

(0,10) (10,10)

灰データ

黄データ

白データ

Page 38: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

38

4.4.3 アルゴリズム詳細 図 4.15に示した状態遷移をもとに、各状態での処理内容について順に解説していく。 ① Init 回路起動時、リセット信号入力時、または End 状態から start 入力があった時に実行する回路初期化状態。リセット信号のトグルにより各内部信号の値を初期化し、SRAM のフ

レームバッファに対し初期画面データを書き込む。各レジスタに初期値を与え初期ブロッ

クの作成が終わると、次の Idle状態へと遷移する。 ② Idle Initによる初期化の終了、もしくは Run状態から start入力があった時の状態。LCDに対して画面表示オフ信号(DISP_en)を出力する以外には特に何も処理をしない。start 入力が入るまでゲームの実行を待機する。 ③ Run ゲーム実行中のメインとなる状態。start入力でゲーム一時停止状態へ、各ブロック操作キー入力、および一定時間経過で、それぞれ④~⑦のブロック制御状態へ遷移する。なお、

時間経過による状態遷移にはカウンタを用いるが、時間のカウントは Run状態時だけでなく移動・回転処理状態にもカウントしていくことにする。こうすることで、移動信号を入

力し続けることによるブロックの落下停止を防ぐことができる。各状態への遷移の制御と

時間のカウントを許可するだけで、メインとはいえ特に複雑な処理はしない。 ④ R_shift

Run状態から Right_keyの入力により、 ブロックを 1セル右方向へ移動させる。 すなわち、レジスタに保持してある 4つの アドレスに対し、y座標-10の演算を行う。 しかし、移動後の位置に壁や他のブロックが あった場合、移動を中止しなければならない。 そのため、右図 4.14に示すような流れで処理 を行う。

図 4.18 ブロック移動処理の流れ

背景色

否背景色

ブロック消去

座標更新

ブロック書き込み

座標戻し

画素検査

LCD出力

Page 39: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

39

まず、制御中ブロックに対して重なり判定が起こらないように、R_shiftに状態遷移した時点で保持している 4 つのセルアドレスを参照して、ブロックを消去する。そして 4 つのアドレスに対しy座標+10 の演算を行う。演算後のアドレスが移動後のブロックの座標になるので、SRAM からこの 4つのアドレスの画素データをリードしてくる。その画素データが 4 つとも背景データ(黒)だった場合、移動先にブロックはないと判断できるので、このアドレスに対し画像データを書き込み、LCD への出力を実行する。4 つの内どれか 1つでも背景以外のデータが検出された場合、制御中ブロックと他のブロック・壁との重な

りがおきてしまうので、4 つのアドレスに対しy座標-10 の演算を行い、もとの座標にもどす。その後、再びブロック画像データを書き込み、Run状態へと遷移する。 ⑤ L_shift R_shiftと移動方向が逆なだけで処理の内容は同じであるので、セルアドレスy座標に対する演算を+-逆転させるだけでよい。 ⑥ Rot Run状態から turn_keyの入力により、ブロックの回転を実行する。処理の流れは図 4.14とほぼ同じであるが、R/L_shiftより座標の更新が少しだけ複雑になる。

A B D

C A B

D C

block No=1 address register A (0,0) + (50,150) → (50,150) B (10,0) + (50,150) → (60,150) C (20,0) + (50,150) → (70,150) D (0,10) + (50,150) → (50,160)

回転前アドレス

if (block No=1) then address register A (50,150) + (0,0) → (50,150) B (60,150) + (0,0) → (60,150) C (70,150) + (-10,10) → (60,160) D (50,160) + (10,10) → (60,170)

回転後アドレス

回転動作の座標の計算方法につい

て、左のようなブロックを例に説明す

る。 前節で解説したとおり、制御中のブ

ロックに対し 4 つのアドレスを各セルごとに持っている。ブロックのAセル

の位置座標が(50,150)の時、それを基準に各セルのアドレスが計算される。各

セルの位置はブロックの種類により異

なっているため、全 19種のブロック識別子を参照に計算を行う。

移動処理ではこのアドレスに対し同

じ数値の加算になるが、回転動作では

セルごとの位置が変更されるため、も

う一度ブロック識別子を参照してブロ

ックごとの演算を行う。 その後、移動処理と同じように重な

り判定を行い、ブロックのデータを書

き込んでいく。

Page 40: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

40

⑦ Drop Run状態から Down_key入力、もしくはゲーム実行サイクルにおける時間(テトリス用のクロック)のカウントが一定数になった時、ブロックを下方向へ移動させる。これもアドレスのx軸に対する加算になるだけで、あとの処理は R_shiftと同じ流れである。ただし、ブロックの移動エラーが起きた場合、座標を移動前に戻してブロックの再描画を行った後、

Run状態ではなく Check_L状態へと遷移する。 ⑧ Check_L この状態へ遷移したときに保持している 4 つのアドレスの x 座標に消える可能性のあるラインが含まれているので、x座標アドレスを別のレジスタへ格納しておき、このアドレスをもとにそれぞれ 1~4のラインに対し消去判定を行う。 消去ラインの判定にはカウンタを用いる。ゲームフィールド内のセルの y 軸に取りうる値の範囲は(100,110,120,130,140,150,160,170,180,190)だけであるので、この y座標と上記で格納したx座標のアドレスをもとに、SRAMからそれぞれ画素データをリードしてくる。このときの画素データが背景色データでない時(ブロックのセルデータが存在する場合)、

消去カウンタをカウントアップし、カウンタの値が 10の時、Delete_Lへと遷移する。 格納したx座標の走査が終わると Create_Bへと遷移する。

図 4.19 消去判定フロー

else

y=190

count≠10

y=190

count=10 (A or B,C,D)の 3つのx座標でライン検査

x

y

A B C D

背景色

否背景色

走査対象アドレスの保持

y=100

count+1

画素検査 (保持 x,y)

次のライン or Create_Bへ

y,count値

y+10

Delete_Lへ

Page 41: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

41

⑨ Delete_L 消去判定がでたラインに対して消去を行う。まず、Check_L で消去判定がでたx座標より上のフィールドデータを SRAMの空き領域へコピーする。そして、コピーしたデータを1段ずらしたところに上書きしていき、最後にゲームフィールド最上段を消去する。 消去判定と消去処理は 1ラインずつおこなうため、Check_Lで格納したx座標アドレスを 1セル分ずらして、再び Check_Lへ遷移する。 ⑩ Create_B 1 度目の実行でも、すでに Init で次に生成されるブロックは決定されてるため、次の次のブロックを乱数により決定する。その後、ブロックの位置を示す 4 つのセルアドレスを次のブロックを表示する領域に書き換え、次の次に生成されるブロックを書き込む。そし

て、ブロックのアドレスを初期位置へもどし、初期配置位置の画素を検査して重なりがな

いか調べる。初期位置に他のブロックがないことが確認できれば、新しいブロックをフレ

ームバッファに書き込む。ここまでで一連の処理が終わり、再び Run状態へ遷移する。もし、初期配置位置で重なり判定が起きた場合、Game overとなり End状態へ遷移する。 ⑪ End Game overを知らせるメッセージを表示して、start_keyによるゲーム初期化の実行を待つ。

Page 42: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

42

4.4.4 テトリス内部のモジュール構成 図 4.15の状態遷移図をもとに、テトリス本体のモジュール構成を以下のようにした。 コンポーネントによっては、さらに下位レベルのステートマシン、サブコンポーネントに

より構成され、階層化したステートマシンによってテトリスの動作を実現する。

図 4.20 テトリス本体の機能ブロック図

メイン FSM

アドレス

REG

画素

ROM

Control Block FSM

Tetris Initialize

FSM

Delete Block FSM

Create Block FSM

clk T_clk reset start turn down Left Right

DISP_en LCDRD_en TR_en TW_en TA TD

address BUS

Data BUS

Page 43: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

43

おわりに 本研究の目標としては、回路を実装して動作確認をするところまでであったが、結局回

路の構造や処理をまとめるだけで終わってしまった。処理の順序がわかってもゲート回路

で信号がどのタイミングでどのように伝盤していくのか、といったソフトウェアとハード

ウェアの動作の違いがなかなか呑み込めなかった。しかし、そのまま強引に下位レベルの

設計へと進めようとしてしまったために、後の段階で回路の整合性がとれなくなってしま

うなど、無駄が多かったように思える。HDLにより抽象的な段階からロジック回路を生成できるとはいえ、トップレベルから具体的な機能ブロックとロジック回路を作っていくに

は、基礎的な知識が十分に必要であると感じた。 全工程の半分程しか進められなかったが、あきらめずできるとこまで取り組んだことに

よって知識や解析力が身についただけでなく、ハードウェアの設計に関する興味も強くな

った。ゲームの設計には様々な要素が含まれるので、論理設計の学習に非常に有効である

と思う。今後、完成させる事はもちろん、アルゴリズムの最適化や回路規模の小型化、ゲ

ーム性の向上など、時間があれば考えていきたい。

Page 44: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

44

謝辞 今回の卒業研究に際して、丁寧なご助言、ご鞭撻下さりました橘 昌良助教授に心から感謝いたします。就職活動や大学生活についてご指導下さいました杉田 彰久教育講師はじめ、本学入学以来ご教授賜りました電子・光システム工学科の教員・職員の皆様と共に、ここ

に厚くお礼申し上げます。 また、共に最後まで卒業研究に励んだ橘研究室の皆さん、同期生諸氏にお礼を申し上げ

ます。 平成 18年 2月 20日

Page 45: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

45

参考文献 [1]「VHDLによるマイクロプロセッサ設計入門」仲野 巧 著、CQ出版 [2]「VHDLによるハードウェア設計」長谷川 裕恭 著、CQ出版 [3]「構造化プログラム設計図法 SPD」遠藤 裕香 著、共立出版 [4]「Design Wave magazine」2002年 5月号、CQ出版 [5]「Design Wave magazine」2003年 1月号、CQ出版 [6]「Design Wave magazine」2005年 4月号、CQ出版 [7]「5.5インチ LCD LM32C041仕様書」 [8]「CMOS SRAM K6T4008C1B Family仕様書」

[9]ゲーム&その他【プログラミング研究所】 「http://www13.plala.or.jp/kymats/study/game_other.html」 [10]テトリス - Wikipedia 「http://ja.wikipedia.org/wiki/%E3%83%86%E3%83%88%E3%83%AA%E3%82%B9」

Page 46: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

46

付録 1 LCD_controllerの VHDL記述 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity LCD_controller is port ( clk : in std_logic; reset : in std_logic; LCDRD_en : in std_logic; DISP_en : in std_logic; SD : in std_logic_vector(7 downto 0); A_count_N : out std_logic_vector(16 downto 0); LCDRD_en_off : out std_logic; v_sync : out std_logic; h_sync : out std_logic; DCK : out std_logic; DISP : out std_logic; LCD_red : out std_logic_vector(3 downto 1); LCD_green : out std_logic_vector(3 downto 1); LCD_blue : out std_logic_vector(3 downto 1) ); end LCD_controller; architecture Behavior of LCD_controller is type LCDstatus is ( idle, DISP_off, LCD_act); signal state : LCDstatus; -- LCD Sequencer state signal DCK_I : std_logic; -- Internal dot clock -- clock counter signal S_count : std_logic_vector(1 downto 0); -- system clock count(0 to 3) signal A_count : std_logic_vector(16 downto 0); --address count(0 to 512*240-1)

Page 47: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

47

signal D_count : std_logic_vector(9 downto 0); -- DCK count(0 to 562) signal H_count : std_logic_vector(7 downto 0); -- HSYNC count(0 to 246) begin -- LCD data out LCD_red <= SD(7 downto 5); LCD_green <= SD(4 downto 2); LCD_blue <= SD(1 downto 0) & SD(0); -- LCD state machine ------------------------------------- process(clk,reset) begin if( reset = '1' ) then state <= idle; DISP <= '1'; elsif( CLK'event and CLK = '1') then case state is when idle => if ( LCDRD_en = '1' ) then state <= LCD_act; elsif ( DISP_en = '1' ) then state <= DISP_off; DISP <= '0'; end if; when LCD_act => if ( LCDRD_en = '0' ) then state <= idle; end if; when DISP_off => if ( DISP_en = '0' ) then state <= idle; DISP <= '1'; end if; when others =>

Page 48: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

48

null; end case; end if; end process; -- state LCD_active ====================================== -- DCK generation,S_COUNT(0~3)---------------------------- process(clk, reset, LCDRD_en) begin if( reset = '1' or LCDRD_en = '0') then S_count <= (others => '0'); elsif( clk'event and clk='1' ) then if( state = LCD_act ) then if( S_count = 3 ) then S_count <= (others => '0'); else S_count <= S_count + 1; end if; end if; end if; end process; DCK_I <= S_count(1); DCK <= DCK_I; -- H_COUNT(0~246),D_COUNT(0~562),A_COUNT(0~512*240-1) ---- process(DCK_I, reset, LCDRD_en) begin if( reset = '1' or LCDRD_en = '0') then D_count <= (others => '0'); H_count <= (others => '0'); A_count <= (others => '0'); LCDRD_en_off <= '0'; elsif( DCK_I'event and DCK_I = '1' ) then if( state = LCD_act ) then if ( D_count = 562 ) then

Page 49: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

49

D_count <= (others => '0'); H_count <= H_count + 1; else D_count <= D_count + 1; end if; if ( A_count = 122690 ) then -- (512*240-190) LCDRD_en_off <= '1'; elsif ( H_count >= 7 and D_count >= 51 ) then A_count <= A_count + 1; end if; end if; end if; end process; A_count_N <= A_count; -- HSYNC,VSYNC generation---------------------------------- process (DCK_I, reset, LCDRD_en) begin if( reset = '1' or LCDRD_en = '0') then h_sync <= '1'; v_sync <= '1'; elsif( DCK_I'event and DCK_I ='1' ) then if( state = LCD_act ) then if ( D_count >= 0 and D_count < 3) then h_sync <= '0'; else h_sync <= '1'; end if; if ( H_count >= 0 and H_count < 3) then v_sync <= '0'; else v_sync <= '1'; end if; end if; end if;

Page 50: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

50

end process; end Behavior;

Page 51: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

51

付録 2 Memory_controllerの VHDL記述 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity Memory_controller is port ( clk : in std_logic; reset : in std_logic; LCDRD_en : in std_logic; TR_en : in std_logic; TW_en : in std_logic; TD : inout std_logic_vector(7 downto 0); TA : in std_logic_vector(18 downto 0); A_count_N : in std_logic_vector(16 downto 0); CS : out std_logic; WE : out std_logic; OE : out std_logic; SD : inout std_logic_vector(7 downto 0); SA : out std_logic_vector(18 downto 0) ); end Memory_controller; architecture Behavior of Memory_controller is type MEMstatus is ( idle, R0, R1 ,R2, W0, W1, W2, LCD_act); signal state : MEMstatus; -- SRAM Sequencer state signal TD_OE_I : boolean; -- Tetris data bus output enable signal SD_OE_I : boolean; -- SRAM data bus output enable begin

Page 52: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

52

-- tri state logic TD <= SD when TD_OE_I else (others => 'Z'); SD <= TD when SD_OE_I else (others => 'Z'); -- Mem_con state machine ------------------------------------- process(clk,reset) begin if( reset = '1' ) then state <= idle; CS <= '1'; OE <= '1'; WE <= '1'; TD_OE_I <= false; SD_OE_I <= false; elsif( CLK'event and CLK = '1') then case state is when idle => if ( LCDRD_en = '1' ) then state <= LCD_act; CS <= '0'; OE <= '0'; WE <= '1'; elsif ( TW_en = '1' ) then state <= W0; CS <= '0'; OE <= '1'; WE <= '0'; elsif ( TR_en = '1' ) then state <= R0; CS <= '0'; OE <= '0'; WE <= '1'; end if; -- LCD active ------------------ when LCD_act => if (LCDRD_en = '0') then

Page 53: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

53

state <= idle; CS <= '1'; OE <= '1'; end if; -- Read cicle ------------------ when R0 => state <= R1; when R1 => state <= R2; OE <= '1'; TD_OE_I <= true; when R2 => state <= idle; CS <= '1'; TD_OE_I <= false; -- Wright cicle ---------------- when W0 => state <= W1; SD_OE_I <= true; when W1 => state <= W2; CS <= '1'; WE <= '1'; when W2 => state <= idle; SD_OE_I <= false; when others => null; end case; end if; end process; process(A_count_N,LCDRD_en,TA) begin if (LCDRD_en = '1') then SA <= ("00") & A_count_N(16 downto 0);

Page 54: FPGA とLCD を用いたゲームマシンの設計 · 付録1 LCD_controller のVHDL ... 2.1.3 LCD(Liquid Crystal Display) 液晶を利用した表示装置。2 枚の ...

54

else SA <= TA; end if; end process; end Behavior;