AXI Video DMAで画面を切り替える
XILINXのIPコアでAXI Video DMAというのがあります。これは、DDR3 SDRAMから自動的にデータを取ってきてAXI Streamから出力するということをしてくれます。
使い方は結構複雑です。
- AXI VDMAには、AXI Liteでレジスタ設定をする必要があるため、AXI Liteを出力できるIPが必要
- AXI VDMAの出力は32bitなので、RGB 24bit化するためにAXI Subset Converterを使う
- AXI StreamをAXI Video Outに入れる
- AXI Video Outのタイミング信号生成用に別途Video Timing Controller(v_tc)を使う
- AXI Video Outの出力はRGBなので、TMDSコンバータを別途入れる
これで、DDR3 SDRAMの特定のアドレスから繰り返しデータを読み出して画像表示してくれます。ここまでは他社の評価ボードでもやっているので難しくはありません。
しかし、画面を切り替えたい場合はどうすればいいのでしょう。
次のようにしたらうまくいきました。
① AXI Video DMAの設定で、Frame Buffersを2以上にする
② MM2S_DMACRレジスタ(アドレス0)のbit1 (Circular_Park)を'0'にする。
③ MM2S_START_ADDRESS1、MM2S_START_ADDRESS2、MM2S_START_ADDRESS3・・・に出力したいメモリのアドレスを書いておく。
④ 表示を切り替えたいときに、PARK_PTR_REGレジスタ(アドレス28h)のRdFrmPtrRefを書き換える。
このRdFrmPtrRefに、フレームバッファのポインタを書き込むことでDMA先頭アドレスが変わるという仕組みのようです
画面の切り替えは直接アドレスを指定するのではなく、フレームバッファの番号で設定するようでした。私のやり方が悪いのかもしれませんが、動作中にMM2S_START_ADDRESSxレジスタを書き換えてみても表示は切り替わりませんでした。昔のPCのように表示アドレスの先頭を書き換えるということでの画面スクロールはできなさそうです。ちょっと残念でした。
| 固定リンク
コメント
ZynqUltraScale+MpSoCで
DDRに置いた画像データを、VDMAを使用して画像を表示しながら
次の画像をDDRに転送したいのですが、DDRへの読み出しと書き込みの
アクセスが被った場合の帯域が足りるようになっているのか、
アービトレーションがどうなっているのか疑問です。
VDMAの読み出し側が優先されてVDMAの動作が安定して欲しいのですが
どういった振る舞いをするのかわからず、ご存じであれば教えていただきたいです。
資料はUG1085のDDRメモリコントローラ、PG020のVDMAの資料は参照しています。
投稿: hase | 2022.10.19 12:54
有料のコンサルティングサービスをご利用ください
投稿: なひたふ | 2022.10.19 16:07