このような高いピクセルクロック周波数でVGAディスプレイを駆動する方法を教えてください。


12

私は、80x30テキストモードで640x480 VGAディスプレイを駆動するために、ディスクリートコンポーネントを使用してデジタル回路で作業しています。

640x480ディスプレイの場合、ピクセルクロックは25.175MHzで、周期は約40nsです。これほど頻繁に新しいピクセルをディスプレイに提供できるはずなのかわかりません。

私の回路の基本的なアーキテクチャは次のとおりです。

  1. 水平ピクセルのバイナリカウンターは、25.175MHzで800までカウントアップします(640可視ピクセル+フロントポーチ、同期、バックポーチの場合は160)。800で、垂直ラインカウンターをインクリメント(および525ラインでリセット)

  2. 水平および垂直位置を使用して、現在の文字のX、Y座標を導き出します。

  3. 文字のx、y座標を使用して、ビデオメモリにインデックスを付けてASCII文字を取得します。

  4. ASCII文字を使用して文字ROMのインデックスを作成し、文字のビットパターンを取得する

  5. パラレルシリアルシフトレジスタを使用して、8ピクセルの文字ラインをピクセルクロック周波数で個々のビットに変換します。

チェーンをたどると、カウンタ-> RAM-> ROM-> Parallel to Serial Shift Register

私が見つけることができる最速のコンポーネントを使用すると、伝搬遅延とアクセス時間は合計で約15ns + 20ns + 70ns + 15ns = 120nsになり、25MHzの40ns周期よりもはるかに大きくなります。

さらに高い解像度とリフレッシュレートでは、100ns(10ns周期)をはるかに超えるピクセルクロックを使用できます。

システム内の他のすべての信号を考慮しなくても、RAM / ROMのアクセス時間が既に十分に長い場合に、10nsごとに新しいピクセルをディスプレイに提供する方法はありますか?


7
専用のビデオRAMを使用し、それをビデオ信号に直接クロックします。実際に表示するずっと前に、を表示するを考えます。
ハース

2
Maximiteについて読んでください。MCUの周辺機器ハードウェアといくつかの抵抗を使用してVGAポートを駆動するだけです。彼が使用するPIC32周辺機器を調べることから始めます。正常に動作します。(私はここMaximiteを持っています。)
jonk

「Don Lancaster」による「The Cheap Video Cookbook」
Jasen

回答:


17

これが難しいと感じる主な理由は2つあります。

まず、VGAの時代にこれを行うために使用されていたより古く、より離散的な(小規模な統合)部品を使用しています。

しかし、次に、それらを非定型的な方法で使用しています。具体的には、アプローチはそうpipelinedではありません。つまり、間隔を決定する際に複数の遅延を追加する必要があるため、レートを決定します。

対照的に、速度を達成しようとする同期デジタル設計は、レジスタ間で可能な限り実行しないようにします。

詳細はおそらく少し異なりますが、大雑把に言えば、次のように機能します。

  • アドレスをインクリメントまたはリセットすると、レジスタに入ります。
  • アドレスを同期メモリにラッチします
  • 同期メモリの出力をラッチします
  • これを同期文字ジェネレーターのアドレスにラッチします
  • 文字ジェネレータの出力を出力レジスタにラッチします
  • パレット検索を適用...
  • 同期DACに...

このようにタスクを分割すると、1つの組み合わせ遅延に加えて、いくつかの伝搬遅延と、クロック間に合わせる必要があるレジスタのセットアップ時間とホールド時間のみが得られます。

この方法で構築されたデザインは、出力を生成するのに多くのクロックを必要とします- レイテンシは、実際には純粋にコンビナトリアルなデザインよりも長くなります。しかし、はるかに速いクロックの各サイクルで新しい正しい出力を生成します。

そしてちょっと、それはビデオです、CRTがピクセルカウンターの後ろにダースピクセルを描いているかどうかは本当に重要ではありません-もちろん、同期信号のタイミングでそれを考慮して、データが実際にあるときと比較して正しいようにしますDACから出てきます。

実際には、パイプライン化されたCPUが以前の計算結果または条件分岐に依存するまで、ほぼすべての複雑なデジタルシステムは素晴らしい方法でこのように動作します。次のデジタルシステムクラスの講義では-幸いなことに、特に画面の描画中に文字バッファーが変更された場合にエフェクトを引き裂く心配がない場合は、VGAの状況がずっと簡単です。

実際にこれを構築する場合は、FPGAで実行してください。内部メモリを使用する場合は同期メモリを強制し、外部メモリを使用する場合は同期IOレジスタを強制します。適切なデザインに向かって多くの調整が行われます。ファブリック自体はディスクリート部​​品よりも高速になります。もちろん、間違いを犯した場合は、長い一日の再配線を費やすのではなく、親指をひねるだけで再コンパイルできます。 。


「特に、画面の描画中に文字バッファが変更された場合にエフェクトを引き裂く心配がない場合」-それが、ビデオコプロセッサの初期の頃から、コプロセッサがメインプロセスにそうでないことを知らせる方法を持っていた理由です現在、画面にメモリをダンプしており、ビデオバッファを変更する場合は、すぐに変更する必要があります。
ジョンドヴォルザーク

これは複雑すぎると思います。彼はすでに、ピクセルクロックごとに1ビットを出力する8ビットシフトレジスタを使用していると述べました。おそらく、これはラッチ付きの8ビットシフトレジスタです。つまり、彼は8ピクセルクロックごとに新しいバイトをフェッチするだけでよいので、レートは3.125MHzになります。これにより、データをシフトレジスタラッチに取得するために320 nsのすべてが得られます。
Chris_F

非常に単純な低解像度のモノクロの場合、はい、バイトのタイミングはそれほど難しくありませんが、質問の重要な部分は、質問者が非自明な解像度の典型的な「実際の」システムのパフォーマンスを理解しようとしていたことでした可能だ。そして、答えは他のすべての有用なデジタルシステムと同じです:より高速な技術とパイプライン同期設計。
クリスストラットン

2

私が見つけることができる最速のコンポーネントを使用すると、伝搬遅延とアクセス時間は合計で約15ns + 20ns + 70ns + 15ns = 120nsになり、25MHzの40ns周期よりもはるかに大きくなります。

グラフィックアダプターは1つのピクセルだけを描画するのではなく、少なくとも完全なスキャンラインを描画することを忘れます。したがって、これは完全にパイプライン化可能な問題になります。

また、これまでに50年にわたってビデオ制作ハードウェアが存在していたことを忘れないでください。問題は通常、1つのポートで文字をレンダリングし、ビデオ信号DACに順番に読み取られる特別なタイプのRAMで解決されます。そのハードウェアは、見ているものよりもずっと高速です。

私の回路の基本的なアーキテクチャは次のとおりです。

  1. 水平ピクセルのバイナリカウンターは、25.175MHzで800までカウントアップします(640可視ピクセル+フロントポーチ、同期、バックポーチの場合は160)。800で、垂直ラインカウンターをインクリメント(および525ラインでリセット)

  2. 水平および垂直位置を使用して、現在の文字のX、Y座標を導き出します。

いいえ、なぜそうするのですか?行ピクセルをメモリの連続領域に配置し、DACに直線的に出力します。これがCPU / MCU実装に関するものである場合、CPUにそれを行わせずに、DMAユニットをプログラムします。 CPUコアとの対話なしで、1つの値を次々に取得して、たとえばパラレルデータポートに出力するだけです。

  1. 文字のx、y座標を使用して、ビデオメモリにインデックスを付けてASCII文字を取得します。

ああ、オンザフライでレンダリングしたい-良い選択ですが、RAMの現代的なコストでは珍しいです。代わりに、事前にキャラクターをフレームバッファーにレンダリングするか、デバイスが非常にスリムな場合は、キャラクターの行をDACに直接パイプ(上記のDMAの説明を参照)します。


1
最新のものは事前にレンダリングされたフレームバッファを好む傾向がありますが、RAMをあまり使わずに作業しようとしている場合は明らかに悪い選択です。FPGAでこれを行う場合は、DMAステートマシンに文字セルマップからアドレスを取得させ、対応する文字グリフから読み取るだけで済みます。
R .. GitHub ICEのヘルプを停止ICE

ここで完全に同意します!したがって、3番目の質問に関する回答セクション。
マーカスミュラー

2

パイプライン処理とは別に(これは非常に重要です)、何か大きな問題があります。

パラレル入力、シリアル出力シフトレジスタは25奇数Mhzでドットアウトしますが、あなたのキャラクターが8ピクセル幅である場合、その入力はVGA時代のLSシリーズの範囲内で簡単に約3.2MHzですシフトレジスタが現在のバイトで終了したときに、次のバイトを準備する必要があります(パイプラインが入る場所です)。

〜25MHzのピクセルクロックとその1/8のメモリクロックを生成して、テキストバッファとCG ROMを駆動し、そのメモリとCG ROMのアクセスをパイプライン処理します。

もう1つのトリックは、テキストバッファーの出力がテキストの特定の行内の各行で繰り返されるため、80バイトのテキストをリングバッファーに記録してから、次の7行のRAMの読み取りを停止することです(8行文字)、これにより、CPUが使用できるようにメモリを解放できますが、80バイトのRAMが必要です。


1

したがって、明らかにそれは機能しません。パイプラインが必要です。

1)文字をメモリに連続して保存します。左上から始めます。

2)ブランキング期間中に文字を取得します。メモリ順で文字をフェッチし続けます。

3)デコードされた各文字と行インデックスをROMにパイプラインします。

4)ROM出力をバッファにパイプラインします。

5)バッファをシフトレジスタにパイプラインします。これから40ns間隔で連続的にピクセルを読み出します。

(つまり、320nsごとに新しい文字をシフトレジスタにロードする必要があることを意味します。これは、システム全体をパイプライン化せずに実行できる場合もあります。)

6)水平ブランキング中に、行の先頭に戻るか、次の文字(つまり、次の行の先頭)に進みます。

ボーナス機能:320nsごとに文字が必要なだけなので、文字と色のペアを読み取って、MSDOSスタイルまたはSpectrumスタイルの色文字を実行することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.