概要VerilogやVHDLなどのハードウェア言語を用いて作成したRTLモジュールの入出力に、IPパッケージャーを使用してAXI4-Liteインタフェースを追加する方法を解説。本記事では、作成したカスタムIPの内部構成と、そのカスタマイズ方法を具体的に説明。AXI4はXilinx社のIPを使う上での共通言語の役割を果たしています。自作でRTLモジュールを作成した場合に、既存のIPと接続するためには、自作RTLモジュールにAXIプロトコルの入出力インターフェースを追加しなくてはいけません。実際にゼロからIPにAXIプロトコルの入出力インターフェースを追加するのは大変です。そこで、前回の記事から、Xilinx社が提供するVivadoのIPパッケージャーという機能を用いて、自作のカスタムIPにAXIプロトコルの入出力インターフェースを追加する方法について解説しています。本記事では、VerilogやVHDLなどのハードウェア言語を用いて作成したRTLモジュールの入出力に、IPパッケージャーを使用してAXI4-Liteインタフェースを楽に追加する方法を解説しています。カスタムIPの作成方法を紹介します。phys-higashi.com2021.06.16今回は、IPパッケージャーを使用して作成した、カスタムIPの内部構成を解説し、具体的にカスタマイズする方法を解説します。次回の記事では、このカスタムIPを動かすドライバAPIの使用方法を解説し、Zynq上のプロセッサで動作確認を行います。自作RTLモジュールの接続先IPにAXI4インタフェースしか用意されていないような場合カスタムIPに制御レジスタやステータスレジスタを設け、プロセッサからそれらを参照したい場合AXI4プロトコルの動作について学ぶには以下の書籍がおすすめです。入門者向けにAXI4プロトコルの動作は、「FPGAプログラミング大全」に非常にわかりやすく解説されています。本記事全体の目標は次の通りです:自作のRTLモジュールにAXI4-Liteインタフェース(S側)を追加するカスタムIPに実装するRTL回路は比較的簡単なLED点滅回路とします。プロセッサが書き込んだ制御レジスタの値によって、LEDの点滅位置を変更します。前回の記事で作成したカスタムIPの内部を見ていきましょう。作成したIPのフォルダ内部に雛形となるHDL記述のファイルが格納されています。カスタムIPのソースコードパス:[..\IP\ip_repo\led_config_1.0\hdl]ソースコード:led_config_v1_0.vled_config_v1_0_S00_AXI.v今回は使用言語にVerilogを指定したので、これらのソースコードはVerilogで記述されています。この2つのファイルの関係は次の図のようになっています。led_config_v1_0.vはラッパーファイルで、led_config_v1_0_S00_AXI.vに本質的な回路のHDL記述が用意されています。内部のIP構成について理解するには、ある程度Verilogの文法を理解しておく必要があります。Verilogの文法について、以下の書籍が網羅的に説明されています。RinkerAmazon楽天市場Yahooショッピングled_config_v1_0.vまずは、ラッパーファイルの中身を見ておきましょう。here”というコメントアウトがあると思います。このコメントアウトの直後に、HDL記述を追加していきます。上記のコードを図解すると、次のような感じです。ユーザー用のパラメータ、ポート、ロジックの3箇所それぞれにカスタムで記述することが可能です。led_config_v1_0_S00_AXI.v次に、本質的な回路部分が書かれている、led_config_v1_0_S00_AXI.vというファイルの中身を確認しましょう。here”というコメントアウトがあると思います。同様に、コメントアウトの直後に、HDL記述を追加していきます。上記のコードを図解すると、次のような感じです。自動生成ロジックの部分で、AXI4-Liteのプロトコルを満足するように、ロジックが構成されます。ユーザー用のパラメータ、ポート、ロジックの3箇所それぞれにカスタムで記述することが可能です。AXI4-Lite用に自動生成されたロジックの部分も、内容が理解できれば、適宜修正することが可能です。自動生成されたロジックについて自動生成されたロジックについて、図解すると下の図のようになります。詳細はコード自体をご覧いただいて、自分で理解するのがよいと思いますが、その一助として下の図を活用いただけるとよいかと思います。自動生成されているロジック内部の動作の大まかな流れを確認しましょう。自動生成されたロジック内では4つのレジスタslv_regで構成されるレジスタ空間が生成されます。Registers]を4のままにしておきましたが、この値によって生成されるレジスタ空間のサイズを変えることが可能です。レジスタslv_regにデータを読み書きするために、AXI4-Liteには、5種類のチャネルが設けられています。AXI4-Liteにおける5種類のチャネルAWチャネル:書き込み先のアドレスWチャネル:書き込むデータBチャネル:書き込みをできたかどうかの成否を判定ARチャネル:読み出しを行うアドレスRチャネル:読みだしたデータ書き込むときのイメージS側IPのレジスタslv_regにデータを書き込むときには、5つのチャネルのうち、AWチャネル、Wチャネル、Bチャネルの3つを使います。M側IPが操作・制御するときのイメージは下の図のようになります。M側のIPが、AWチャネルに書き込むレジスタのアドレス、Wチャネルに書き込むデータを乗せて、S側のIPに送信します。S側のIPが無事にアドレスとデータを受信したら、Bチャネルに無事に受信したかどうかを示す成否判定信号を乗せて、M側のIPに送信します。読み出すときのイメージ次に、M側IPがS側IPのレジスタのデータを読み出したいときには、5つのチャネルのうち、ARチャネル、Rチャネルの2つを使います。先程同様に、読み出し操作のイメージはこのような感じです。M側のIPが、ARチャネルに読み出したいレジスタのアドレスを乗せて、S側のIPに送信します。S側のIPはアドレスを受信したら、Rチャネルに読みだしたデータを乗せて、M側のIPに送信します。今回のカスタマイズでは、レジスタslv_regを参照し、その値に応じてLEDの点灯位置を修正していきます。そこで、レジスタslv_regに値を書き込む自動生成されたロジックはそのまま用いて、別のユーザーロジックを追加したいと思います。最終的に作りたいIPのイメージを共有しておきます。図のように、レジスタslv_reg1の値をそのまま外部に出力して、LEDの入力にするような非常に簡単な回路を作ってみましょう。led_config_v1_0_S00_AXI.vまず、led_config_v1_0_S00_AXI.vを変更しましょう。ソースコードでは、「1出力側のユーザーポートを追加する」「2ユーザーロジックで、ユーザーポートとレジスタslv_reg1とを接続する」の2つを行います。1のLEDと接続するための出力ポート(4bit)を追加します。以下のようなコードを記述します。ends次に、2のロジックについてです。非常に簡単ですが、slv_reg0の下位4bitのレジスタをLEDに出力します。slv_reg0の下位4bitのレジスタ[3:0]を、assignを使って出力ポートled_opと配線しました。endsled_config_v1_0.v次に、ラッパーファイルを変更しましょう。ソースコードでは、「1出力側のユーザーポートを追加する」「2参照しているインスタンスにユーザーポートを追加する」の2つを行います。1のLEDと接続するための出力ポート(4bit)を追加します。以下のようなコードを記述します。ends次に、2の参照しているインスタンスled_config_v1_0_S00_AXI.vにユーザーポートを追加します。非常に簡単ですが、slv_reg0の下位4bitのレジスタをLEDに出力します。はじめに.led_opというユーザーポート同士をつなぐための記述を追加しています。(led_op),/*略*/);カスタムIPのパッケージングでは、変更したカスタムIPをパッケージングしていきましょう。前回の記事で、カスタムIPを作成すると、下の図のような新しいVivadoのウィンドウが立ち上がっていると思います。IP]というタブの、いくつかのアイコンがチェックマークから図のようなマークに変わります。この変更されたマークが付いている項目を一つクリックし、画面上の[インフォメーション]のアイコンをクリックすると、自動的にIPが修正されます。IP]をクリックします。これにより、修正後のカスタムIPがパッケージングされます。パッケージングが完了すると、Vivadoプロジェクトを閉じるかどうか選択できます。ここでは、[Yes]を選択しておきました。Vivadoプロジェクトをそのまま立ち上げたままにしておきたい場合は、[No]を選択します。ひがし以上で、カスタムIPのカスタマイズが完了しました。次回は、いよいよ自作のIPを動かしていきたいと思います!最後までご覧いただきありがとうございました。(3)カスタムIPを用いたVitisプラットフォームプロジェクトの作成ハードウェア言語で作成したRTLモジュールにIPパッケージャーを使用してAXI4-Liteインタフェースを追加する方法を解説しています。IDEのアプリケーションを作成する方法を具体的に解説しています。Controllerの最低限知っておくと良い項目についてまとめました。Controllerを制御するためのドライバの使用方法について初心者向けに解説しています。Zynqが外部からのHDMI信号を受信しDDRメモリに格納した後、DDRメモリを読み出しVGA信号を送信するアプリケーションの解説を行っています。HDMI信号をZynqが受信する際の割り込みの設定方法について紹介・解説しました。取りうる範囲を意識せずに扱った結果、無限ループに陥ってしまいました。その失敗談を交えつつ、無限ループを避ける対策をまとめました。2021.1版にも対応)開発ボードZyboの初期設定ファイルをVivadoに読み込むための方法を解説。2021.1以降では対応方法が異なります。本サイトでは両方のバージョンでの方法をそれぞれ解説しています。Accessの最低限知っておくと良い項目についてまとめました。VDMAは何のために用いるのか、他のIPとはどのように接続すればよいのか、初心者向けに基本的な機能について解説しています。SoCレーザー測距センサVL53L0XとZynqをI2C通信Zynqとレーザー測距センサVL53L0XとをI2C通信できるようにしました。本記事では、VL53L0Xの仕様を述べた後、Zyboとの接続方法、Zynqのブロックダイアグラムを紹介しています。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。-掛け算IPをZyboに実装-2021.04.182022.02.13Rustupをインストールするときに発生したエラーの回避方法2021.08.102021.11.07。