卒 業 研 究 報 告
題 目
LED ディスプレイ用動画表示制御回路の設計と製作
指 導 教 員 矢野 政顕 教授 報 告 者 学籍番号: 1060237 氏名: 田中 振宇平成 18年 2月 21日
高知工科大学 電子・光システム工学科
目次
第
1
章
はじめに・・・・・・・・・・・・・・・・・・・・・・・
1
第
2
章
LED
ディスプレイ・・・・・・・・・・・・・・・・・・・
2
2-1 LED(Light Emitting Diode)・・・・・・・・・・・・・・・・・ 2 2-1-1 LED の発光原理・・・・・・・・・・・・・・・・・・・・ 2 2-1-2 フルカラーLED について・・・・・・・・・・・・・・・・ 3 2-2 LED ディスプレイの構成・・・・・・・・・・・・・・・・・・・・4 2-2-1 連珠状 LED ディスプレイとは・・・・・・・・・・・・・・・4 2-2-2 ランプユニットの構成・・・・・・・・・・・・・・・・・・5
第
3
章
動画表示制御システムの実現方法・・・・・・・・・・・・
6
3-1 動画表示するための制御方法・・・・・・・・・・・・・・・・・・6 3-1-1 輝度データの転送と LED の点灯・・・・・・・・・・・・・・6 3-1-2 輝度データの転送方法・・・・・・・・・・・・・・・・・・6 3-1-3 LED の点灯制御方法・・・・・・・・・・・・・・・・・・・ 7 3-2 動画表示制御方式・・・・・・・・・・・・・・・・・・・・・・・9 3-3 外部メモリについて・・・・・・・・・・・・・・・・・・・・・ 11第
4
章
VHDL
による動画表示制御システムの設計・・・・・・・
13
4-1 VHDL について・・・・・・・・・・・・・・・・・・・・・・・・ 13 4-2 全動画表示制御回路の構成・・・・・・・・・・・・・・・・・・ 13 4-3 輝度データの転送制御・・・・・・・・・・・・・・・・・・・・ 15 4-3-1 入出力信号・・・・・・・・・・・・・・・・・・・・・・ 15 4-3-2 設計順序と出力波形・・・・・・・・・・・・・・・ ・・・16 4-4 切換信号の発生制御・・・・・・・・・・・・・・・・・・・・・ 18 4-4-1 入出力信号・・・・・・・・・・・・・・・・・・・・・・ 18 4-4-2 設計順序と出力波形・・・・・・・・・・・・・・・・・・ 18 4-5 クロックの分周選択制御・・・・・・・・・・・・・・・・・・・ 19 4-5-1 入出力信号・・・・・・・・・・・・・・・・・・・・・・ 19 4-5-2 設計順序と出力波形・・・・・・・・・・・・・・・ ・・・19 4-6 LED 点灯時間の信号制御・・・・・・・・・・・・・・・・・・・・21 4-6-1 入出力信号・・・・・・・・・・・・・・・・・・・・・・ 21 4-6-2 設計順序と出力波形・・・・・・・・・・・・・・・・・・ 214-7 LED の点灯出力制御・・・・・・・・・・・・・・・・・・・・・・22 4-7-1 入出力信号・・・・・・・・・・・・・・・・・・・・・・ 22 4-7-2 設計順序と出力波形・・・・・・・・・・・・・・・・・・ 23 4-8 RGB の点灯時間選択制御・・・・・・・・・・・・・・・・・・・・24 4-8-1 入出力信号・・・・・・・・・・・・・・・・・・・・・・ 24 4-8-2 設計順序と出力波形・・・・・・・・・・・・・・・ ・・・25 4-9 輝度データの選択出力制御・・・・・・・・・・・・・・・・・・ 26 4-9-1 入出力信号・・・・・・・・・・・・・・・・・・・ ・・・26 4-9-2 設計順序と出力波形・・・・・・・・・・・・・・・・・・ 26 4-10 全制御回路のシミュレーション結果・・・・・・・・・・・・・・28
第
5
章
動画表示制御回路の製作と評価・・・・・・・・・・・・
29
5-1 動画表示テスト制御回路の製作・・・・・・・・・・・・・・・・ 29 5-2 外部メモリデータの作成・・・・・・・・・・・・・・・・・・・ 30 5-3 RGB の点灯時間データの検証・・・・・・・・・・・・・・・・・・31 5-4 静止画表示制御の評価・・・・・・・・・・・・・・・・・・・・ 32 5-5 動画表示制御の評価・・・・・・・・・・・・・・・・・・・・・ 37 5-6 設計上の問題点・・・・・・・・・・・・・・・・・・・・・・・ 40第
6
章
終わりに・・・・・・・・・・・・・・・・・・・・・・
41
謝辞・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
42
参考文献・・・・・・・・・・・・・・・・・・・・・・・・・・・
43
付録・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
44
VHDLの制御プログラム・・・・・・・・・・・・・・・・・・・・・・44第
1
章
はじめに
研究の背景
LED(Light Emitting Diode)は、「光を発生するダイオード」である。ダイオ ードでは、両電極端子に電圧を印加すると一方向にだけ電流が流れる。これを整 流作用という。LED とは、整流方向に電圧を印加(順電圧という)した時、電子 と正孔が再結合して、その一部のエネルギーが光に変換されるダイオードである。 LED は、戦後に開発され、年々その明るさが向上するとともに、黄緑色~(黄 色、橙色)~赤色までの LED が開発されている。LED は、強い発光ができるので、 非常に優れた次世代の照明器具用部品として注目されている。その理由は、従来 の照明器具と比べると、消費電力が極端に少なく(電球の 1/5 以下)、寿命(10 万時間)が圧倒的に長い(電球の 10 倍以上)ためである。さらに、近年では青 色の LED が開発されたことにより、光の 3 原色である赤、緑、青が揃ったことに なり、LED でフルカラーを再現できるようになった。これにより LED 信号機やフ ルカラーLED の表示装置も製作できるようになってきた。また、LED は応答スピ ードが速いので、動画対応にも有利であり、シャープな画像を得ることができる。 現在のLEDディスプレイでは、ほとんどの場合、マトリックス状にLEDが配置さ れている。これを制御するためには、多数の信号が必要となり、制御手順も複雑 である。また、LEDディスプレイの形や大きさが固定されているため、柔軟性に も欠ける。これらの問題を解決するために、連珠状LED ディスプレイが考えられ ている。これは、LED を一列に並べて、一本の連珠状にし、少数の制御信号線で 制御するものである。
研究の目的
平成16年に設計した連珠状LEDディスプレイは、最大1フレーム分の輝度デー タしか格納できなかったため、限られた動画しか表示できなかった。 本研究の目的は、動画を表示するための制御回路を再設計して、平成16年度に 設計した連珠状LEDディスプレイの問題点を改善し、通常の動画を表示できるよ うにすることである。また、この再設計を通じてVHDLによる設計法を習得するこ とも研究の目的とする。第2章
LED
ディスプレイ
2
‐
1
LED
(
Light Emitting Diode
)
2
‐
1
‐
1
LED
の発光原理
発光ダイオード(LED)は pn 接合を持つ半導体の順方向に電圧を印加し、電 子や正孔のキャリアを注入して発光現象を得ている。一般的に、これを注入形発 光と呼んでいる。発光の機構について、図 2.1 に示す[1]。 図 2-1 LED の発光原理 図 2-1(a)は電圧印加前の pn 接合の状態を示す。また、この物質のエネル ギーギャップを Eg とし、p, n の両側とも同一 Eg と仮定する。 Pn 接合の順方向に電圧を加えると、図 2-1(b)に示すように、接合部の電 位の障壁が低くなる。従って、n 側の電子(electron)は+側へ向かい、同時に p 側の正孔(hole)は-側に向かう。このとき、接合近傍の活性領域で電子と正孔 が再接合し、電子の有していたエネルギーが光として放出される[1]。2
-
1
-
2
フルカラー
LED
について
最近のLEDは“R(赤)”、“G(緑)”、“B(青)”3色を発光ができるよう になってきた。それらの3色の混合比率により全ての色を表現できる。このよう なR、G、Bの各々の発光チップが一つのパッケージになっているものをフルカ ラーLEDランプという。図 2-2 は、フルカラーLEDランプの構造と各発光 色の色度を示したものである。 図 2-2 フルカラーLEDランプの構造と各発行色 フルカラーLEDによるディスプレイの試みとしては、これまで SiC あるい は GaN 青色 LED と、他の材料による赤・緑色 LED とを組み合わせたハイブ リッド型のフルカラーLED ランプの報告がある。最近では、高発光効率の SiC の青色 LED と、GaP の赤色及び緑色 LED をランプ化し、純白色発光を含む 多色発光が可能なフルカラーLED が製作されている。組立にあたっては、キ ャンケースを使用することや樹脂封入に工夫することで、発熱などの対策を施 して製品化されている。このフルカラーLED をマトリックスに配置したディ スプレイは、従来のディスプレイとは異なる自然な色調の表示となり、品位の 高い情報の表示が可能である[2]。2
-
2
LED
ディスプレイの構成
2
-
2
-
1
連珠状
LED
ディスプレイとは
連珠状 LED ディスプレイは、フルカラーLED を一列に並べ、少数の制御信号 でランプユニットを制御するものである。本研究での連珠状 LED ディスプレイ は、赤(R)、緑(G)、青(B)の3色を表現できるフルカラーLED を 256 個使 用し、制御信号は FPGA で生成する。輝度データを各色 8 ビット、合計 24 ビッ トとするため、256×256×256=16,777,216 色を表示できる。連珠状 LED ディ スプレイの構成を図 2-3 に示す。 ラ ン プ ユ ニ ッ ト ラ ン プ ユ ニ ッ ト ラ ン プ ユ ニ ッ ト LED 出 力 制 御 回 路 F P G A 256個のフルカラーLED 16枚のプリント基板 図 2-3 連珠状 LED ディスプレイの構成 各フルカラーLED ランプの駆動を簡単にするために、ランプユニットが設置 されている。1つのランプユニットは 4 つのフルカラーLED を駆動する。フル カラーLED モジュールは一列に 16 個のフルカラーLED を搭載した 16 枚のプリ ント基板で構成されているので、使用するフルカラーLED の数は 16×16 個の 256 個である。動作について説明する。各フルカラーLED ランプを制御するに は、LED 出力制御回路から各輝度データを1ビットずつ、ランプユニットのレ ジスタに転送し、全ての輝度データの転送が終了すると各 LED を点灯させるため の制御信号を送る。これにより LED を輝度データにしたがって点灯させることができ る。2
-
2
-
1
ランプユニットの構成
連珠状 LED ディスプレイで使用する LED ランプユニットの基本的な動作回 路を図 2-4 に示す。ランプユニットは、点灯する LED を選択するためのシフト レジスタ、輝度データを保持して点灯を制御するシフトレジスタ、及び選択され た LED を輝度データにしたがって点灯させるためのゲートで構成されている。 図 2-4 ランプユニットの基本動作回路図 ランプユニットの動作原理について説明する。ランプユニットへの入力は、LED 出力制御回路から送られてきた輝度データ(PD_IN)をデータ転送クロック (PC_IN)によって、輝度データ保持用レジスタにシフト入力する。次に、切換 信号(QC_IN)に1を入力する。続いて、LED 点灯時間制御クロック(SC_IN) を入力すると、選択信号が順番にシフトされ、点灯させる LED を選択する。そ の時、各 NAND ゲートは輝度データと LED 選択信号が両方とも1であれば、 LEDを点灯する。これによりランプユニットを制御できる。第3章
動画表示制御システムの実現方法
3
-1
動画表示するための制御方法
3
-
1
-
1
輝度データの転送と
LED
の点灯
連珠状 LED ディスプレイで LED を点灯させるためには、各色の輝度データ を転送する必要がある。図 2-4 に示したように、各色についての輝度データ8 ビットを1ビット分ずつランプユニットに転送しなければならない。輝度データ の8ビットを全部表示するためには、図 3-1 に示すように、輝度データの1ビ ット目を転送、LED を点灯、2ビット目を転送、LED を点灯、あとは同じ順序 でこの動作を 8 ビット目まで繰り返せばよい。この一連の動作で1フレーム分が 表示される。この方法で、ディスプレイに動画を表示させるためには、最低でも 1秒間に 30 フレームの転送が必要である。さらに、ちらつきを抑えるためには 1秒間に約 60 フレームの転送するのが望ましいとされている。 図 3-1 輝度データの転送と LED の点灯3
-
1
-
2
輝度データの転送方法
輝度データの転送について説明する。まずランプユニットの輝度データ保持用 のレジスタに輝度データとデータ転送クロックを入力し、データ転送クロックの 立ち上がりで、輝度データをシフト入力する。このとき、メモリアドレスから各 色の輝度データ8ビット中の N ビット目を選択し、青(B)、赤(R)、緑(G)の順番に並び替えて1ビットずつ転送していく。したがって、最初の LED にセットし たデータは、順番にシフトされて、制御回路から一番最後の LED に転送される。 輝度データの転送を図 3-2 に示す。 図 3-2 輝度データの転送
3
-
1
-
3
LED
の点灯制御方法
LEDの点灯は、図 2-4 に示したように、LED を 1 個ずつ点灯させるので、各 LEDの点灯時間を制御すればよい。合成色は各色の点灯時間によって決まってく る。 ・ RGB比 正しい色を表現するために、各色の点灯時間比によって、LED の明るさのバ ランスをとる必要がある。メモリアドレス内のデータをすべて‘1’に設定して、 LED を点灯させた場合、ほぼ白色に見えることが確認できたので、各色の点灯 時間のデータを R:G:B = 2:3:1 の比率に固定している。 ・ サブフレーム制御方式 本研究の連珠状 LED ディスプレイでは、1フレームを 8 サブフレームに分割 して点灯制御するサブフレーム制御方式を採用している。1フレーム分のデータ 構成を図 3-3 に示す。サブフレームを 8 回送れば、1フレームの画像を表示で きる。3×256=768 ビット数 (8 ビット) 0 0 0 0 0 0 1サブフレーム 輝度データ 7 7 7 7 7 7 G R B G R B 1フレーム 図 3-3 1フレーム分のデータ構成 また、サブフレーム制御方式について、階調制御という方法を採用している。 階調制御とは、1サブフレームの点灯時間を2の n 乗倍に変えることで、LED の点 灯階調を制御している。例えば、輝度データが4ビットの“0101”の時、点灯時間は図 3-4 のようになる。 図 3-4 階調制御 ・ 点灯制御 各色の LED 点灯時間を制御するには、ランプユニットの選択レジスタクロッ クによって、輝度データの2ビット目は1ビット目の 2 倍、3 ビット目では 4 倍、 8ビット目では 128 倍という順番で制御していく。そうすることにより、8 ビッ トの輝度データをそのまま表現することができる。また、ランプユニットは、12 個の LED(4個のフルカラーLED)で構成している。各フルカラーLED(緑、赤、 青)を制御回路から近い順番に制御するので、これを4回繰り返して 12 パルスと
なる。さらに、これを終了するためには、1パルスの制御信号を生成する必要が ある。従って、計 13 パルスの出力となる。LED 出力制御回路からの1サブフレ ーム分の LED 点灯制御信号転送波形を図 3-5 に示す。 図 3-5 1サブフレーム分の LED 点灯制御信号転送波形
3
-
2
動画表示制御方式
本研究では、普通の動画を表示するために、連珠状 LED ディスプレイの各ラ ンプユニットに1秒間60フレームのデータを転送する必要があるから、回路全 体の動作は高速な処理が要求される。また、画像をなめらかに動かすためには, 一度送った輝度データの次の輝度データを準備している間に動作が途切れてし まわないように,常に輝度データを 2 フレーム分用意しておくようにする必要が ある。このテクニックをダブルバッファと呼ぶ。ダブルバッファによって、2つ の外部メモリから2つの輝度データを交互に読み出せば、動画の表示制御回路シ ステムの設計が実現できる。動画制御方式を、図 3-6 に示す。1フ レ ー ム 出 力 終 了 信 号 輝 度 デ ー タ 入 力 信 号 1 輝 度 デ ー タ 入 力 信 号 2 図 3-6 動画制御方式 動画を表示するための制御方式について説明する。先に、2つの外部メモリに 2つの異なる輝度データを入力する。図 3-6 に示すように、まず LED 出力制御 回路より、メモリアドレス信号を出力し、2つの外部メモリに入力する。次に、 メモリアドレスによって、選択された2つ輝度データを輝度データ選択制御回路 で選択して出力する。ここでは、1 フレームの表示を終了するときに、輝度デー タの選択を知らせるための出力制御信号が必要となるので、1フレーム分のデー タ出力が終了するたびに、1 つのパルス信号を出力する。この出力信号によって、 輝度データ選択制御回路の自動切換発生回路より‘0’か‘1’で2つの輝度デ ータを選択する。選択された輝度データを交互に出力することで、ダブルバッフ ァの機能を果たす。最後に連珠状 LED ディスプレイに輝度データを送り、以後 は同様の動作を繰り返せば、動画の表示が制御可能となる。
3
-
3
外部メモリについて
本研究で、使用する外部メモリは、CMOS EPROM の NMC27C64 である。 このメモリは容量が 65,536-Bit(8192×8)で、28 ピン構成である。メモリのピン 配置イメージを、図 3-7 に示す[3]。 各ピンの信号名と意味を、表 3-8 に示 す[3]。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 NMC27C64 Vpp A12 A7 A6 A5 A4 A3 A2 A1 A0 O0 O1 O2 GND PGM Vcc CE OE NC A8 A9 A11 A10 O7 O6 O5 O4 O3 図 3-7 メモリのピン配置イメージ 本研究で使用する接続ピンの配置について説明する。メモリアドレスの入力ピ ンは A0~A9、輝度データの出力ピンは O0~O7 である。Vcc と PGM を電源に、A12、GND、A11、OE 、A10 およびCE をグランドに接続する。それ以外のピン
表 3-8 各ピンの信号名と意味 A0~A12 OE CE PGM O0~O7 NC Vpp Vcc GND 出力されたメモリアドレスを入力 するための信号 チップイネーブル 信号出力イネーブル 選択された輝度データを出力す るための信号 プログラム信号 接続しない プログラミング電源 電源 アース
第4章
VHDL
による動画表示制御システムの設計
4
-
1
VHDL
について
VHDL(VHSIC-Hardware Description Language)はHDL(ハードウェア記 述言語)の一つである。従来、ディジタル回路の設計の基本は回路図であったが、 現在ではこの「ハードウェア記述言語」による回路設計が主流となっている。こ の言語は、いくつかの基本的な構文を理解するだけで、さまざまな回路を記述で きる。とくにCPLDとかFPGAとか言われているプログラマブルな集積回路 の設計において顕著である。FPGA や CPLD は、内部のロジックをユーザが何 度も自由に変更できるデバイスである。また、VHDLは記述能力の高い言語で さまざまなレベルでの記述ができる[4]。
4
-
2
全動画表示制御回路の構成
図 4-1 に示すような動画表示制御回路を VHDL を用いて設計する。今回の研 究では、4つの表示パターンを用意している。それぞれ制御モード(SEL)により、 2 つの外部メモリのデータを切り替えていく。具体的な設定については、 MEMORY_ADDRESSより、2 つ外部メモリ内の輝度データを選択してそれぞれ PD_DATA_1と PD_DATA_2 に入力する。“00”の場合は外部メモリ 1 のデータ を選択し、“01”の場合は外部メモリ 2 のデータを選択し、“10”の場合は 1 フ レームのデータを選択し、“11”の場合は 60 フレームのデータを選択して出力す る。選択されたデータは、LED 出力制御回路に入力されて処理される。後は各ラ ンプユニットに 1 ビットの輝度データ(PD)、データ転送クロック(PC)、切換発生信号 (QC)、点灯時間制御信号(SC)を各 1 ビットずつ転送すると、連珠状 LED ディスプレイ 上に画像を表示できるようになる。CLK はシステムクロック、RESET は初期状態に戻 すための信号、EN は全回路の動作を開始するための信号を表している。図 4-1 動画表示制御回路の入出力信号
動画表示制御回路は、輝度データ転送出力回路(PC、PD)、切換信号発生回路
(QC)、LED 点灯時間出力回路(SC)、LED 出力制御回路、クロック分周選択出力回路、
輝度データ選択出力制御回路、RGB 点灯時間選択回路の 7 つのブロックから構成さ れている。動画表示制御回路全体の構成ブロック図を図 4-2 に示す。
外部メモリ1 外部メモリ2 連 珠 状 L E D デ ィ ス プ レ イ 輝度データ転送 出力回路 切換信号発生回路 LED点灯時間 出力回路 RGB点灯時間 選択回路 輝度データ選択出力 制御回路 LED出力制御回路 クロック分周 選択 出力回路 PC PD QC SC 8bit 8bit 8bit 3bit 2bit 8bit 10bit MEMORY_ADDRESS 1フ レ ー ム の 終 了 信 号 PD _D AT A1 PD _D AT A2 PD_DATA RGB_ADDRESS RGB_DATA LED出力制御回路 BIT _S EL EC T PC _P D _E N Q C _E N SC_EN PC_PD_END Q C _E ND SC _E ND 2bit EN RESET CLK SEL 動画表示制御回路 SC_CLK 図 4-2 全動画表示制御回路の構成ブロック図
4
-
3
輝度データの転送制御
4
-
3
-
1
入出力信号
輝度データ転送出力回路の入出力信号を図 4-3 に示す。各信号の意味は次の 通りである。CLK はシステムクロック、RESET は初期状態に戻すための信号、 PC_PD_EN は回路の動作を開始するための信号、PD_DATA は外部メモリにある 8Bit の輝度データを示すための信号、BIT_SELECT は輝度データの N Bit 目を選択するための信号、PC_PD_END は輝度データの全ビット(768Bit)の転送 を終了したときの信号、MEMORY_ADDRESS はメモリにある輝度データを順
番に選択して出力するための信号、PC、PD はランプユニットに転送するための 信号を表している。 図 4-3 輝度データ転送出力回路の入出力信号
4
-
3
-
2
設計順序と出力波形
輝度データ転送出力回路の設計順序について説明する。この回路は、輝度デー タ を ラ ン プ ユ ニ ッ ト の レ ジ ス タ に 転 送 す る た め の 回 路 で あ る 。 ま ず 、 MEMORY_ADDRESS と PC を 出 力 す る に は 、 最 初 の 10 ビ ッ ト 目 を MEMORY_ADDRESSとして使い、残りの 1 ビット目をデータ転送用クロック (PC)として使う。このため合計 11 ビットのカウンタ回路を作る。このカウンタ により、1535 回カウントする。ここでは、出力波形のタイミングを調整するた めに、偶数ビット目のクロックの立下りを検出して、PC 信号を立ち上げるよう にする。次に、768 ビットの転送データを終了するための終了信号(PC_PD_END) を出力し、カウンタ回路の動作を止める。PC_PD_EN の信号が‘1’である間、 PC_PD_ENDは‘1’を出力したままになる。最後に、BIT_SELECT の 3 ビットに よって、8 ビットの輝度データから 1 ビットが選択され、レジスタに 1 ビットが 保持される。これが PD の信号として出力される。回路の構成ブロック図を図 4 -4 に示す。回路の各出力信号のシミュレーション波形を図 4-5 に示す。図 4-4 輝度データ転送出力回路の構成ブロック図
4
-
4
切換信号の発生制御
4
-
4
-
1
入出力信号
切換信号発生回路の入出力信号を図 4-6 に示す。各信号の意味は次の通りで ある。CLK はシステムクロック、RESET は初期状態に戻すための信号、QC_EN は回路の動作を開始するための信号、QC は輝度データの転送から LED の点灯 に切換るための信号、QC_END は切換信号の出力が終了したときの信号を表し ている。 図 4-6 切換信号発生回路の入出力信号4
-
4
-
2
設計順序と出力波形
切換信号発生回路の設計順序について説明する。この回路は、輝度データの 転送が終了したときに切換を知らせるための回路である。QC_EN の制御により、 ‘1’であれば動作する。切換信号の発生は 2 ビッシフトレジスタを用いて行う。 基本的な動作は“00” → “01” → “10” → “00”という状態で出力する。1 ビット目を QC の出力信号、2 ビット目を QC_END の出力信号とし、QC に‘0’が出力されたあとに QC_END に‘1’が出力されるようにする。QC_EN の信号が‘1’である間、QC_END は‘1’を出力したままになる。こうすることによって、切換えの動作を行うことができ る。回路の構成ブロック図を図 4-7 に示す。回路の各出力信号のシミュレーショ ン波形を図 4-8 に示す。図 4-8 切換信号発生回路の出力シミュレーション波形
4
-
5
クロックの分周選択制御
4
-
5
-
1
入出力信号
クロック分周選択出力回路の入出力信号を図 4-9に示す。各信号の意味は次 の通りである。CLK はシステムクロック、RESET は初期状態に戻すための信号、 SC_EN は回路の動作を開始するための信号、BIT_SELECT は分周されたクロ ックを選択するための信号、SC_CLK_OUT は分周されたクロックを出力するた めの信号を表している。 図 4-9 クロック分周選択出力回路の入出力信号4
-
5
-
2
設計順序と出力波形
クロック分周選択出力回路の設計順序について説明する。この回路は、LED の点灯を制御するためにクロックを各周期に分周し、分周されたクロック信号を 選択して出力する回路である。クロック分周回路は 8 ビットのカウンタで構成さ れており、LED 点灯の階調制御に用いる。次に、BIT_SELECT によって、分周 された 2 の N 乗倍で生成したクロックを選択して出力する。回路の構成ブロッ ク図を図 4-10 に示す。回路の各出力信号のシミュレーション波形を図 4-11 に示す。
図 4-10 クロック分周選択出力回路の構成ブロック図
4
-
6
LED
点灯時間の信号制御
4
-
6
-
1
入出力信号
LED 点灯時間出力回路の入出力信号を図 4-12 に示す。各信号の意味は次の 通りである。CLK はシステムクロック、RESET は初期状態に戻すための信号、 SC_EN は回路の動作を開始するための信号、SC_CLK_IN は分周されたクロッ クを入力するための信号、RGB_DATA は各色の点灯時間データを示す信号、SC は各点灯時間によって、ディスプレイの LED を点灯させるための信号、SC_END は LED の点灯制御信号の出力が終了したときの信号、RGB_ADDRESS は RGB 点灯時間選択回路に格納している RGB の点灯時間データを示すための信号を表 している。 LED点灯時間出力 回路 RESET SC_CLK_IN RGB_DATA SC_EN SC RGB_ADDRESS SC_END 8Bit 2Bit 図 4-12 LED 点灯時間出力回路の入出力信号4
-
6
-
2
設計順序と出力波形
LED点灯時間出力回路の設計順序について説明する。この回路は、SC_CLK_IN の信号を入力することで動作する。まず、8 ビットのカウンタ回路を作る。この カウンタの内容と入力した RGB_DATA の信号が一致すれば、1 つのパルス信号 を出力する。次に、出力された信号を SC 信号カウンタ回路によって、“1100” までカウントし、SC 信号として出力する。このとき、SC の出力信号を終了する 必要があるから、“1100”になると SC_EN の信号が‘1’である間に、SC_END に‘1’を出力したままの状態で回路の動作を終了する。RGB_ADDRESS は、R、 G、B の点灯時間データを選択する信号で、2 ビットのカウンタ回路を用いて生 成する。回路の構成ブロック図を図 4-13 に示す。回路の各出力信号のシミュレ ーション波形を図 4-14 に示す。図 4-13 LED 点灯時間出力回路の構成ブロック図 図 4-14 LED 点灯時間出力回路の出力シミュレーション波形
4
-
7
LED
の点灯出力制御
4
-
7
-
1
入出力信号
LED 出力制御回路の入出力信号を図 4-15 に示す。各信号の意味は次の通り である。CLK はシステムクロック、RESET は初期状態に戻すための信号、EN は全回路の動作を開始するための信号、PC_PD_END は輝度データ (768Bit)の 転送終了を知らせる信号、QC_END は切換信号の出力終了を知らせる信号、SC_ENDは LED の点灯制御信号の出力終了を知らせる信号、PC_PD_EN は輝
度データ転送出力回路の動作を開始するための信号、QC_EN は切換信号発生回 路の動作を開始するための信号、SC_EN は LED 点灯時間出力回路の動作を開始 するための信号、BIT_SELECT は輝度データの N ビット目と分周されたクロッ
クを選択するための信号、FRAME_END_OUT は 1 フレームの終了を知らせる ための信号を表している。 図 4-15 LED 出力制御回路の入出力信号
4
-
7
-
2
設計順序と出力波形
LED 出力制御回路の設計順序について説明する。この回路は、各 PC、PD、 QC、SC の出力回路を制御し、LED ディスプレイに輝度データを 1 ビットずつ を転送するための回路である。まず EN は‘1’の状態で回路を動作する。EN= ‘1’のとき、PC_PD_EN=‘1’と SC_EN=‘0’になり、PC_PD_END=‘1’ のとき、PC_PD_EN=‘0’と QC_EN=‘1’になり、QC_END=‘1’のとき、 QC_EN=‘0’と SC_EN=‘1’になり、SC_END=‘1’のとき、PC_PD_EN =‘1’と SC_EN=‘0’になる。この順番で繰り返して制御すれば LED を点 灯できる。次に、BIT_SELECT の信号は、3 ビットのカウンタで生成しており、 SC_END= ‘ 1 ’ の と き に こ の カ ウ ン ト は 動 作 を 開 始 す る 。 最 後 に 、FRAME_END_OUTは BIT_SELECT=“111”と PC_PD_EN=‘1’のときに、
FRAME_END_OUTに‘1’を出力する。回路の構成ブロック図を図 4-16 に示
す。回路の各出力信号のシミュレーション波形を図 4-17 に示す。
図 4-17 LED 出力制御回路の出力シミュレーション波形
4
-
8
RGB
の点灯時間選択制御
4
-
8
-
1
入出力信号
RGB 点灯時間選択回路の入出力信号を図 4-18 に示す。各信号の意味は次の 通りである。RESET は初期状態に戻すための信号、EN は全回路の動作を開始 するための信号、RGB_ADDRESS は RGB 点灯時間選択回路に格納している RGBの点灯時間データを選択するための信号、RGB_DATA は各色の点灯時間デ ータを示す信号を表している。 図 4-18 RGB 点灯時間選択回路の入出力信号4
-
8
-
2
設計順序と出力波形
RGB 点灯時間選択回路の設計順序について説明する。この回路は、格納して いる RGB 点灯時間データを、RGB_ADDRESS により選択して出力する回路で ある。2 ビットの RGB_ADDRESS 信号によって、3 つの固定された異なる RGB の点灯時間データを選択して出力する。“00”は“00000001”の点灯時間データ を選択し出力、“01”は“00000010”の点灯時間データを選択し出力、“10”は “00000011”の点灯時間データを選択し出力する。回路の構成ブロック図を図 4 -19 に示す。回路の各出力信号のシミュレーション波形を図 4-20 に示す。 SELECTER RESET EN RGB_ADDRESS RGB_DATA 2Bit 8Bit 図 4-19 RGB 点灯時間選択回路の構成ブロック図 図 4-20 RGB 点灯時間選択回路の出力シミュレーション波形4
-
9
輝度データの選択出力制御
4
-
9
-
1
入出力信号
輝度データ選択出力制御回路の入出力信号を図 4-21 に示す。各信号の意味 は次の通りである。RESET は初期状態に戻すための信号、EN は全回路の動作を 開始するための信号、FRAME_END_IN は 1 フレームの終了を知らせる信号、 SEL は表示したい輝度データを切換えていくための信号、PD_DATA_IN1 は外 部メモリ 1 にある 8Bit 輝度データを示すための信号、PD_DATA_IN2 は外部メ モリ2にある 8Bit 輝度データを示すための信号、PD_DATA_OUT は外部メモリ にある 8Bit の輝度データを示すための信号を表している。 図 4-21 輝度データ選択出力制御回路の入出力信号4
-
9
-
2
設計順序と出力波形
輝度データ選択出力制御回路の設計順序について説明する。この回路は、制御 モード(SEL)によって、表示したい外部メモリにある 8Bit の輝度データを選択す る回路である。まず、外部メモリ1と 2 のデータを 60 回ずつ転送するに、1 回 ずつを数えるための 60 進カウンタを設計する。1 つ目の輝度データが 60 回をカ ウントしたら、フレーム選択回路によって 1 フレームの輝度データと 60 フレー ムの輝度データを切換えていく。このようにすることで、1 フレームの輝度デー タと 60 フレームの輝度データの両方を転送できる。次に、JK フリップフロップ を用いて、入力した信号の立ち上がりを検出することで、前の信号と自動的に切 り換わる。これより 2 つの輝度データが交互に切換わるようになる。あとは、モ ード制御回路より、輝度データを選択して出力する。回路の構成ブロック図を図4-22 に示す。回路の各出力信号のシミュレーション波形を図 4-23 に示す。
図 4-22 輝度データ選択出力制御回路の構成ブロック図
4
-
10
全制御回路のシミュレーション結果
次に、制御回路全体のシミュレーション結果を示す。
(a)
1
サブフレームの出力波形
1サブフレームの輝度データを転送したときの出力波形を図 4-24 に示す。 図 4-24 1 サブフレームのシミュレーション結果(b)
1
フレームの出力波形
1フレームの輝度データを転送したときの出力波形を図 4-25 に示す。 図 4-25 1 フレームのシミュレーション結果(c)
ダブルバッファのときの出力波形
ダブルバッファを行ったときの出力波形を図 4-26 に示す。 図 4-26 ダブルバッファのシミュレーション結果第5章
動画表示制御回路の製作と評価
5
-
1
動画表示テスト制御回路の製作
今回の研究では、動画制御プログラムをFPGAに書き込んで、回路の動作確認を 行った。使用したFPGAは、
Altera FLEX10K10 シリーズ EPF10K10LC84-4
である。
FPGA とは、Field Programble Gate Array の略で、VHDLなどのハードウェア記 述言語で記述したプログラムにより、内部のロジックを自由に変更できるデバイス である。記述した回路のプログラムを変更することにより容易にロジックを変更で きる。本研究で製作した動画表示テスト制御回路を図5-1に示す。動画表示するた めに使用した連珠状LEDディスプレイを図5-2に示す。
図 5-2 連珠状 LED ディスプレイ
5
-
2
外部メモリデータの作成
今回の研究では、さまざまな輝度データを入力して、動画表示の動作確認を行っ た。輝度データの記述については、青、赤、緑の順で 16 進の“00”と“FF”のど ちらかを指定することで、LED の点灯と消灯の部分を記述できる。LED の数は 768 個であるから、1 サブフレーム分の輝度データは 768 ビットである。1 フレーム分 の輝度データを表示するためには、同じような輝度データを 8 サブフレーム分を記 述する必要がある。5
-
3
RGB
の点灯時間データの検証
今回の研究では、RGB の点灯時間データを固定して検証を行った。これより、 初期値の RGB 比(2:3:1)のデータをそのまま使用すると、点灯時間が早すぎて、 表示された画像はほとんど形が見えなく、ちらつきも激しい。人間の目ではとても 確認しにくい。これを解決するために、点灯時間がちょうど人間の目で確認できる ような速度になるように点灯時間のデータを大きくした。この結果、各色の点灯時 間は、緑は“20”、赤は“13”、青は“7”とし、また 1 秒間に 60 フレームの輝 度データを送れるように設定した。5
-
4
静止画表示制御の評価
静止画を表示した各場合について次に示す。
(1)
白色による静止画表示
白色を点灯させる場合は、各 LED の輝度データの記述に従って、点灯させた い LED を白色に指定することで点灯できる。RGB の 3 色を同時に点灯させると、 白色に見えるように輝度データを作成した。つまり、外部メモリ内のデータをす べて“FF”の状態とした。点灯状態は少し青っぽい色に見え、完全な白色を表示 できなかった。これは RGB の点灯時間データは固定されているためである。動 作検証の結果は、輝度データに従って指定した通りの色が確認できた。白色によ る点灯表示を図 5-3 に示す。 図 5-3 白色による点灯表示(2)
RGB
の
3
色による静止画表示
RGBの 3 色を点灯させる場合は、各 LED の輝度データの記述に従って、点灯 させたい LED を所望の色に指定することで点灯できる。ここでは、上から青、 緑、赤という順で輝度データを記述して行った。動作検証の結果は、輝度データ に従って指定した通りの色が確認できた。RGB の 3 色による点灯表示を図 5-4 に示す。 図 5-4 RGB の 3 色による点灯表示(3)
文字による静止画表示
文字を点灯させる場合は、各 LED の輝度データの記述に従って、点灯させた い LED を文字の形に指定することで点灯できる。ここでは、文字の‘工’と‘科’ を表示したいから、‘工’と‘科’の文字を緑と赤に指定して、それ以外の色は 紫と黄色というように輝度データを記述して行った。動作検証の結果は、輝度デ ータに従って指定した通りの文字が確認できた。文字による点灯表示を図 5-5 に示す。 図 5-5 文字による点灯表示(4)
単色点灯の検証
図 5-6 は白色を点灯するときに、オシロスコープで見た出力波形である。
(5)
多色点灯の検証
図 5-7 は青、緑、赤の順で点灯するときに、オシロスコープで見た出力波形
である。
5
-
5
動画表示制御の評価
動画を表示した各場合について次に示す。
(1)
1
フレームによる動画表示検証
ダブルバッファによって、2 つの文字を 1 フレームずつ点灯させた場合を図 5 -5 に示したが、輝度データの転送速度が速すぎて、転送されてきた 2 つの画像 はほぼ静止画にしか見えない。2 つの輝度データを重ねているため、色調も不鮮 明で、はっきりとした動画を表示することができなかった。動作検証の結果は、 画像がバラバラであることを示している。1 フレームによる動画点灯表示を図 5 -8 に示す。 図 5-8 1 フレームによる動画点灯表示(2)
60
フレームによる動画表示検証
図5-9はダブルバッファによって、図5-5に示した2つの文字を60フレームず つ点灯させる場合である。1 秒間に60 フレームのデータ転送を行い、転送され てきた2つの画像を交互に切換るようになっているため、はっきりとした動画を 表示できた。動作検証の結果は、色調がよく、文字もはっきり“工科”の2文字 であることが確認できる。 図 5-9 60 フレームによる動画点灯表示(3)
動画表示の出力波形
図 5-10 はダブルバッファの動作によって、動画を表示するときに、オシロス コープで見た出力波形の様子である。出力波形から外部メモリ 1 にある輝度デー タと外部メモリ 2 にある輝度データを交互に切換えて転送していることが確認で きる。 図 5-10 動画表示の出力波形5
-
6
設計上の問題点
今回の研究で製作した動画表示制御回路については、マイコンを搭載する予定 であったが、時間がなくてできなかった。これより、RGB の点灯時間のデータが 固定されているため、白色を表示するときに、はっきりしたきれいな白色を表示で きなかった。今回の研究で作成した輝度データは、2 つの外部メモリの中に、直接 2 パターン書き込んでいたため固定されていた。しかし、2 つの画面を交互に切り 換えて表示するという動画表示の基本を確認できた。今後は輝度データを自由に書 き換えられるように改良する必要がある。第
6
章
終わりに
今回の研究で製作した動画表示制御回路は、平成16年で設計した連珠状LEDディ スプレイの制御回路を再設計したものであり、輝度データを最低2フレーム格納で きるメモリを制御回路に備え、ダブルバッファの動作によって、2つのメモリでデ ータの表示とデータの受信を交互に行えるようにしたものである。この研究により、 一応通常の動画の動きが見られることを確認した。今後の課題については、今回の 動画表示制御回路の設計を通して、設計上で発生した問題点を解決し、任意でさま ざまなパターンを連続的に表示して、華麗な動画を見られるようにすることである。 つまり、対応する方法の一つは平成16年で設計した連珠状LEDディスプレイのマイ コンを用いてC言語による制御回路設計の部分を再設計し、それと連結することで、 実現は可能と考えられる。 また、今回の研究で製作した動画制御回路により、動画を表示するために必要な 1フレームの転送速度は5.483ms、周波数は182.4Hzと確認できた。マイコンとは転 送速度と周波数が異なっているため、同じ速度の転送はできない。今後の設計にお いては、転送速度を十分考慮して設計を行わなければならない。 さらに、本研究を通じて、LED ディスプレイ上の LED 点灯を制御するための基 本的な知識を身につけることができた。また、FPGA を使って、動画制御回路を設 計することによって、VHDL の様々な設計テクニックの設計方法を学習することが できた。謝辞
本研究を進めるにあたり日頃より懇切丁寧なご指導してくださいました、高知工科大学 工学部電子・光システム工学科矢野政顕教授に深く感謝いたします。また、日頃から多 くの助言を頂きお世話になりました原央教授、橘昌良助教授、他各先生方に厚くお 礼申し上げます。 また、今回の研究において、とくに日頃から多くの助言、始終丁寧なご指導を頂き、大 変お世話になりました山岡大祐氏はじめ、同研究室の各先輩方、同学部生の仲間たちに 厚くお礼申し上げます。そして、日頃から多くの御協力、助言を頂きました中村聡志氏、 百田雅人氏、岡本浩和氏にも大変お世話になり、とても感謝いたします。 最後に、本研究のフルカラーLEDを提供してくださった日亜化学工業株式会社殿に 感謝します。参考文献
[1] 電子ディスプレイ 小林俊介著 電子情報通信学会 1992 [2] 電子ディスプレイ 松本正一著 オーム社 1995
[3] FAIRCHILD NMC27C64 65,536-Bit(8192×8)CMOS EPROM January 1999 [4] VHDLによるディジタル回路入門 並木秀明、永井亘道著 株式会社技術評論社 2004 [5] VHDLで学ぶディジタル回路設計 吉田たけお、尾知博著 CQ出版株式会社 2002 [6] HDLによる高性能ディジタル回路設計 森岡澄夫著 CQ出版株式会社 2002 [7] VHDLによるハードウェア設計入門 長谷川裕恭著 CQ出版株式会社 2001 [8] HDL設計練習帳 猪飼国夫著 CQ出版株式会社 2002
付録
VHDL
の制御プログラム
付録1
全動画制御回路
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ANIMA_DISPIAY_CONTROL is Port ( CLK : in std_logic; EN : in std_logic; RESET : in std_logic; J : in std_logic; K : in std_logic;SEL : in std_logic_vector(1 downto 0);
PD_DATA_1 : in std_logic_vector(7 downto 0); PD_DATA_2 : in std_logic_vector(7 downto 0);
MEMORY_ADDRESS : out std_logic_vector(9 downto 0); PC : out std_logic; PD : out std_logic; QC : out std_logic; SC : out std_logic ); end ANIMA_DISPIAY_CONTROL; architecture RTL of ANIMA_DISPIAY_CONTROL is component LED_OUT Port ( CLK : in std_logic; RESET : in std_logic;
EN : in std_logic;
PD_DATA : in std_logic_vector(7 downto 0); RGB_DATA : in std_logic_vector(7 downto 0); PC_OUT : out std_logic;
PD_OUT : out std_logic; QC_OUT : out std_logic; SC : out std_logic;
MEMORY_ADDRESS_OUT : out std_logic_vector(9 downto 0);
RGB_ADDRESS_OUT : out std_logic_vector(1 downto 0);
FRAME_END_OUT : out std_logic ); end component;
component RGB_DATA_SELECT
Port ( RESET : in std_logic; EN : in std_logic;
RGB_ADDRESS : in std_logic_vector(1 downto 0); RGB_DATA : out std_logic_vector(7 downto 0)); end component;
component PD_DATA_SELECT_CONTROL Port ( RESET : in std_logic; EN : in std_logic; J : in std_logic; K : in std_logic;
SEL : in std_logic_vector(1 downto 0); FRAME_END_IN : in std_logic;
PD_DATA_IN_1 : in std_logic_vector(7 downto 0); PD_DATA_IN_2 : in std_logic_vector(7 downto 0); PD_DATA_OUT : out std_logic_vector(7 downto 0)); end component;
signal RGB_DATA_REG : std_logic_vector(7 downto 0);
signal FRAME_END_REG : std_logic;
signal PD_DATA_SIG : std_logic_vector(7 downto 0); begin
U0:LED_OUT port map ( CLK => CLK, RESET => RESET,
EN => EN, PD_DATA => PD_DATA_SIG, RGB_DATA => RGB_DATA_REG, PC_OUT => PC, PD_OUT => PD, QC_OUT => QC, SC => SC, RGB_ADDRESS_OUT => RGB_ADDRESS_REG, MEMORY_ADDRESS_OUT => MEMORY_ADDRESS, FRAME_END_OUT => FRAME_END_REG );
U1:RGB_DATA_SELECT port map ( RESET => RESET, EN => EN, RGB_ADDRESS => RGB_ADDRESS_REG, RGB_DATA => RGB_DATA_REG ); U2:PD_DATA_SELECT_CONTROL port map ( RESET => RESET,J => J, K
=> K,
EN => EN, SEL => SEL, FRAME_END_IN => FRAME_END_REG, PD_DATA_IN_1 => PD_DATA_1, PD_DATA_IN_2 => PD_DATA_2, PD_DATA_OUT => PD_DATA_SIG ); end RTL;
付録2
RGB点灯時間選択回路
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity RGB_DATA_SELECT isPort ( RESET : in std_logic; EN : in std_logic;
RGB_ADDRESS : in std_logic_vector(1 downto 0); RGB_DATA : out std_logic_vector(7 downto 0));
end RGB_DATA_SELECT;
architecture RTL of RGB_DATA_SELECT is begin
RGB_DATA <= "00000001" when ( RGB_ADDRESS = "00" and EN = '1' ) else "00000010" when ( RGB_ADDRESS = "01" and EN = '1' ) else "00000011" when ( RGB_ADDRESS = "10" and EN = '1' ) else "00000000";
付録3
輝度データ転送出力回路
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity PD_DATA_SELECT_CONTROL is Port ( RESET : in std_logic; EN : in std_logic; J : in std_logic; K : in std_logic;SEL : in std_logic_vector(1 downto 0); FRAME_END_IN : in std_logic;
PD_DATA_IN_1 : in std_logic_vector(7 downto 0); PD_DATA_IN_2 : in std_logic_vector(7 downto 0); PD_DATA_OUT : out std_logic_vector(7 downto 0)); end PD_DATA_SELECT_CONTROL;
architecture RTL of PD_DATA_SELECT_CONTROL is signal PD_DATA_REG : std_logic_vector(7 downto 0); signal JK_Q : std_logic;
signal Q_B : std_logic; signal Q : std_logic;
signal FRAME_DATA_COUNT : std_logic_vector(5 downto 0); signal FRAME_COUNT_OUT : std_logic;
signal FRAME_END_IN_REG : std_logic; begin
--FRAME_COUNT_OUT—
process ( RESET, FRAME_END_IN, EN ) begin
if ( RESET = '0' or EN = '0' ) then FRAME_COUNT_OUT <= '0';
elsif ( FRAME_END_IN'event and FRAME_END_IN = '1' ) then if ( FRAME_DATA_COUNT = "111100" ) then FRAME_DATA_COUNT <= "000000"; FRAME_COUNT_OUT <= '1'; else FRAME_DATA_COUNT <= FRAME_DATA_COUNT + '1'; FRAME_COUNT_OUT <= '0'; end if; end if; end process; --FRAME_SELECT--
process ( RESET, EN, SEL(0) ) begin if ( RESET = '0' or EN = '0' ) then FRAME_END_IN_REG <= '0'; PD_DATA_OUT <= ( others => '0' ); else if ( SEL(0) = '0' ) then FRAME_END_IN_REG <= FRAME_END_IN; else FRAME_END_IN_REG <= FRAME_COUNT_OUT; end if; end if; end process; --JK_FF-- Q <= JK_Q; Q_B <= not JK_Q;
process ( FRAME_END_IN_REG, RESET ) begin
if ( RESET = '0' ) then JK_Q <= '0';
elsif ( FRAME_END_IN_REG' event and FRAME_END_IN_REG = '1' ) then
JK_Q <= (J and not JK_Q) or (not K and JK_Q); end if;
--PD_DATA_MODE-- process ( RESET, EN, JK_Q ) begin if ( RESET = '0' or EN = '0' ) then PD_DATA_REG <= ( others => '0' ); else if ( SEL = "00" ) then PD_DATA_OUT <= PD_DATA_IN_1; elsif ( SEL = "01" ) then
PD_DATA_OUT<= PD_DATA_IN_2; else if ( JK_Q = '0' ) then PD_DATA_OUT <= PD_DATA_IN_1; else PD_DATA_OUT<= PD_DATA_IN_2; end if; end if; end if; end process; end RTL;
付録4
PC_PD、QC、SC出力とLED出力制御の結合回路
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity LED_OUT is Port ( CLK : in std_logic; RESET : in std_logic; EN : in std_logic;PD_DATA : in std_logic_vector(7 downto 0); RGB_DATA : in std_logic_vector(7 downto 0); PC_OUT : out std_logic;
PD_OUT : out std_logic; QC_OUT : out std_logic; SC : out std_logic;
MEMORY_ADDRESS_OUT : out std_logic_vector(9 downto 0); RGB_ADDRESS_OUT : out std_logic_vector(1 downto 0); FRAME_END_OUT : out std_logic );
end LED_OUT;
architecture RTL of LED_OUT is component PC_PD
Port ( RESET : in std_logic; CLK : in std_logic;
PD_DATA : in std_logic_vector(7 downto 0); BIT_SELECT : in std_logic_vector(2 downto 0); PC_PD_EN : in std_logic;
PC : out std_logic; PD : out std_logic;
PC_PD_END : out std_logic;
MEMORY_ADDRESS : out std_logic_vector(9 downto 0));
component QC
Port ( RESET : in std_logic; CLK : in std_logic; QC_EN : in std_logic; QC_END : out std_logic; QC : out std_logic); end component; component SC_OUT Port ( CLK : in std_logic; RESET : in std_logic; SC_EN : in std_logic;
BIT_SELECT : in std_logic_vector(2 downto 0); RGB_DATA : in std_logic_vector(7 downto 0); SC_END : out std_logic;
SC_S : out std_logic;
RGB_ADDRESS_S : out std_logic_vector(1 downto 0));
end component;
component LED_OUT_CONTROL
Port ( RESET : in std_logic; CLK : in std_logic; EN : in std_logic;
PC_PD_END : in std_logic; QC_END : in std_logic; SC_END : in std_logic; PC_PD_EN : out std_logic; QC_EN : out std_logic; SC_EN : out std_logic;
BIT_SELECT : out std_logic_vector(2 downto 0); FRAME_END_OUT : out std_logic );
end component;
signal QC_END_REG : std_logic; signal SC_END_REG : std_logic; signal PC_PD_EN_REG : std_logic; signal QC_EN_REG : std_logic; signal SC_EN_REG : std_logic;
signal BIT_SELECT_REG : std_logic_vector(2 downto 0); begin
U0:PC_PD port map ( CLK => CLK, RESET => RESET,
PD_DATA => PD_DATA, BIT_SELECT => BIT_SELECT_REG,
PC_PD_EN => PC_PD_EN_REG, PC => PC_OUT, PD => PD_OUT, PC_PD_END => PC_PD_END_REG, MEMORY_ADDRESS => MEMORY_ADDRESS_OUT ); U1:QC port map ( CLK => CLK, RESET => RESET,
QC_EN => QC_EN_REG, QC_END => QC_END_REG, QC => QC_OUT );
U2:SC_OUT port map ( CLK => CLK, RESET => RESET,
SC_EN => SC_EN_REG, BIT_SELECT => BIT_SELECT_REG,
RGB_DATA => RGB_DATA, SC_END => SC_END_REG,
SC_S => SC, RGB_ADDRESS_S => RGB_ADDRESS_OUT );
U3:LED_OUT_CONTROL port map ( CLK => CLK, RESET => RESET, EN => EN, PC_PD_END =>
PC_PD_END_REG,
QC_END => QC_END_REG, SC_END => SC_END_REG,
PC_PD_EN => PC_PD_EN_REG, QC_EN => QC_EN_REG,
SC_EN => SC_EN_REG, BIT_SELECT => BIT_SELECT_REG,
FRAME_END_OUT => FRAME_END_OUT ); end RTL;
付録5
LED出力制御回路
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity LED_OUT_CONTROL isPort ( RESET : in std_logic; CLK : in std_logic; EN : in std_logic;
PC_PD_END : in std_logic; QC_END : in std_logic; SC_END : in std_logic; PC_PD_EN : out std_logic; QC_EN : out std_logic; SC_EN : out std_logic;
BIT_SELECT : out std_logic_vector(2 downto 0); FRAME_END_OUT : out std_logic );
end LED_OUT_CONTROL;
architecture RTL of LED_OUT_CONTROL is
signal BIT_SELECT_REG : std_logic_vector(2 downto 0); type LED_OUT_STATE is ( PC_PD, QC, SC1, SC2 ); signal LED_OUT_CURRENT_STATE : LED_OUT_STATE;
begin
--PC_PD_EN_OUT, QC_EN_OUT, SC_EN_OUT--
process ( RESET, CLK, LED_OUT_CURRENT_STATE, PC_PD_END, QC_END, SC_END ) begin if ( RESET = '0' ) then PC_PD_EN <= '0'; QC_EN <= '0'; SC_EN <= '0'; LED_OUT_CURRENT_STATE <= PC_PD;
elsif ( CLK'event and CLK = '1' ) then case LED_OUT_CURRENT_STATE is when PC_PD => if ( EN = '1' ) then PC_PD_EN <= '1'; SC_EN <= '0'; LED_OUT_CURRENT_STATE <= QC; end if; when QC => if ( PC_PD_END = '1' ) then PC_PD_EN <= '0'; QC_EN <= '1'; LED_OUT_CURRENT_STATE <= SC1; end if; when SC1 => if ( QC_END = '1' ) then QC_EN <= '0'; SC_EN <= '1'; LED_OUT_CURRENT_STATE <= SC2; end if; when SC2 => if ( SC_END = '1') then PC_PD_EN <= '1'; SC_EN <= '0'; LED_OUT_CURRENT_STATE <= QC; end if; when others => LED_OUT_CURRENT_STATE <= PC_PD; end case; end if; end process; --BIT_SELECT_OUT-- BIT_SELECT <= BIT_SELECT_REG; process ( RESET, SC_END ) begin if ( RESET = '0' ) then
elsif ( SC_END'event and SC_END = '1' ) then if ( BIT_SELECT_REG = "111" ) then BIT_SELECT_REG <= ( others => '0' ); else BIT_SELECT_REG <= BIT_SELECT_REG + '1'; end if; end if; end process; --FLAME_END--
FRAME_END_OUT <= '1' when ( BIT_SELECT_REG = "111" and PC_PD_END = '1' ) else
'0'; end RTL;
付録
6
輝度データ転送出力回路
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity PC_PD isPort ( RESET : in std_logic; CLK : in std_logic;
PD_DATA : in std_logic_vector(7 downto 0); BIT_SELECT : in std_logic_vector(2 downto 0); PC_PD_EN : in std_logic;
PC : out std_logic; PD : out std_logic;
PC_PD_END : out std_logic;
MEMORY_ADDRESS : out std_logic_vector(9 downto 0)); end PC_PD;
architecture RTL of PC_PD is
signal PD_BIT_DATA_CN : std_logic_vector(10 downto 0); signal PC_PD_END_REG : std_logic;
signal PC_REG1 : std_logic; signal PC_REG2 : std_logic; signal PD_REG : std_logic; begin
--PC_OUT, PC_PD_END--
PC_PD_END <= PC_PD_END_REG;
MEMORY_ADDRESS <= PD_BIT_DATA_CN (10 downto 1); process ( RESET, CLK, PC_PD_EN )
begin
PD_BIT_DATA_CN <= ( others => '0' ); PC_PD_END_REG <= '0';
elsif ( CLK'event and CLK = '1' ) then
if ( PD_BIT_DATA_CN = "11000000000" ) then PD_BIT_DATA_CN <= "11000000000"; PC_PD_END_REG <= '1'; else PD_BIT_DATA_CN <= PD_BIT_DATA_CN + '1'; PC_PD_END_REG <= '0'; end if; end if; end process;
process ( RESET, CLK ) begin if ( RESET = '0' ) then PC_REG1 <= '0';
elsif ( CLK'event and CLK = '0' ) then PC_REG1 <= PD_BIT_DATA_CN (0); end if;
end process; PC <= PC_REG2;
process ( RESET, CLK ) begin if ( RESET = '0' ) then PC_REG2 <= '0';
elsif ( CLK'event and CLK = '0' ) then PC_REG2 <= PC_REG1; end if; end process; --PD_OUT-- PD <= PD_REG;
process ( RESET, PC_PD_EN, PD_BIT_DATA_CN (0) ) begin if ( RESET = '0' or PC_PD_EN = '0' ) then PD_REG <= '0';
elsif ( PD_BIT_DATA_CN (0)'event and PD_BIT_DATA_CN (0) = '0' ) then
when "000" => PD_REG <= PD_DATA(0); when "001" => PD_REG <= PD_DATA(1); when "010" => PD_REG <= PD_DATA(2); when "011" => PD_REG <= PD_DATA(3); when "100" => PD_REG <= PD_DATA(4); when "101" => PD_REG <= PD_DATA(5); when "110" => PD_REG <= PD_DATA(6); when "111" => PD_REG <= PD_DATA(7); when others => PD_REG <= '0';
end case; end if;
end process; end RTL;
付録7
切換信号発生回路
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity QC isPort ( RESET : in std_logic; CLK : in std_logic; QC_EN : in std_logic; QC_END : out std_logic; QC : out std_logic); end QC;
architecture RTL of QC is
signal QC_REG : std_logic_vector(1 downto 0); begin
QC <= QC_REG(0); QC_END <= QC_REG(1);
process ( CLK, RESET, QC_REG, QC_EN ) begin
if ( RESET = '0' or QC_EN = '0' ) then QC_REG <= ( others => '0' ); elsif ( CLK'event and CLK = '1' ) then if ( QC_REG = "10" ) then QC_REG <= "10"; else QC_REG <= QC_REG + '1'; end if; end if; end process; end RTL;
付録8
SC出力とSC_CLK出力の結合回路
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity SC_OUT is Port ( CLK : in std_logic; RESET : in std_logic; SC_EN : in std_logic;BIT_SELECT : in std_logic_vector(2 downto 0); RGB_DATA : in std_logic_vector(7 downto 0); SC_END : out std_logic;
SC_S : out std_logic;
RGB_ADDRESS_S : out std_logic_vector(1 downto 0)); end SC_OUT; architecture RTL of SC_OUT is component SC_CLK Port ( CLK : in std_logic; RESET : in std_logic; SC_EN : in std_logic;
BIT_SELECT : in std_logic_vector(2 downto 0); SC_CLK_OUT : out std_logic);
end component; component SC
Port ( RESET : in std_logic; CLK : in std_logic; SC_EN : in std_logic; SC_CLK_IN : in std_logic;
RGB_DATA : in std_logic_vector(7 downto 0); SC : out std_logic;
SC_END : out std_logic;
end component; signal SC_CLK_REG : std_logic;
begin
U0:SC_CLK port map ( CLK => CLK, RESET => RESET, SC_EN => SC_EN, BIT_SELECT =>
BIT_SELECT, SC_CLK_OUT => SC_CLK_REG ); U1:SC port map ( CLK => CLK, RESET => RESET,
SC_EN => SC_EN, SC_CLK_IN => SC_CLK_REG, RGB_DATA => RGB_DATA, SC => SC_S,
SC_END => SC_END, RGB_ADDRESS => RGB_ADDRESS_S ); end RTL;
付録9
LED点灯時間出力回路
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity SC isPort ( RESET : in std_logic; CLK : in std_logic; SC_EN : in std_logic; SC_CLK_IN : in std_logic;
RGB_DATA : in std_logic_vector(7 downto 0); SC : out std_logic;
SC_END : out std_logic;
RGB_ADDRESS : out std_logic_vector(1 downto 0)); end SC;
architecture RTL of SC is signal SC_REG : std_logic; signal SC_END_REG : std_logic;
signal RGB_COUNT : std_logic_vector(7 downto 0);
signal RGB_ADDRESS_COUNT : std_logic_vector(1 downto 0); signal SC_COUNT : std_logic_vector(3 downto 0);
signal STATE : std_logic_vector(1 downto 0); begin
SC <= SC_REG;
SC_END <= SC_END_REG;
RGB_ADDRESS <= RGB_ADDRESS_COUNT;
process ( RESET, SC_CLK_IN, SC_EN ) begin if ( RESET = '0' or SC_EN = '0' ) then SC_REG <= '0';
SC_END_REG <= '0';