FPGA VGAバッファ。読み書きする方法は?


8

私はアルテラDE2ボードを持っており、スプライトを描画しようとしています。画面バッファの実装に問題があります。

25 MHZレートでvgaディスプレイのピクセルを出力するディスプレイエンティティがあります。

SDRAMにバッファを実装したいと思っていました。当初のアイデアは、SDRAMから25 MHZのレートで次のピクセルをロードすることでした。これは機能しますが、この速度でSDRAMにピクセルを書き込むことも、新しいフレームごとに十分な速度で画面をクリアすることもできません。データの書き込みには2クロックかかり、ボードは50 MHZで動作するため、完全な読み取りを実行するのに十分な時間があります。

私はひどく、ひどく間違っていることをしていると思います。このような描画キャンバスは通常、VHDLでどのように実装されていますか?

私が見つけることができる最も近いことは、2-3-3(RGB)カラースキームを使用して各ピクセルを取得し、「ポーチ」(ブランキング)VGA時間中にキャンバスRAMに書き込むことです。これは、25MHzの各クロックで更新できるのは画面の15%だけであり、どういうわけか私の回路はどの15%が更新されているかを認識する必要があるということですか。

読み取り中にメモリにデータを書き込む方法がわからないため、ダブルバッファリングの使用方法を理解できません。プロトコルのビットバンギングを回避する方法はありますか?この男はどうやってやるの?

ここに画像の説明を入力してください



@davidcary、ダブルバッファリングを行う方法の詳細について、質問に回答しました。私はそれが時間がかかり、誰かが高品質の回答を書くことができるようになるまでユーザーの問題を支援するためにコメントとして簡単な手短を与えることが多いものとして石を投げることができないことを理解しています。
Kortuk

3
「プロトコルのビットバンギングを回避する方法はありますか?」と言うとき、SDRAMコントローラを自分で作成していないことを意味します。そうすることをお勧めします。これは良い練習です。SDRAMのしくみとそのタイミングを活用する方法について詳しく理解できます。
MNG

回答:


3

いくつかのスタイルの表示に役立つ可能性があるいくつかのアプローチは、表示パネルをタイルに分割することです。

  1. 各タイルを小さな色のセットの使用に制限し、ピクセルあたり8ビット未満の使用を許可する、または
  2. 各タイルの1〜2バイトを使用して、ビットマップデータを読み取る場所を選択します。
最初のアプローチでは、データをディスプレイメモリから読み取る必要があるレートを下げることができます。たとえば、16x16のタイルを使用し、それぞれが256のセットから4色を選択できる場合、FPGAで追加のRAMを使用せずに、16ピクセルあたりのメモリ読み取り数を8(4色の値、さらにビットマップ用に4バイト)。160バイト相当のバッファリング/ RAM(*)をFPGAに追加した場合、16ピクセルあたりのメモリ読み取り数を4に減らし、16スキャンラインごとに160読み取りを追加して、次のタイルカラーセットを読み取ることができます。タイルごとに16色が必要な場合、2番目のアプローチでは、1行に存在できるさまざまなパレットの数に制限を設けない限り、追加の640バイトのRAMが必要になります。

2番目のアプローチは、ディスプレイを生成するために必要な合計メモリ帯域幅を減らすのではなく、おそらく増加しますが、ディスプレイを変更するために更新する必要があるメモリの量を減らします。1つまたは2つを変更して8x8または画面の16x16領域。表示しようとしている内容によっては、このスタイルのアプローチを使用するときに、1つのメモリデバイスを使用してタイルの形状を保持し、別のメモリデバイスを使用してタイルの選択を保持することが役立つ場合があります。たとえば、タイルあたり2バイトの2つの80x60タイルマップを保持するために、高速32Kx8 RAMを使用する場合があります。FPGAにバッファリングがない場合、4ピクセルごとに1バイトを読み取る必要があります。40nsのスタティックRAMを使用しても、CPUが表示を更新するのに十分な時間が残されます(画面全体が9600バイトになるだけです)。

ちなみに、32Kx8 RAMを追加したくないが、320バイトのバッファリング/ RAM(**)をFPGAに追加できる場合、タイルマップアプローチを使用できますが、CPUまたはDMAが160バイトを8スキャンラインごとに表示します。これは、ディスプレイ上の何も変化していなくてもコントローラーにいくらか負担をかけますが、回路を簡素化できます。

(*)バッファは、RAMとして、または32の40ビット長のシフトレジスタと小さな制御ロジックのシーケンスとして実装できます。

(**)バッファは、2つの160バイトRAM、または16個の80ビットシフトレジスタの2つのグループとして実装できます。


5

スプライトは通常、フレームバッファーでは行われません(私が理解しているように)。代わりに、x座標とy座標をスプライトのxmin、yminおよびxmax、ymaxと比較します。現在のスキャン位置がスプライト内にある場合は、スプライトメモリから関連する色を出力します。

フレームバッファーを表示する場合は、気を付けてください。これは私の最初の主要なFPGAプロジェクトでした。SDRAMは100MHzで問題になることはないはずです(10年ほど前にこれを最初に実行しましたが、シリコンは今ではかなり高速になっています)。したがって、50MHzクロックを増やします。あなた自身のコントローラーを書くことは教育的です:)

これにより、十分な帯域幅を使用できるようになり、ダブルバッファーを使用できます。問題はありません。60Hz VGAには、平均18Mピクセル/秒が必要です。16ビット幅のデバイスを使用している場合、ピーク帯域幅は200 MB /秒です。50%の効率でしか実行できない場合でも(これは実行可能であるはずです)、1ピクセルあたり16ビットで100Mピクセル/秒、または1ピクセルあたり32ビットで50Mピクセル/秒です。

たとえば、RAMが読み取りをセットアップするために60nsを必要とする場合がありますが、その後80 nsで8ワードをバーストできます。これは、約140nsで8バイトです。RAMでより長いバーストを実行できる場合は、読み取りを設定するコストを償却するのに役立ちます。

バイトサイドRAMであり、50Mバイト/秒を少し超え、16Mピクセル/秒@ 24ビット/ピクセル:(VGAでさえ、TrueColor表示を行うための十分な帯域幅がありません。ピクセルあたり8ビットはかなり簡単に実行できますが、それは色あたり2ビットまたは3ビットのみです-これはアプリケーションには問題ないかもしれません。フレームバッファーから読み取ると、その値を使用して内部RAMクロックを検索し、24ビット(またはBRAMにうまく収まる18ビット)の色を取得してモニターに出力します。

ダブルバッファリングは引き続き機能します。

アドレス0からフレームを表示します(すべてのピクセルを順番に読み取り、ブランキング期間中に読み取りを一時停止します)。

次のフレームを別の場所に書き込みます。このダブルバッファリングの場合、DRAMコントローラーは、読み取りチャネルと書き込みチャネルの競合する要求間で優先順位を付ける必要があります。ヒント、読み取りはタイムクリティカルであるため、優先順位を付けます:)


一般に、読み取りを優先する方が良いですか、それともFIFOにデータを読み取り、FIFOに一定量のデータがある場合は書き込みを優先し、FIFOレベルが低くなりすぎる場合は読み取りを優先する方が良いですか?少なくともクロック信号のあるLCDを駆動する場合、すべてのデータが時間どおりにシフトアウトされる場合、読み取りタイミングをかなり「緩く」することができると便利です。
スーパーキャット11'14 / 11/11

投稿ありがとうございます。バッファリングについて説明します。しかし、データを読み取るには2クロック(1/50 MHZ)が必要だと思います。また、8ビット幅のデバイスもあります。
ミハイル

@supercat:はい、それは帯域幅がプッシュされている場合に必要になる可能性があるより高度なソリューションです。
マーティントンプソン

1
@Misha:データ読み取りのセットアップにはしばらく時間がかかりますが、一度に大量のバースト読み取りを行うことができます。
マーティントンプソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.