VDMAコアの制御信号やステータス信号の伝送バス過去の記事では、「Vitis」でのビジョンライブラリを試す前準備として、Digilent社が提供するHDMI出力デモのサンプルプログラムを読み込み、自動でビデオ生成に有益なIP類が追加されました。-本記事では、VitisとVivadoを用いてZybo経由で外部ディスプレイに画像を出力するアプリケーションを作成します。DiligentからダウンロードしたHDMI出力デモサンプルをもとに、Zynq内部のハードウェア構成を設計しています。(VDMA)コアは、ビデオ生成部における中核をなすIPとなっています。使える機能が多様な分、説明が多く、初心者には敷居の高いIPと感じます。そこで、まず最初に使うにあたって、最低限知っておくと良い項目についてまとめました。コアとは、ビデオ入出力を行う周辺機器(ペリフェラル)とメモリとを、直接つなぐIPコアです。周辺機器は、例えば、カメラなどからのビデオ入力や、HDMIケーブルを通じた外部ディスプレイへのビデオ出力などの、ビデオインターフェースをイメージすると良いかと思います。基本的には、メモリとビデオインターフェースとの間に配置して、メモリとの画像の送受信を高効率に行うためのIPコアといえます。Access)方式を採用し、CPUを介さずに直接、メモリと周辺機器(ペリフェラル)とを接続して、メモリへの書き込みと読み出しを行っているためです。通常、データをメモリに書き込んだりメモリから読み出したりする作業は、CPUが行います。I/O)方式と呼ばれます。メモリへの書き込み・読み出しの処理中には、CPUは他の処理を効率的に行うことができません。そこで、DMA方式と呼ばれる、周辺機器(ペリフェラル)とメモリとを直接接続し、CPUを介さずにデータの書き込み・読み出しをできるようにしています。ビデオや音声などの大量かつ継続的にデータをメモリに入出力したい場合には、DMA方式を採用するほうが、結果的に処理性能を向上することが可能です。DMA方式のメリット高速性・大容量性(周辺機器とメモリ間の高速かつ大容量にデータ転送可)CPUの負荷軽減(CPUはメモリ伝送以外の別のタスクに集中可)一方、メモリ・周辺機器・CPUなどの複数の端末が、一つのデータバス(データの通信路)を共有しているので、バス使用権の調整を行うDMAコントローラを配置しなければいけません。キャッシュコヒーレンシの問題が起こる可能性もあります。CPUはメモリと読み出し・書き込みを行う際に、一時的にキャッシュと呼ばれるデータアクセスが早い領域に一旦データを溜め込んでおき、処理を行います。このとき、メモリの内容とキャッシュの内容の整合性(コヒーレンシ)をとることを、キャッシュコヒーレンシと呼びます。DMA方式では周辺機器がメモリと直接アクセスできてしまいます。そのため、キャッシュとメモリの整合性を取る前に、CPUがキャッシュにアクセスしたり、あるいは周辺機器がメモリにアクセスしたりしたときに、想定とは異なるデータが送受信されてしまう恐れがあります。DMA方式のデメリットDMAコントローラを配置する必要があるキャッシュコヒーレンシの不整合発生の懸念DMA方式は、多少のデメリットはありますが、大容量のデータを高速にやり取りする際には、採用するメリットのほうが多い方式といえます。ビデオ入出力の用途では、大容量の画像データを高速にメモリとアクセスする必要があるため、メモリと直接アクセスできるDMA方式を採用するのが良いでしょう。VDMAコアは、ビデオ入出力向けにDMA方式でメモリとアクセスできるようにしています。ひがしDMA方式は、以下の書籍で勉強しました。Piを使ったシステムの例が初学者向けにわかりやすく書かれた、おすすめの書籍です。VDMAコアには、他のIPコアとデータをやり取りするために、3種類の主要なインターフェースが用意されています。(MM)と呼ばれる伝送バスで接続します。画像データはこの伝送バスを通じて、メモリと周辺機器との間で送受信されます。初期化や割り込みなど、制御信号やステータス信号をCPUとやり取りするときには、AXI4-LITEと呼ばれる伝送バスを通じて行われます。実際のVivadoにおけるブロックダイアグラム上でIPコアを確認してみましょう。IPの設定画面上で、メモリからの読み出し(Read)と、メモリへの書き込み(Write)のいずれを行うのかを(あるいは両方を)設定することが可能です。今回は、ReadとWriteの各設定をした場合の、IPのブロックダイアグラムを示しました。各バスの接続方法を表にまとめると、この通りです。S_AXI_LITEひがし接頭辞のM_やS_というのは、そのIPが送受信を行う場合に、マスター側になるか、スレーブ側になるか、という役割分担を示しています。マスター側が主導権を握って、スレーブ側が指示に従ってデータを受信したり、送信したりするわけですね。Map(MM)からStream(S)へ画像データを伝送することになるので、MM2Sと略されています。IP上にはMM2Sが名前に含まれるインターフェースは2つあり、一つがM_AXI_MM2S、もう一つはM_AXIS_MM2Sです。AXIの後に「S」がついているだけの違いですが、M_AXI_MM2Sの方はMM側、すなわちメモリに、M_AXIS_MM2SがStream側、すなわち周辺機器と接続されます。この2つ以外にS_AXI_LITEというインターフェースがあります。これが、CPUと制御信号・ステータス信号をやり取りするためのインターフェースとなります。Map(MM)へ画像データを伝送することになるので、S2MMと略されています。こちらも読み出し(Read)と同様に、M_AXI_S2MMの方はMM側、すなわちメモリに、S_AXIS_S2MMがStream側、すなわち周辺機器と接続されます。VDMAの接続例を示したいと思います。Xilinxが公開している、Zynq-7000の内部構成は以下のとおりです。Logic)に2種類のインターコネクトが用意されています。Logic)との間で、データの送受信を行うことが可能です。(GPポート)を通じて、CPUとPLとの間で、データの送受信を行うことが可能です。SoCのテクニカルリフェレンスから、各ポートのスループットと推奨する使用方法について調べました。22.8よりこの比較表によると、以下のように設定するのが良いかと思います。メモリからビデオ信号を読み出す場合、IPは図のような構成になります。VDMAの制御信号やステータス信号はM_AXI_GP0ポートから、ビデオ信号はS_AXI_HP0ポートから入出力を行います。VDMAがマスターの役割をします。MapはRead、Writeともに常にマスターになります。Accessの最低限知っておくと良い項目についてまとめました。VDMAを制御するためのドライバの使用方法について、初心者向けに解説しています。phys-higashi.com2021.03.06参考文献Xilinx社のリファレンス・マニュアルを参考にしました。Terminalをマスター、Zynqをスレーブにして、データを通信する方法を解説。本記事では、I2C通信方式について解説した後、マイコンとZynqの接続の構成について解説しました。IPが提供されています。IPを使用する際に前提となるCORDICアルゴリズムについて抑えておくべきポイントを本記事にまとめました。-プログラムの作成と実行-本記事では、VitisとVivadoを用いてZybo経由で外部ディスプレイに画像を出力するアプリケーションを作成します。CPUで動作するHDMI出力プログラムを読み込み、Zybo上で動作を確認しました。(3)カスタムIPを用いたVitisプラットフォームプロジェクトの作成ハードウェア言語で作成したRTLモジュールにIPパッケージャーを使用してAXI4-Liteインタフェースを追加する方法を解説しています。IDEのアプリケーションを作成する方法を具体的に解説しています。取りうる範囲を意識せずに扱った結果、無限ループに陥ってしまいました。その失敗談を交えつつ、無限ループを避ける対策をまとめました。TerminalのマイコンとZynqをデータを通信する方法を解説。本記事では、ZynqのMIOとEMIOの違いについて解説した後、Zynq内部のブロックデザインをVivadoで作成しました。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。-掛け算IPをZyboに実装-2021.04.182022.02.13Rustupをインストールするときに発生したエラーの回避方法2021.08.102021.11.07。