FC2カウンター FPGAの部屋 AXI VDMAのお勉強2(Register Direct Mode)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

AXI VDMAのお勉強2(Register Direct Mode)

最初の記事は、”AXI VDMAのお勉強
前の記事も、”AXI VDMAのお勉強

”LogiCORE IP AXI Video Direct Memory Access v5.04a Product Guide PG020 December 18, 2012”を参考にしながら、勉強したことを書いておこうと思う。
AXI VDMAはマニュアルが152ページもあって、どうやって使うか覚えるのが大変だが、90ページの Programming Sequence を読みながら、覚書を書いていこうと思う。

まず、レジスタについては、30ページからの Register Space を参照のこと。MM2S用、S2MM用のレジスタが並んでいる。印象的なのは、それぞれのスタート・アドレス・レジスタが16個ずつあることだ。

Register Direct Mode (C_INCLUDE_SG = 0) (90ページ)
・register direct modeは、ビデオのパラメータとスタート・アドレス・レジスタに開始アドレスをセットして、DMA Control Register をセットする。

1. DMACR register (Offset 0x00 for MM2S and 0x30 for S2MM)に値をセットする。下に、Figure 2‐3: MM2S DMACR Register を引用する。
Study_of_VDMA_1_130517.png

いろいろな設定があるが、DMACR.RS=1でDMAが開始される。DMAのステータス・レジスタのHalt解除(DMASR.Halted = 0)にはタイムラグがあるそうだ。
DMACR = 0x00000003 ( Circular Mode, Run)

2.ビデオのフレームバッファのアドレスを1からN個まで書く。Nはどこで決まっているかというと、C_NUM_FSTORES で決まるディフォルトは3個。0x5Cから0x98までの16個がMM2S用で、0xACから0xE8までの16個がS2MM用。

3.Frame DelayとストライドをFRMDLY_STRIDEレジスタに設定する (Offset 0x58 for MM2S and 0xA8 for S2MM)。
ビットマップ・ディスプレイ・コントローラで、1ピクセルRGB合計4バイトで表される。
ストライドは、SVGAの横ピクセル800ピクセル X 4バイト = 3,200を設定する。(94ページのAXI VDMA Video Transfer、Figure 3‐1: Example Video Image Transfer を参照)描画領域は1面しか用意しないため。図1参照。
Study_of_VDMA_2_130517.png
図1 画像データの描画領域

4.有効な水平サイズをHSIZEレジスタに設定する。 (Offset 0x54 for MM2S and 0xA4 for S2MM)

5.有効な垂直サイズをVSIZEレジスタに設定する。 (Offset 0x50 for MM2S and 0xA0 for S2MM)

画像データを転送するチャネルがスタートする。

(重要) On the S2MM channel, new video line size and number of video lines need to change following the assertion of s2mm_prmtr_update or undefined results occur.
そのまま引用。S2MMチャネルでは、画像のラインサイズやライン数を変更した後に、s2mm_prmtr_update がアサートされるか、定義されていない結果が起こると言っているのだろうか?(英語に自信が無いので、すみません)

Updating Video Transfer Information (91ページ)

Register Direct Mode (C_INCLUDE_SG = 0)で、描画している最中に、画像のパラメータやスタート・アドレスをいじることができる。垂直サイズ・レジスタに書くと、フレーム境界で反映される。
変更された画像パラメータをAXI VDMAが使うと、各チャネルの pmrtr_update 出力 ( mm2s_prmtr_update and s2mm_prmtr_update ) がアサートされる。
AXI VDMAが動作中に画像パラメータを変更するときは、初期化の時と同様に設定する。

1.変更したいチャネルに、任意の順序で Frame Delay, Stride, and Horizontal Size を書く。

2.最後に、Vertical Size を書く。Vertical Size をレジスタに書いた時には、すぐに動作中のパラメータに入れされずに、フレーム境界で変更される。(当たり前ですよね。画像が乱れちゃう。内部レジスタに書かれてから、フレーム境界でコピーされるようです)

C_ENABLE_VIDPRMTR_READS = 0 にすると、Register Direct Mode で画像パラメータ用のレジスタ (VSIZE, HSIZE, FRMDLY_STRIDE, and START ADDRESS/ES) をディスエーブルして、FPGAのリソースを削減できるそうです。最初に決めたパラメータから変更できないということでしょうかね?

次の記事は、”AXI VDMAのお勉強3(Scatter Gather Mode)
  1. 2013年05月17日 05:51 |
  2. IP
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/2466-2a5a62d8
この記事にトラックバックする(FC2ブログユーザー)