概要VerilogやVHDLなどのハードウェア言語を用いて作成したRTLモジュールの入出力に、IPパッケージャーを使用してAXI4-Liteインタフェースを追加する方法を解説。本記事では、M側のAXI4-Liteインタフェースを追加したカスタムIPのロジック構成を具体的に解説しました。AXI4はXilinx社のIPを使う上での共通言語の役割を果たしています。自作で作成したRTLモジュールを既存のIPと接続するためには、自作RTLモジュールにAXIプロトコルの入出力インターフェースを追加しなくてはいけません。実際にゼロからIPにAXIプロトコルの入出力インターフェースを追加するのは大変です。そこで、前回の記事から、Xilinx社が提供するVivadoのIPパッケージャーという機能を用いて、自作のカスタムIPにAXIプロトコルの入出力インターフェースを追加する方法について解説しています。前回の記事では、S側のAXI4-Liteインタフェースを追加しました。本記事では、VerilogやVHDLなどのハードウェア言語を用いて作成したRTLモジュールの入出力に、IPパッケージャーを使用してAXI4-Liteインタフェースを楽に追加する方法を解説しています。カスタムIPの作成方法を紹介します。phys-higashi.com2021.06.16今回の記事から、M側、すなわち制御する側のAXI4-LiteインタフェースをカスタムIPに追加していきたいと思います。本記事では、M側のAXI4-Liteインタフェースを追加したカスタムIPのロジック構成について、まず理解しようと思います。Worldを出力させてみようと思います。自作RTLモジュールの接続先IPにAXI4インタフェースしか用意されていないような場合カスタムIPに制御レジスタやステータスレジスタを設け、プロセッサからそれらを参照したい場合AXI4プロトコルの動作について学ぶには以下の書籍がおすすめです。入門者向けにAXI4プロトコルの動作は、「FPGAプログラミング大全」に非常にわかりやすく解説されています。world”を外部PCに出力させてみましょう。ユーアート)は調歩同期式のシリアル信号をパラレル信号に変換したり、逆にパラレル信号をシリアル信号に変換するための集積回路です。LiteはAXI4-Liteプロトコルのパラレル信号をシリアル信号に変換するUARTの役割を果たすIPです。Registers)にFPGAからアクセスすることができます。Registersは、IPを設定するコントロールレジスタやステータスレジスタに加えて、シリアル信号に変換するデータや受信したシリアル信号のバッファとなるFIFOとしての役割も果たします。インターフェイスするよう設計されています。japan.xilinx.comUARTなどのシリアル通信に関する解説はネット上に数多くあるので、まずはそちらで勉強をしました。初学者がまず手始めに書籍で勉強しようとしたときに、以下の書籍が参考になりました。I2CやUARTなどの汎用的に使われる通信規格は、以下の書籍を参考にしています。組み込みマイコン周りのメモリやペリフェラルについて広く浅く記載されているので、網羅的に組み込みシステムを理解する初学者向けの書籍です。細かいところまでは記載されていないので、より通信規格について学ぶにはWebや別の教科書が必要にはなりましたが、まず持っておいても損はないかと思います。RinkerKindleAmazon楽天市場YahooショッピングカスタムIPの作成IPパッケージャーを使ったカスタムIPの作成方法は、以前の記事と基本的に同じです。本記事では、VerilogやVHDLなどのハードウェア言語を用いて作成したRTLモジュールの入出力に、IPパッケージャーを使用してAXI4-Liteインタフェースを楽に追加する方法を解説しています。カスタムIPの作成方法を紹介します。Mode]にMasterを選択します。Widthはそのままの値を指定しました。カスタムIPの名前を、今回の記事では[UART_OUT]としています。作成されたカスタムIPのブロックデザインはこのようになります。入力にクロックとリセット信号に加えて、“m00_axi_init_axi_txn”というポートが追加されています。出力にはM側のAXI-Liteインタフェースの他に、“m00_axi_error”と”m00_axi_txn_done“というポートが追加されています。次の節で説明する内部構成を見るとわかるのですが、”m00_axi_init_axi_txn”はM側のAXIトランザクションを開始するトリガーを入力するためのポートで、”m00_axi_txn_done”はトランザクションの完了を伝えるためのポートです。カスタムIPに用意されているロジック回路には、S側に書き込んだ信号と、書き込みが終わったあとに読みだした信号とを比較し、正しく書き込みがなされたかを確認するためのロジック回路が用意されています。“m00_axi_error”は正しく書き込みがなされていればLow状態、なされていない場合はHigh状態になります。それ以外にも、AXIトランザクションが不成立の場合もHigh状態になります。出力M00_AXIバス:追加したAXI4-Liteインタフェース(Master)“m00_axi_txn_done”:AXIトランザクションの完了を表す“m00_axi_error”:M側からS側に書き込んだ信号と実際に信号が一致していなかったり、AXIトランザクションが成立しなかった場合に、High状態になる。前回の記事で作成したカスタムIPの内部を見ていきましょう。作成したIPのフォルダ内部に雛形となるHDL記述のファイルが格納されています。カスタムIPのソースコードパス:[..\IP\ip_repo\UART_OUT_1.0\hdl]ソースコード:UART_OUT_v1_0.vUART_OUT_v1_0_M00_AXI.v今回も使用言語にVerilogを指定したので、これらのソースコードはVerilogで記述されています。この2つのファイルの関係は次の図のようになっています。前回の記事同様に、UART_OUT_v1_0.vはラッパーファイルで、UART_OUT_v1_0_M00_AXI.vに本質的な回路のHDL記述が用意されています。内部のIP構成について理解するには、ある程度Verilogの文法を理解しておく必要があります。Verilogの文法について、以下の書籍が網羅的に説明されています。RinkerAmazon楽天市場YahooショッピングUART_OUT_v1_0.vまずは、ラッパーファイルの中身を見ておきましょう。here”というコメントアウトの直後に、HDL記述を追加可能です。上記のコードを図解すると、次のような感じです。ユーザー用のパラメータ、ポート、ロジックの3箇所それぞれにカスタムで記述することが可能です。UART_OUT_v1_0_M00_AXI.v次に、本質的な回路部分が書かれている、UART_OUT_v1_0_S00_AXI.vというファイルの中身を確認しましょう。here”というコメントアウトがあると思います。同様に、コメントアウトの直後に、HDL記述を追加可能です。Logic部分に記述されています。上記のコードを図解すると、次のような感じです。AXI4-Lite用のトランザクションを行うために、AXI4-Liteのプロトコルを満足するようなロジックが構成されます。Logic)部分の構成を理解し、変更するときにどこをカスタマイズすべきかについて考えていきます。ユーザーロジックについてユーザーロジックを図解すると下の図のようになります。前回の記事でも解説したように、AXI4-Liteには合計5種類のチャネルがあり、書き込みではAW、W、Bチャネル、読み出しではAR、Rチャネルをそれぞれ使います。AXI4-Liteにおける5種類のチャネルAWチャネル:書き込み先のアドレスWチャネル:書き込むデータBチャネル:書き込みをできたかどうかの成否を判定ARチャネル:読み出しを行うアドレスRチャネル:読みだしたデータユーザーロジックでは大きく3つの処理がなされています。「S側IPへの書き込み処理」、「S側IPからの読み出し処理」、「書き込み値と読み出し値の判定処理」の3つです。ユーザーロジックでは、この3つの処理をステートマシンを使って順次実行しています。状態遷移図と各処理におけるタイミングチャートを見て、内部の動作の大まかな流れを確認しましょう。状態遷移図ユーザーロジックの内部では、上記の3つの処理を行う状態に加えて、トリガー信号の入力を待つ待機状態の、合計4状態が定義されています。下の状態遷移図のように、順にループの構造でこの4状態の間を遷移します。S側IPにおけるレジスタへの書き込み操作と読み出し操作は、パラメータ“C_M_TRANSACTIONS_NUM”で指定した回数分だけ実行されます。生成したカスタムIPでは、”C_M_TRANSACTIONS_NUM”が4に指定されているので、4回、アドレスとデータの書き込みと読み出しを行います。このとき、常に同じアドレスに書き込みを行うわけではなく、下のコードのように、例えば、アドレスには4ずつ値が加算されて別のアドレスに値を書き込んで、動作確認を行っていました。end書き込みのタイミングチャート(INIT_WRITE)実際に書き込み処理を行うときのタイミングチャートは以下のようになっていました。AWチャネルとWチャネルにそれぞれアドレスとデータをのせて、外部のS側IPに出力しています。S側IPからBチャネルにのせたOK信号を受信したら、次の書き込みを実行します。指定した回数分だけ書き込みが完了したら、INIT_READ状態に状態遷移します。読み出しのタイミングチャート(INIT_READ)読み出しも同様で、AWチャネルにアドレスをのせて、S側IPにデータを要求します。Wチャネルにのったデータを受信したら、次の読み出しを行い、指定した回数分だけの読み出しを実行します。書き込み値と読み出し値の判定処理(COMPARE)判定処理(COMPARE)はシンプルで、読み出し処理中(state=INIT_READ)に、書き込みを行った値(expected_rdata;X)と読みだした値(M_AXI_RDATA;Y)が一致するかどうかを予め判定しておき、判定結果をERRORに出力する処理を1クロックで行っています。※なお、ERRORは書き込みと読み出しの不一致だけでなく、AXIトランザクションが不成立の場合もHigh状態になるようにロジックが組まれています。本記事では、その説明を割愛しています。ひがし本記事では、M側のAXI4-Liteのカスタマイズの手始めに、作成したカスタムIPの内部構成の理解からはじめました。UARTへの送信を行うには、書き込み処理を行っているロジックを流用できそうですね。Liteのレジスタに書き込む方法IPパッケージャーを使用してMaster側のAXI4-Liteインタフェースを追加する方法を解説しています。Lite”のAXI4-Liteポートと接続可能なカスタムIPを作成しました。関連記事Vitis【HDMI出力編(3)】静止画をZynqからHDMI出力するVitisアプリケーション本記事では、Vitisを用いてZybo経由で外部ディスプレイに画像を出力するアプリケーションを作成します。アプリケーションでは、ドライバ関数によりIPコアの設定を行った後、読み出すフレームバッファに直接静止画を書き込んでいます。本記事では、VerilogやVHDLなどのハードウェア言語を用いて作成したRTLモジュールの入出力に、IPパッケージャーを使用してAXI4-Liteインタフェースを楽に追加する方法を解説しています。カスタムIPの作成方法を紹介します。取りうる範囲を意識せずに扱った結果、無限ループに陥ってしまいました。その失敗談を交えつつ、無限ループを避ける対策をまとめました。(3)カスタムIPを用いたVitisプラットフォームプロジェクトの作成ハードウェア言語で作成したRTLモジュールにIPパッケージャーを使用してAXI4-Liteインタフェースを追加する方法を解説しています。IDEのアプリケーションを作成する方法を具体的に解説しています。TerminalのマイコンとZynqをデータを通信する方法を解説。本記事では、サンプルプログラムや各API関数のリファレンスの参照方法を紹介した後、サンプルプログラムの動作原理について調べた内容を解説します。Vitis【LED点滅編(4)】タイマー割り込みを行うAPIについて解説Zynqのプロセッサ上で割り込みをかける方法について解説します。SDKでのAPIの使用方法についてまとめました。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。-掛け算IPをZyboに実装-2021.04.182022.02.13Rustupをインストールするときに発生したエラーの回避方法2021.08.102021.11.07。