2021 年 8 月 27 日

編集者注: このコンテンツは、作成者の許可により、MicroZed Chronicles を再公開しています

 

Kria KV260 ビジョン AI スターター キットは、エンベデッド ビジョン アプリケーションや AI アクセラレーションに最適なプラットフォームですが、わたしたちの顧客には、ビジョンや AI 以外のアプリケーション、またはビジョンや AI が全体のごく一部しか使用されないアプリケーション開発に SOM を利用してみたいと考える設計者が増えています。

そこで、その他の SOM やボードと同じように、Vivado と Vitis を使用して、Kria SOM アプリケーションを簡単に構築できることを説明することに価値があると考えました。

このプロジェクトでは、Kria SOM のプログラマブル ロジックに、シンプルな PWM 出力を実装して、Pmod ポートと接続します。モーター制御などのその他のアクチュエータ制御が必要な場合も同様のアプローチが必要になります。

まず最初に、Kria SOM をターゲットとする新規プロジェクトを作成します。このプロジェクトでは、 Vivado/Vitis 2020.1 を使用しています。

プロジェクト作成時、ターゲット ボード ([Name:]) に [Kria KV260 Vision AI Starter Kit] を選択してください。このオプションは、[boards] タブに表示されています。このボードを選択することで、Vivado がターゲット ボードを認識し、SOM デバイスを正しく設定して使用できるようになります。

Vivado と Vitis の使用方法については、簡単に説明した以前の記事 「Getting Started With Vivado」 および 「Creating Applications with Vitis」 をご覧ください。

プロジェクト作成後、通常どおりに Vivado アプリケーションの開発を進めます。ブロック図を作成して MPSoC に追加 (ブロック オートメーション機能を使用して、Kria 用に MPSoC ブロックを構成) し、AXI タイマーをアドインします。AXI タイマーの PWM ピンは外部に設定します。このピンには、PMod ピン 1 に接続される Kria SOM ピンを指定しました。

ここで、SOM のどのデバイス ピンがコネクタに接続され、最終的に Pmod に接続されているのかが気になると思います。この情報は、ザイリンクスが提供している Kria ビジョン AI キャリア カードの回路図を見て知ることができます。

これらの回路図では、Pmod ピン 1 が 「HDA11」 と表記されており、Kria デバイスの高密度 I/O バンクに接続されていることを示しています。

ここで、ザイリンクスが提供する 2 つの XDC ファイルを使用します。最初の XDC には、KRIA のコネクタ番号 (ここでは som240_1_a17) が定義されています。2 つ目の XDC には、デバイス上の実際のピン位置 (H12) が定義されています。これらの XDC ファイルと回路図は、ザイリンクスの Kria ページからダウンロードできます。

これらの XDC ファイルを Vivado プロジェクトに追加し、任意の SOM コネクタ ピンに対してデザイン内の IO を指定します。この例では、PWM 出力ポートを som240_1_a17 として指定し、実機の正しい場所に接続するようにしました。

デフォルトでは、Kria 上 の MPSoC の設定では、UART が有効になっていません。回路図を見ると、MIO ピン 36 と 37 は、USB UART に接続された TX と RX で使用されています。USB/UART で Hello World メッセージを送信するためには、MPSoC デバイスの UART1 を有効にする必要があります。

これらが完了すると、HDL ラッパーを作成し、プロジェクトを構築して、Vitis で使用するためにエクスポートします。

Vitis を使用して、エクスポートした XSA を取り込み、新しい Hello World プロジェクトを作成できます。このプロジェクトにコードを数行追加して、AXI タイマーが周期 500ms、デューティ サイクル 25% の PWM 信号を生成するように設定できます。

 

#include

#include "platform.h"

#include "xil_printf.h"

#include "xtmrctr.h"

#define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID

#define PWM_PERIOD 500000000 /* PWM period in (500 ms) */

#define TMRCTR_0 0 /* Timer 0 ID */

#define TMRCTR_1 1 /* Timer 1 ID */

#define CYCLE_PER_DUTYCYCLE 10 /* Clock cycles per duty cycle */

#define MAX_DUTYCYCLE 100 /* Max duty cycle */

#define DUTYCYCLE_DIVISOR 4 /* Duty cycle Divisor */

 

XTmrCtr TimerCounterInst;

 

int main()

{

    u8 Div;

    u32 Period;

    u32 HighTime;

     init_platform();

 

    print("Hello World\n\r");

    print("Successfully ran Hello World application");

    XTmrCtr_Initialize(&TimerCounterInst, TMRCTR_DEVICE_ID);

 

    Div = DUTYCYCLE_DIVISOR;

    XTmrCtr_PwmDisable(&TimerCounterInst);

        Period = PWM_PERIOD;

        HighTime = PWM_PERIOD / Div--;

        XTmrCtr_PwmConfigure(&TimerCounterInst, Period, HighTime);

        XTmrCtr_PwmEnable(&TimerCounterInst);

        while(1){

    }

 

    cleanup_platform();

    return 0;

}

Kria SOM 上で実行するため、USB JTAG を接続して、アプリケーションをダウンロードし、Vitis のデバッグ環境を使用して実行しました。

Pmod のピン 1 にスコープを接続すると、上記の画面のように正しい周期と正のデューティ サイクルが表示されます。

次回は、Kria に付属のサンプル デザインを再現する方法を紹介します。