2019.5.14
前へ
次へ
ホームページトップへ戻る

[新連載]CPLD入門!
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使うことになるだろうと思ってはいたのですが。
何を今頃になって、というようなものですが。
ようやく本気で、CPLDと四つに取り組みます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜



[第48回]


●1文字ずれています

前回からの続きです。
どこがおかしいかお分かりになりましたでしょうか。

前回お見せした写真の左端部分を拡大しました。

キー入力可能であることを示す>マークは行の一番左端に表示されるはずなのに、2桁目に表示されています。
そして各行の左端、1桁目には「ゴミ」が表示されています。
ただのゴミではなくて、よく見ると規則性があります。
どの行も左端から5番目(本来なら4桁目)の文字が「ゴミ」として表示されています。
実はこれは当たり前のことでした。
VHDLプログラムを書く時点では、ここのところはどうなるかわからないのでとりあえずは無視して書いてしまおう、ということで書いてしまったプログラムのせいでこのようなおかしな表示になってしまったのでした。

VGA回路の文字表示は非常に高速で行なわれます。
水平方向の1ドットは39.722nsで表示されます(25.175MHz)。
1文字8ドットでは約317.7nsです。
ここで水平方向の文字データが表示される仕組みを思い出してみてください。
水平方向のカウンタによって1文字表示期間(317.7ns)毎にVRAMをスキャンするアドレス信号が出力されます。
VRAMには比較的高速アクセスできるRAMを使っていますが、それでもアドレスが入力されてからデータが出力されるまでには70nsかかります。
そしてそのデータが次にキャラジェネROMのアドレスとして入力されます。
ROMのアクセスタイムは150nsほどです。
つまりRAMのアドレスデータが出力されてから実際にキャラジェネROMから文字表示パターンが出力されるまでには200ns以上かかっていることになります。
その文字表示パターンはシフトレジスタにロードされたあとドット表示のためのカウンタ出力にしたがってパラレルシリアル変換されて映像表示回路に出力されます。
シフトレジスタにロードされるタイミングは各1文字分のドットの表示を開始するタイミングなのですが、上記の遅れがあるために、シフトレジスタにロード(ラッチ)されるタイミングは1文字分遅れた時点になってしまいます。
ですからなにも対策をしないでおくと上の写真のように1桁分遅れて表示されることになります。

どのような対策をすればよいのでしょうか?
実はもともとのロジックICで構成したVGAIF回路ではそのことを考慮して表示期間をコントロールするプランキング信号の開始位置と終了位置を1桁分ずらすとともに、水平同期信号の位置もそれに合わせて調整しています(回路に74HC74を使ったD−FFが2段使われているのはそのためです)。
基本的な回路はVHDLプログラムでも同じですから、同じような調整を行なう必要があります。

理由はわかりましたので、VHDLプログラムをそのように直しました。
下はプログラムを変更したあと、1行分の表示文字数を確認している写真です。

あれ?
入力ミスがありますね。
途中で2を入力したつもりが0を入力してしまっています。
ま、でも表示桁数を確認するのに支障はありませんでしょう。
プログラムを修正する前は1桁目が右に1桁ずれていただけではなくて右端の80桁目は表示されていませんでした。
プログラムを修正した結果、1桁目から80桁目までが正しく表示されるようになりました。

CPLD入門![第48回]
2019.5.14upload

前へ
次へ
ホームページトップへ戻る