[新連載]CPLD入門!
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使うことになるだろうと思ってはいたのですが。
何を今頃になって、というようなものですが。
ようやく本気で、CPLDと四つに取り組みます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第45回]
●CPLD版VGAIF(2)もとになる回路図
前回からの続きです。
前回は水平同期回路の回路図をお見せしたところで終ってしまいました。
今回はそれ以外の回路図です。
下は水平、垂直表示のためのVRAMアドレスの調整回路です。
なんだかよくわからない回路です。
なんでこんなものが必要なのかちょっと見には理解できないと思います。
当初CRTIFを設計する時点でここは一番苦労したところです。
問題は設計の対象となるディスプレイ回路の水平方向の表示文字数にあります。
水平方向の文字数は80字または40字です。
これがまことにつらい数値なのです。
64字または32字ならばこんな回路は要りません。
どういうことか簡単に説明します。
本当は図で説明すると分かり易いのですが、図を描いているだけの時間がありませんので、文章だけで説明します。
比較のためにまずは1行64字の場合で説明します。
現行VGA/CRTディスプレイの場合VRAMアドレスはF800から始まります。
説明を簡単にするために画面左上隅のVRAMアドレスを000とします。
1行64字の場合右端のアドレスは03F(=63)になります。
2行目の左端は040(=64)で、その右端は07F(=127)です。
キャラクタディスプレイは表示文字位置に対応するVRAMアドレスから文字コードを読み出してそれをそのままキャラクタジェネレータROM(キャラジェネROM)のアドレスとして入力します。
画面に表示される文字は水平方向には8ドットですが、その位置で垂直方向にも8ラインまたは16ラインの文字データを表示します。
この縦方向の行情報0〜7または0〜FはキャラジェネROMアドレスの下位3ビットとして与えられます。
キャラジェネROMについては「CRTインターフェースボードの製作」[第5回]を参照願います。
以下、画面に文字が表示される仕組みです。
まずは水平方向にVRAMアドレスを順に出力するカウンタ(Hカウンタ)を考えます。
最上位行を表示するためにHカウンタは000〜03Fまでカウントアップしていき、カウントアップの都度その値がVRAMアドレスとして与えられます。
VRAMからはその画面位置の文字コードが出力され、それはキャラジェネRAMの上位アドレス8ビットとして与えられます。
一方キャラジェネROMの縦方向データを指定するアドレス(下位3ビット)のためにVカウンタを用意します。
VGAディスプレイでは縦方向は16ラインで1文字を表示しますが、説明を簡単にするために、CRTディスプレイの場合の8ラインとします。
文字の一番上のラインのデータをキャラジェネROMから出力するためにVカウンタは0から始まります。
Hカウンタは画面の右端までくると(=03F)、下位6ビットをクリアして、再び000からカウントアップを始めます。
このときVカウンタは+1され、2行目の文字パターンがキャラジェネから出力されて画面に表示されます。
このようにしてHカウンタは下位6ビットを000000〜111111まで8回繰り返し、その間Vカウンタ3ビットは000〜111までを繰り返して1行8ラインの文字表示を行ないます。
その次は2行目の文字表示になりますから、そこでHカウンタは下位6ビットを000000にクリアするとともにその上位の7ビット目を+1します。
Vカウンタも0クリアされます。
この回路は複雑なようですが、実はHカウンタとVカウンタを下のように連結することで簡単に実現できます。
Hカウンタの下位6ビットをHLカウンタとして、その上位のHカウンタをHHカウンタとして分離し、その間にVカウンタをはさんで、以下のようにカウンタを直列に並べることで実現できます。
[HHカウンタ][Vカウンタ(3ビット)][HLカウンタ(6ビット)]
以上は水平64文字の場合です。
水平32文字の場合はHLカウンタを5ビット(00000〜11111)にするだけで実現できます。
そこで、最初の説明に戻ります。
そのようにHカウンタとVカウンタを連結するだけで簡単に表示回路が実現できるのは、水平表示文字数が2nの場合に限られます。
残念なことに、確か昔は水平文字数が64字というパソコンもあったように思いますが、その後は水平文字数80字というのがスタンダードになってしまいました。
回路を考える上でこれは実に面倒な規格です。
80字の場合は水平方向のアドレスは00〜4F(0〜79)です。
上と同じようにカウンタを並べてみてもうまくいきません。
[HHカウンタ][Vカウンタ(3ビット)][HLカウンタ(7ビット)]
のように連結してHLカウンタが50Hになったときに00クリアしてVカウンタにキャリーを送ればよいように思えますが、そうは簡単にはいきません。
確かに画面の第1行はそれでうまくいきますが、第2行はどうでしょうか。
HHカウンタは00001、Vカウンタは000、HLカウンタは0000000になります。
ところが実際には、第2行のVRAMアドレスは050Hですから、
HHカウンタは00000、Vカウンタは000、HLカウンタは1010000でなければなりません。
上の方で、下位6ビットをクリアしてと書いて、また水平表示文字数が2nの場合に限られます、と書いたのはそういうことなのです。
水平表示文字数が2nではない場合には、HLカウンタをクリアするのではなくて左端のアドレスを記憶しておいて、縦方向の8ラインを表示する間そのアドレスからカウントアップしなければなりません。
それを実現するために考えたのが上の方でお見せした回路図です。
この回路をVHDLでどう表現したものか。
ここは、回路図を見ていると、かえってわからなくなってしまいそうです。
上で書いた動作の説明をそのままVHDLのプログラムとして書くのがよさそうです。
回が進んできましたら、実際のプログラムリストをお見せして、そこであらためて説明するつもりです。
今回も説明の途中ですが、時間がなくなってしまいました。
次回に続きます。
CPLD入門![第45回]
2019.5.10upload
前へ
次へ
ホームページトップへ戻る