Circuit)規格でマイコンとZynqをデータを通信する方法を解説。TerminalのATSAMD51P19を選ぶ。Slave)であるZynqからデータを要求する。本記事では、ZynqのPS部で動作させるサンプルプログラムxiicps_intr_slave_example.cについて解説する。TerminalのマイコンATSAMD51P19とのI2C通信に挑戦しています。Terminalをマスター、Zynqをスレーブにして、データを通信する方法を解説。本記事では、I2C通信方式について解説した後、マイコンとZynqの接続の構成について解説しました。TerminalのマイコンとZynqをデータを通信する方法を解説。本記事では、ZynqのMIOとEMIOの違いについて解説した後、Zynq内部のブロックデザインをVivadoで作成しました。TerminalとZyboの接続Zynqで動かすソフトウェアの土台となるハードウェア構成まで構想・構築ができたので、次にZynqで動かすソフトウェアを作ります。ソフトウェアはすでにVitisで提供されているサンプルプログラムxiicps_intr_slave_example.cを用いました。本記事では、サンプルプログラムの動作原理について調べた内容を解説していきます。前回の記事と今後の記事では、以下の順に解説をしています。IDEでのアプリケーションの構築workspaceの立ち上げ前回の記事でXSAファイルの作成までできたので、XSAファイルからVitisのworkspaceを作成します。worldとLED点滅回路と同様なので省略します。以下の記事を参考にしていただければと思います。本記事ではVitisとVivadoを用いてZybo上で動作するHelloWorldアプリケーションを作成しています。Worldの出力を確認しました。IDEが立ち上がったら、アプリケーションプロジェクトを作成します。IDE上にすでに用意されているサンプルプログラムを活用しようと思います。IDE上には各APIの機能説明してあるドキュメンテーションへのリンクや用例へのリンクがすでに用意されています。こちらの記事で、I2C通信のペリフェラルに関連するドライバのドキュメンテーションと用例の参照方法を解説しているので、ご覧いただければと思います。【Vitis】ドライバのドキュメンテーションと用例を活用しようXilinx社のソフトウェア開発ツールVitisではIPコアやペリフェラルを制御するためのドライバが用意されています。本記事では、各ドライバのマニュアルへのリンクと、用例のプログラムをインポートする方法についてまとめました。phys-higashi.com2021.11.13I2Cペリフェラルを制御するドライバに関してのドキュメンテーションを参照したところ、ZynqをI2Cのスレーブ機器として扱うサンプルコードには、以下の2つがあるようです。アプリケーションプロジェクトをインポートし、このプロジェクトをそのままビルドして使用しました。githubにも同様のドキュメンテーションと用例のアプリケーションがあるので、Vitisを立ち上げずにすぐに確認したい方はこちらを参照するのもよいでしょう。サンプルプログラムを読み込んだだけでは、あまり理解した気にならないので、用例のソースコードを読み解いていくことにしました。ソースコードには英語で丁寧な注釈が記載されているので、それを補足するような図解が主になると思います。動作概要まず、サンプルプログラムでどういう処理を行っているのか確認しておきます。一致したら成功という一連の処理を行います。Terminalにやらせる予定です。Terminalのプログラムでは、このシーケンスに従った処理をArduinoスケッチに記述していきます。処理内容ソースコードのフローチャートxiicps_intr_slave_exampleにおけるメインの関数は、IicPsSlaveIntrExampleという関数です。一連のシーケンスは以下のフローチャートの通りです。送信バッファと受信バッファの初期化を順に行っています。以前、LED点滅回路のタイマー割り込みの記事でインスタンスの概念と割り込みの方法について解説したので、割り込みについて詳しく知りたい方はぜひこの記事もご覧いただければと思います。CPUで動作するLED点滅アプリケーションの作成を通じて、アプリケーションプロジェクトで使用されるインスタンスという概念とGPIOを制御するドライバAPI関数の使用方法について解説しました。【LED点滅編(4)】タイマー割り込みを行うAPIについて解説Zynqのプロセッサ上で割り込みをかける方法について解説します。SDKでのAPIの使用方法についてまとめました。phys-higashi.com2021.05.04I2Cペリフェラルのインスタンスの初期化まず、I2Cペリフェラルのインスタンスの初期化を行い、アプリケーション上で定義したIicインスタンスと、実際のデバイス上で用意されているI2Cペリフェラルとを紐づけ、IicインスタンスのAPI関数だけでペリフェラルを制御できるようにしています。次に、割り込みの設定を行っています。関数SetupInterruputSystemが別に定義されており、この関数で必要な設定をすべて行っています。割り込み命令を受けると...GICインスタンスの割り込みハンドラに処理を渡して、XiicPS_SlaveInterruptHandlerというAPI関数を呼び出すという割り込みの設定がなされます。(PS)では、GICと呼ばれる割り込みコントローラが使用されています。GICは、CPUに送信される割り込み信号を集中的に管理・送信するデバイスです。https://japan.xilinx.com/support/documentation/user_guides/j_ug585-Zynq-7000-TRM.pdfより抜粋ポイントは、XiicPS_SlaveInterruptHandlerというAPI関数はどういった処理を行っているのかです。この関数はスレーブモードで使われる関数で、I2Cペリフェラルにおいてどういったイベントがトリガーとなって割り込みが発生したのかを分類してくれます。関数の最後で別のハンドラ(関数)を呼び出し、イベントごとに異なった処理を行わせることが可能です。xiicps_intr_slave_exampleでは、受信完了(RecvComplete)と送信完了(SendComplete)とその他の3イベントに分類して、その後の処理を変えています。Registerを参照し、イベントを分類。Handlerに、イベントの値とともに処理を渡す。割り込みの設定が完了したら、次はIiCインスタンスの各種設定を行い、I2Cペリフェラルを制御します。I2Cペリフェラルに、以下の3つを設定しています。Terminalのプログラムでは、マスター側はこのスレーブアドレスと通信します。最後に、データを送受信するための送信バッファと受信バッファの値を初期化していました。TEST_BUFFER_SIZE-1」を格納し、受信バッファにゼロを格納します。以上で初期設定が完了です。次は、データ伝送です。送信設定を行い、マスター機器への送信が完了したら、次に受信設定を行います。割り込みを利用したデータ送信XIicPs_SlaveSendというAPI関数によって、I2Cで送信したい配列を指定しています。ドライバに用意されているいくつかのAPI関数では、必要なI2Cペリフェラルのレジスタ設定をすべて行ってくれるのでとても有用です。割り込みをトリガーとしてスレーブからデータ送信を行いたい場合のレジスタ設定を行います。返り値:なし送信完了のイベントが割り込みによって発生したら、whileループを抜けてデータの受信を待ちます。次に、データ受信モードの設定に入ります。XIicPs_SlaveRecvというAPI関数によって、受信モードへのレジスタ設定と受信したデータを格納するためのバッファを指定しています。返り値:なしここでも、受信完了のイベントが割り込みで発生するのをwhileループで待ちます。受信を完了したら、送信バッファと受信バッファを比較して、一致するか否かを判定して終了です。まとめ本記事では、ZynqのI2Cペリフェラルをスレーブモードで制御するアプリケーションを読み込み、アプリケーションでの処理について調べた内容をまとめました。Vitisでは、非常に多くのAPIが用意されていて、使いこなす・理解するにはある程度の慣れが必要です。ドキュメンテーションと用例を見つけることができれば、注釈や解説は比較的丁寧に書かれているので、それを活用すれば楽にアプリケーションを構築できます。ひがしお疲れさまです。Terminalに作ったマスター側のプログラムの解説をしたのち、実際の動作を確認した結果を掲載します。Terminalをマスター、Zynqをスレーブにして、データを通信する方法を解説。Terminalのマイコンで動作させるArduinoのスケッチを紹介した後、実際にI2C通信した結果を掲載しました。本記事では、VerilogやVHDLなどのハードウェア言語を用いて作成したRTLモジュールの入出力に、IPパッケージャーを使用してAXI4-Liteインタフェースを楽に追加する方法を解説しています。カスタムIPの作成方法を紹介します。企業のエンジニアとして働きつつ、FPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。本記事ではVitisとVivadoを用いてZybo上の"LED"を点滅させるアプリケーションを作成しています。CPUで動作する”LED点滅”プログラムの動作原理を解説しながら、実際にLEDの点滅まで確認しました。Accessの最低限知っておくと良い項目についてまとめました。VDMAを制御するためのドライバの使用方法について、初心者向けに解説しています。World”をシリアル出力するFPGAロジックの作成IPパッケージャーを使用してMaster側のAXI4-Liteインタフェースを追加する方法を解説しました。Lite”に文字列をAXI経由で入力し、シリアル出力するロジックを作成し、Zybo上で動作確認を行いました。(1)カスタムIPの内部構成について理解するハードウェア言語で作成したRTLモジュールにIPパッケージャーを使用して、Master側のAXI4-Liteインタフェースを追加する方法を解説しています。カスタムIPのどこを変更すればよいか、図解しながらIPの内部構成を解説しています。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。-掛け算IPをZyboに実装-2021.04.182022.02.13Rustupをインストールするときに発生したエラーの回避方法2021.08.102021.11.07。