概要Zynq内のCPUにて、LEDを点灯・点滅させるプログラムを実行することを目的に、以下を行った。SDKを用いられてきました。SDKから統合ソフトウェア開発環境「Vitis」へと移行しています。2020.2で作成しました。本記事ではVitisとVivadoを用いてZybo上のHelloWorldを出力するアプリケーションの作成をめざします。CPU上でHelloWorldプログラムを動かすために、Zynqのハードウェア構成を定めるプロジェクトを作成しました。Zynq)に実装する”LED点滅”アプリケーションを作成する方法についてまとめます。SoCのハードウェア設計を完了しました。本記事ではVitisとVivadoを用いてZybo上のLEDを点滅させるアプリケーションの作成をめざします。CPU上で”LED点滅”プログラムを動かすために、Zynq内部のハードウェア構成を定めるプロジェクトを作成しました。phys-higashi.com2021.02.13今回の記事では引き続き”LED点滅”アプリケーションのプログラムを作成していきます。World”アプリケーションを作成したときと同様に、Vitisのワークスペースを作成していきます。ワークスペースの構成については、次の記事を参照ください。本記事ではVitisとVivadoを用いてZybo上で動作するHelloWorldアプリケーションを作成しています。Worldの出力を確認しました。phys-higashi.com2021.02.08ワークスペースの作成手順をまとめると、次の通りです。Project]をクリックし、新しいアプリケーションプロジェクトを作成ハードウェアデザイン(XSAファイル)の読み込みアプリケーションプロジェクト名の指定ドメインの指定アプリケーションプロジェクトのテンプレートの読み込み前回の記事と重複する内容になりますので、改めて確認したい方は[+]マークから詳細をご確認ください。IDE]を選択します。立ち上がったウィンドウ上で、Workspaceを格納するディレクトリを指定します。指定が完了したら、[Launch]をクリックします。新しくVitisのウィンドウが立ち上がります。Project]をクリックし、新しいアプリケーションプロジェクトを作成していきます。ハードウェアデザイン(XSAファイル)の読み込み最初のウィンドウではそのまま[Next]をクリックします。Vivadoで作成したハードウェアデザイン(XSAファイル)を読み込んでいきます。(XSA)]タブを選択し、[Browse]をクリックし、前回の記事で作成した“hello_world_system_wrapper.xsa”を選択します。選択が完了したら、[Next]をクリックします。アプリケーションプロジェクト名の指定アプリケーションプロジェクト名を入力し、アプリケーションを動作させるプロセッサの種類を選択したら、[Next]をクリックします。今回は特に設定変更不要ですので、そのまま[Next]をクリックします。Application”を選択し、[Finish]をクリックします。IDEのウィンドウの立ち上げまで完了したら、このワークスペース上で、”LED点滅”プログラムを作成していきましょう。LED点滅プログラムのソースコードの作成はじめに、プログラムのソースコードをワークスペースに追加します。workspace上のExplorer欄に、新規にソースコードを追加します。Explorer内の[src]を右クリックし、[New]>[File]と選択します。File]というウィンドウが立ち上がります。このウィンドウ上で、新規に作成するファイル名を指定します。今回は、ファイル名を[led.c]としました。ポイントは、拡張子を[***.c]としておくことです。指定し終わったら、[Next]をクリックしましょう。追加した[led.c]は何も書かれていない空白のファイルです。ここにソースコードを書いていきます。全ソースコードを掲載しておきます。前項で掲載したソースコードの意味を順に解説していきます。0x04))まずは、ソースコード冒頭に記載している#include文と#define文について、順に見ていきましょう。文で読み出している”xparameters.h”とは?#include文では、”xparameters.h”というヘッダーファイルを読み込んでいます。この”xparameters.h”は「どこに」格納されていて、「何を」記載しているのでしょうか?まず、「どこに?」ですが、プラットフォームプロジェクト(led_blink_system_wrapper)の中に格納されています。ワークスペースを作成するときに、XSAファイルと呼ばれるハードウェアのデザインを読み込みました。そのときに、自動でこのヘッダーファイルが生成されているようです。Explorer内の[led_blink_system_wrapper]>[zynq_fsbl]>[zynq_fsbl_bsp]>[ps7_cortexa9_0]>[include]にヘッダーファイルが格納されている。次に、”xparameters.h”は「何を?」記載しているかについて確認しましょう。0と記載されています。[XPAR_GPIO_0_BASEADDR]という変数を定義し、その変数に[0x41200000]という数値を割り当てています。GPIO”というIPをブロックダイアグラムに追加しました。GPIO”における各レジスタのベースアドレスを表しています。GPIO”のレジスタ構成について確認していきましょう。Space”に詳細に記載されています。https://www.xilinx.com/support/documentation/ip_documentation/axi_gpio/v2_0/pg144-axi-gpio.pdfより引用データシートに基づき、AXI_GPIOのレジスタ空間の構成を整理しました。あるベースアドレスに対して、オフセットを加えて、データレジスタやコントロールレジスタのアドレスとしているようです。GPIO]というIPは4個のLEDに4bitのデータを出力していました。この4bitのデータを格納するデータレジスタを示すアドレスは「ベースアドレス+オフセット0x0000」ということになります。GPIO]のベースアドレスの値は何なのか?ベースアドレスの確認方法は2通りあります。1つ目の方法についてです。先程の[xparameters.h]の中身を見たときに答えが書かれています。GPIO]のベースアドレスとなります。0x41200000別の方法は、Vivadoで作成したデザインから確認が可能です。Editor]とよばれるタグがあるので、それをクリックします。Address”を確認しましょう。[0x4120_0000]という値が格納されているはずです。ひがし例えば、GPIOの出力(今回はその先のLED)にデータを送るためには、ベースアドレス[XPAR_GPIO_0_BASEADDR(=0x4120_0000)]にオフセット[0x0000]を足したアドレスのレジスタに値を格納すればよいことになりますでは、[led.c]の冒頭のソースコードに戻ります。0x04))ヘッダーファイル”xparameters.h”には、システム上の各レジスタのベースアドレスなどが格納されていました。#include文はこのヘッダーファイルを読み出しています。次の#define文では、[LED]と[LED_ctrl]という名称の変数を定義しています。各変数には、ベースアドレス[XPAR_GPIO_0_BASEADDR(=0x4120_0000)]にオフセット[0x00]や[0x04]を足したアドレスが指し示すレジスタを、ポインタを使って割り当てています。この冒頭の定義文によって、新しく定義した[LED]と[LED_ctrl]という変数を用いて、GPIOのデータレジスタとコントロールレジスタに値を格納することが可能になりました。レジスタへの値の代入では、続くソースコードを確認しましょう。0;}ソースコード本文になります。コントロールレジスタ[LED_ctrl]に値[0x0]を格納しています。(GPIOx_TRI)”に、各値の説明が掲載されています。GPIOを介してLEDにデータを送ることが目標です。そこで、ソースコード上ではコントロールレジスタ[LED_ctrl]には[0x0]を格納しています。次に、データレジスタ[LED]に値[0x1](=2進数表記で”0001′′)を格納しています。接続している4つのLEDのうち、右から一つ目のLEDを点灯させることを指示しています。ここまででプログラムの作成は完了です。このプログラムのもと、実際に回路基板上でLEDを点灯させてみましょう。World”のプログラムと変更ありません。確認したい方は[+]マークから詳細をご確認ください。実装方法の詳細1プロジェクトのビルドまず、プラットフォームプロジェクトをビルドしていきます。エクスプローラ内のプラットフォームプロジェクト(led_blink_system_wrapper)を選択し、右クリックします。Project]を選択すると、ビルドが始まります。次に、システムプロジェクトをビルドしていきます。エクスプローラ内のシステムプロジェクト(led_blink_application_system)を選択し、右クリックします。Project]を選択すると、ビルドが始まります。2コンフィグレーション回路基板をホストPCにつなぎます。つないで電源を入れたら、PC側からFPGAへのbitstreamファイルの書き込み(コンフィグレーション)とアプリケーションソフトウェアのDDRへの書き込みを実行します。Hardware]を選択すると、コンフィグレーションとソフトウェアの書き込みが実施されます。今回は、UARTの信号を受信しないので、ホストPCとのCOMポートの設定は必要ありません。そのまま、[Resume]アイコンをクリックしてプログラムを実行しましょう見事に右から1つ目のLEDのみが点灯しました。プログラムを変更してみましょう。GPIOのデータレジスタ(変数名[LED])に“0x3′′(2進数表示で0011)を代入してみます。0;}右から1番目と2番目のLEDが点灯すれば成功です!LEDの点滅LEDを点滅させるということを行いたいと思います。これまでは定常的にLEDを点灯させるのみでしたが、点滅となると時間変化を伴う動的な制御が必要になります。そこで、プログラム上ではwhileループと時間遅延を設ける構文を追加します。}”により常にループを回し続け、iに関するforループでLEDのONとOFFを切り替えています。jに関するforループは、jを100メガ回足し続けることによって、whileループの1ループの時間が長くなるようにしています。このプログラムを実装し、LEDを動かした動画がこちらです。1秒間隔で右から1番目のLEDが点滅しているのがわかります。ひがしLEDがピカピカ光ると達成感が得られて、楽しいですね。電子工作の醍醐味の一つだと思います!!やはり、実際にLEDが点滅する様子を見ると、プログラムを動かしている実感がわきますね!ここまで読んでいただき、ありがとうございました。CPUで動作するLED点滅アプリケーションの作成を通じて、アプリケーションプロジェクトで使用されるインスタンスという概念とGPIOを制御するドライバAPI関数の使用方法について解説しました。TerminalのマイコンとZynqをデータを通信する方法を解説。本記事では、ZynqのMIOとEMIOの違いについて解説した後、Zynq内部のブロックデザインをVivadoで作成しました。TerminalのマイコンとZynqをデータを通信する方法を解説。本記事では、サンプルプログラムや各API関数のリファレンスの参照方法を紹介した後、サンプルプログラムの動作原理について調べた内容を解説します。2021.1をインストールしました。インストールにあたり、いくつか詰まったところもあったので、その解決方法を記事にまとめています。企業のエンジニアとして働きつつ、FPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法につ...Vitis【外部映像送受信(2)】Zynq上で外部映像を送受信するアプリケーション(送信系の作成)本サイトでは、Zynqが外部からのHDMI信号を受信しDDRメモリに格納した後、DDRメモリを読み出しVGA信号を送信するアプリケーションの解説を行っています。VGA信号をディスプレイへ送信する送信系のプログラムについて紹介・解説しました。Zynqが外部からのHDMI信号を受信しDDRメモリに格納した後、DDRメモリを読み出しVGA信号を送信するアプリケーションの解説をZyboを使って行っています。ソースコードを例にHDMI信号を受信する際のAPIの使用方法を解説しました。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。-掛け算IPをZyboに実装-2021.04.182022.02.13Rustupをインストールするときに発生したエラーの回避方法2021.08.102021.11.07。