メインページに戻る

RETROF-16はグラフィック表示回路を内蔵

グラフィックを内蔵することにした理由

前作(RETROF-8)の表示装置はLEDだけでした。ですから、2進法で表示されているLEDを指で示し「これが円周率の百桁目だよ」と説明しても、その本質を理解して頂ける方は僅かで、あまり注目されなかったというのが正直なところです。

ならば、「CPUを手作りするついでにグラフィック回路も内蔵した新作を作り、インベーダーゲームの実演でもすれば中学生でも感動して貰えるのではないか」と思った事が今回の計画の発端です。


グラフィック表示回路の仕様決定手順

まずは解像度と表現可能な色を決める

グラフィック表示回路の設計は、解像度(縦横のドット数)と色の表示範囲を決める事から始めます。当たり前の事ですが画像の表示回路は表示を細かくするほど、また表示可能な色の種類を多くするほど多くの画像保持用のメモリ(以下VRAM)を必要とします。 メモリの価格は1970年代とは違い安価で入手可能ですので予算面での心配はありません[2]。 しかし、RETROF-16で はVRAMも通常のメモリと同じ空間に割付ける事によりCPUから見た場合にVRAM専用のアクセス回路不要となる方法を採用しています。ですから、あまり多くのVRAMを積んでしまうとプログラム領域として使えるメモリ領域が圧迫されてしまいます。

このあたりのバランスは難しいところですが、そもそもRETROF-16にグラフィックを内蔵することにした理由は1980年頃のTVゲーム[3]の再現ですから、ここは思い切って解像度を256×256ドットまで下げ、RGB各1bitの8色表現(3bitは半端ですので更に1bitを反転指定に使用)としました。これですと VRAMの容量は256*256*4=256Kbit(=32KB)となり、妥当な範囲に収まります。

メモリマップを決める 

縦横のドット数と色の表示範囲が決まり、その結果としてVRAMの容量が32KBと決定しましたので、次はこの32KBをメモリマップ上のどこに割り当てるかを決定します。

RETROF-16のメモリマップ
A案もB案も、VRAM領域が32KBであることは同じです。常識的に考えるとA案が普通の設計感覚ですが、今回はあえてB案とし ました。理由は手元に8bit×32KのメモリHM62256が沢山あり、B案だとこのメモリを1つでアドレスとデータのビット数が一致するからです。これをA案で行うためには、16bit×16K構成のメモリが必要になってしまいます。

C案は、カラーではなく、モノクロ(1画素1bit)とした場合の参考です。

表示装置を決める

表示機能の概略は決まりましたが、表示装置を何にするかかによって回路設計は大きく変わります。極端な話、フルカラーLEDを256×256個購入して表示装置を作る事も可能です。しかし今回は表示装置の自作でなく、表示信号の発生装置の自作がテーマですから、手元にある液晶ディスプレイ(三菱製 RDT156V)を使用することにしました。

RDT156Vは私が初めて買った液晶モニタです。今では使われることも無く押入れに眠っていたのを引っ張り出し、 RETROF-16専用モニタとして現役復帰してもらうことになりました。以下がRDT156Vの仕様です
(三菱電機さんのサイトより転記)

RDT156Vの仕様
このモニタの画素数は1024×768ですので、そのままでは256×256ドットの表示装置としては使えません。CPU側が認識している256×256ドットをモニタ上の1024×768の画素にどの様に割り付けるかを次に考えます。

モニタ上の表示領域を決める

液晶モニタの画素数が1024×768であるのに対し、RETROF-16が認識する画素数は256×256ですから、縮小拡大相当の処理が必要になります。考えられる液晶モニタ領域(青色)と実際の表示領域(緑色)を以下に6通り図示します。
(黄色の四角はCPU側から見た1画素の大きさです)

液晶モニタの実表示領域

当初は案Aの様にモニタ上のどこかを256×256画素分だけ使う、縮小拡大の無い1対1対応にしようと思いました。しかしこの方法だと1ドットあたりの周波数(pixel freq.)が高くなりすぎ、VRAMのアクセス速度が定格を超えてしまいます。

次に考えたのが案Bの液晶モニタの画素4つ(縦横各2画素)をRETROF-16の1画素に対応させる方法です。この方法だとVRAMのアクセス周波数は半分になり、アクセス速度の低いSRAMでもそのまま使えます。更に液晶モニタの画素9つ(縦横各3画素)をRETROF-16の1画素に対応させる案Cも考えられます。

しかし更にブレッドボードで実験を重ねているうちに、少ない部品でもモニタの全領域を使う事ができる回路を思いつきました。最終的にはモニタ画面全体を使って256×256の表示ができる案Dとしました。但しこの方法は見かけ上の1画素が正方形にはなりません。(他にも案Eや案Fも考えられます。このあたりの判断はどれが良いとか、どれが悪いとかという問題ではなく好みの問題だと思います。)

タイミング設計

水平・垂直の各々の表示周波数を決める

画素数と色、主メモリへのマッピング、モニタへのマッピングが決まると次はタイミング設計です。

家庭用のTVがコンピュータのモニタとして使われていた頃は、TV放送の規格に合わせて水平同期信号や垂直同期信号を作ることにより画像を表示できました。 設計の自由度はありませんでしたが、何も悩まずにタイミング設計をすることができた時代です。 一方、現在は様々な解像度(正しくはドット数)の液晶ディスプレィが店頭に並んでいます。水平同期信号や垂直同期信号の周波数もメーカーや型番によって様々です。 一般のパソコンのグラフィックユニット(GPUボード)は、市販されている殆どの液晶ディスプレィに対応できる設計となっていますが、手作りのTTLグ ラフィックボードではそれほど賢い性能は望めません。とりあえずは手元にあったRDT156V専用として 回路設計を進めます。

三菱さんのサイトから、水平周波数、垂直周波数の許容範囲は判るのですが、水平同期信号あるいは垂直同期信号のパルス幅の許容範囲、あるいはフロントポーチ、バックポーチと呼ばれる表示調整期間の許容範囲が全く判りません。

サイトをあちこち検索し、tinyvga.com(別窓で開きます)を見つけました。
ここには各種のサイズの液晶モニタに対するRGB信号や同期信号の推奨タイミングが掲載されています。 このサイトから画素数が1024×768でリフレッシュレートが60Hzの場合のページを見てみますと以下の様な値が記されています。(下記の3つの表はこのサイトから転記)

General timing

Screen refresh rate60 Hz
Vertical refresh48.363095238095 kHz
Pixel freq.65.0 MHz

Horizontal timing (line)

Scanline partPixelsTime [µs]
Visible area102415.753846153846
Front porch240.36923076923077
Sync pulse1362.0923076923077
Back porch1602.4615384615385
Whole line134420.676923076923

Polarity of horizontal sync pulse is negative.

(水平同期信号は、負論理)

Vertical timing (frame)

Frame partLinesTime [ms]
Visible area76815.879876923077
Front porch30.062030769230769
Sync pulse60.12406153846154
Back porch290.59963076923077
Whole frame80616.6656

Polarity of vertical sync pulse is negative.

(垂直同期信号は負論理)

この表を図に書き換えたのが以下です。


FPGAでの実装ならばVerilog等の言語で、上記の表の数字をif文の条件式内に転記するだけですが、TTLで実装するには上記の値に一致するカウンタやデコーダになる様にTTLを組み合わせて基板上に並べる必要があります。

タイミングの簡略化

しかし、上記の図表の数字はあまりにもバラバラなため、様々な分周比のカウンタや複雑なデコーダが必要になることは明白です。そこで、モニターが画像信号を正しく認識できる範囲でそれだけ各種の数値を単純化できるかをブレッドボード上で実際に回路を組んで試してみました。その結果、得られた簡略タイミングが以下です。

推奨規格とは大きく異なりますが、1ピクセルのずれもなくDVI(Digital Visual Interface)の如く綺麗に表示されます。

横方向の解像度を256(モニタの横方向画素数1024の1/4)としたため 、基本周波数が推奨値(65.5MHz)の約4分の1(15.36MHz)となっています。
65.5を4で割ると正確には16.375ですが、手元にまたま15.360MHzの発振器があったので、それを使ってみました。同様に各種の分周比等もできるだけ回路が簡単になるように工夫しました。

但し、RDT156Vでは問題なく表示されますが、1024×768以外の液晶モニタではおそらく何も映らないか画像が乱れると思います。また1024×768の液晶モニタであっても、 モニタ内部で用いている画像処理チップの種類等によっては許容範囲外になる可能性も十分あります。

以下が実際のブレッドボード(TTLは僅か8個)と、そのボードからの信号で格子模様(1画素のズレもない)を表示しているモニタの写真です。

  

【写真右】調査に使用したブレッドボード
【写真上】ブレッドボードの表示結果


規格外での使用は理屈やWebの調査ではわからない事が多い。そのような場合は実際に試してみるしかない。ブレッドボードはその目的には大変便利な代物だ。しかし 昔のTVならば、おかしな信号を与えると同期の乱れたおかしな画像が表示され、それを見ながら微調整ができたが、液晶モニタは勝手に表示をやめてしまう。このため適正分周比や同期信号の位置や幅の調査は大変苦労した(2011-11-22)。

使用した部品と回路図

使用TTL一覧

ここまで使用したTTLは僅か8個です。以下がその一覧です。161を4つと393、193、157、00を各1個です。

TTL  種別 目的
74LS161(1) 16進同期カウンタ 
 ・同期プリセット
 ・非同期クリア
水平第一分周 1/16
74LS161(2)(3) 水平第二分周 1/20
74LS161(4) 垂直第一分周 1/12
74LS393 16進非同期カウンタ×2組 垂直第二分周 1/68
74LS139 2to4デコーダ×2組  垂直、水平、各々の同期信号のデコード
74LS157  2to1プレクサ×4組  RGB信号のON/OFF 
74LS00 2入力NAND×4組  水平と垂直無表示区間のAND,その他  

使用した発振素子

水晶発振器写真の右端のものを使用しました。
左端は1970年代頃まで使われていた水晶発振子単体ですが、他の3つは全てTTLに直結可能な発振回路を内蔵しています。

15.63MHzという値は部品箱にあった発振素子のうち、65MHzの1/4に一番近い物を選んだけです。


たまたま私が所有していた発振器が15.63MHzだったのですが、実際にはこの周波数発振器の入手は特注でもしないと困難だと思います。

そこで誰もが入手可能な発振子を調べた所、秋葉原の秋月電子通商(別窓で開きます)に16.00MHzの水晶発振器(内部PLL)があることがわかりました。早速これを入手して、15.63MHzと交換してみました。


結果は表示自体はできたのですが、水平方向の周波数が高すぎるせいか、256画素分を表示できませんでした(250画素程度になる)。 そこで水平第二分周を1/20分周から、1/21分周に変えた所、問題なく動作させることができました。 (具体的な回路の変更箇所は後述の回路図に付記しました)


FH(水平同期信号の周波数)が45.7KHzとなっている画像が、15.63MHzの場合で、47.6KHzとなっている画像が、16.00MHzの場合です。

同じ表示(背景のストライプ)が実現できています。(中央の表示はRDT156V自身が表示している画像信号情報です)


他の周波数でも分周比や、同期信号の発生位置を微調整すれば表示は可能だと思います。

VGA信号作成実験ボードの全回路図

以下が液晶モニタにチェック模様を出すための全回路図です。
×印はブレッドボード上では無接続(TTLの特性上Hとみなされる)です。CMOSで実験される方はH扱いにはなりませんので注意願います。(正式なPCBでは5Vに接続予定)

VRAMを接続する

チェック模様は表示できましたが、自由な画像を表示するにはもう一工夫必要です。まずはメモリ(VRAM)を接続します。


VGA信号作成実験ボード

これがブレッドボードによるグラフィックの実験基板です。

このボードで液晶モニタに与える各種信号のタイミング等の検証をした後、その回路をRETROF-16の回路としてデッドコピーする予定です。
もちろん、RETROF-16自体はブレッドボードではなくPCBで実装します。


SRAMの全内容の画面に表示に成功

上記のボードのRAMの内容を4bitを1画素(16色カラー)として液晶モニタに表示しています。

この時点では、SRAMに値を書き込む回路はまだ未実装です。
ですから、画像は電源投入時のSRAMのランダムな内容を表示しているにすぎません。しかし、ランダムな表示となっている事自体が、SRAMとの接続に成功している事の「証拠」になるのです。


RAM(HM62256LP-10)の容量は32KBです。これをbitに直すと32767×8(bit)です。
一方、表示の方は1024×768画素のモニタを6画素を1組とし、256×256表示として扱っています。
表示は16色(4bit)ですから、画像容量は256×256×4(bit)となります。
32767×8(bit)=256×256×4(bit)ですから、SRAM内の全情報が1画面に完全対応します。

ここまでの全回路図

改良ポイント

基本的には前回紹介した「チェック模様の表示ボード」にSRAMを追加しただけです。
左がSRAM追加前、右が今回(追加後)の画像です。

 

しかし、一部改変した点もあります。一番大きな変更点は、基本信号(ピクセルクロック)の発生を15.36MHzの水晶発振器から、18.4320MHzのPLL発振器に変えたことです。

前回、15.36MHzは入手困難であるので、16.000MHzを使う方法を紹介しましたが、この18.4320MHzも容易に入手可能です。(秋月電子で300円、2011年12月現在)
以下の回路は、この18.4320MHzを使う前提で書き直しています。

他にも、VGAの出力周りも当初予定していた「8色+点滅」から「点滅無しの16色」に変更しています。 回路図上、蛍光マーカーを引いた所がこれらの変更箇所です。

全回路図


「電気的に等価な入替」(LS157の4つのユニットの入替等)がある為、写真のブレッドボードの配線とは一致しません。

メインページに戻る