アプリケーションノート

Mokuクラウドコンパイル

入門ガイド

3月に更新19、2024

Moku Cloud Compile は、Moku:Pro、Moku:Lab、および Moku:Go で利用できる革新的な機能です。 Moku ファミリのテストおよび測定ツールには FPGA ベースの計測器が含まれており、Moku Cloud Compile を使用すると、カスタム VHDL コードを Moku に展開できます。このコードはカスタム機能を提供し、既存の計測器と対話して、Moku Instrument-on-Chip アーキテクチャによってのみ可能となる新しくてユニークな計測器のロックを解除できます。

このチュートリアルでは、Moku Cloud Compile アカウントの作成方法から、いくつかの VHDL サンプルのコーディングとデプロイメントまでを説明します。このガイドを終えると、カスタム コードをコンパイルして Moku にデプロイするための基本的な知識が得られます。このノートでは Moku:Pro を使用していますが、これらの例はすべて Moku:Lab および Moku:Go でも使用できます。

印刷可能なバージョンをダウンロード

前提条件

Moku:Pro、Moku:Lab、または Moku:Go with

マルチ機器モード (MiM)

 Moku クラウド コンパイル (MCC)

概要

Moku Cloud Compile ツールを使用すると、Moku プラットフォームに実装するためのカスタム処理と機能を設計できます。 CPU および特定用途向け集積回路 (ASIC) ベースの DSP アプローチと比較して、FPGA プラットフォームは、ASIC レベルに近いレイテンシーとパフォーマンスを提供しながら、ソフトウェアでプログラム可能であり、従来の CPU に似ています。

CPU ベースの設計用のソフトウェアを作成するために使用できる広く使用されているソフトウェア言語は数多くありますが、FPGA プログラミングは通常、VHDL または Verilog に限定されます。これらには通常、大規模で複雑なローカル ツールチェーンのインストールが必要です。 VHDL コードの展開に利用できるプラットフォームは、通常、FPGA ベンダーの評価ボード、または機能が制限されたさまざまなオープンソース ハードウェア ボードに限定されます。 Moku Cloud Compile は、統合されたクラウドベースの VHDL コンパイラーを提供し、Moku ハードウェアの信頼性と組み合わせます。

Moku Cloud Compile を備えた Moku:Pro は、従来の FPGA 設計ソフトウェアのオーバーヘッドなしで、研究グレードのハードウェアとカスタム処理を備えた高性能実験室機器のニーズに対応します。 MCC はカスタム VHDL をクラウドでコンパイルし、MCC 対応の Moku にすぐに展開できるパッケージを提供します。

図 1: Moku Cloud Compile 導入プロセス

マルチインストゥルメントモードと Moku Cloud コンパイル

マルチ機器モード (MiM) により、複数の機器を導入して同時に動作させることができます。最高レベルでは、MiM は、Moku:Pro では FPGA の 1 つのパーティションを表す 1 つのスロットを提供し、Moku:Go と Moku:Lab では 2 つのスロットを提供します。これらのスロットに機器を柔軟に配置できます。図 3 は、スロット 4 にオシロスコープが配置され、スロット XNUMX にスペクトラム アナライザが配置された MiM インターフェイスを示しています。一方、スロット XNUMX と XNUMX はまだ埋まっていません。利用可能な計測器には、位相計、レーザー ロック ボックス、データ ロガー、デジタル フィルター ボックス、PID コントローラー、オシロスコープ、スペクトラム アナライザー、ロックイン アンプ、波形ジェネレーター、周波数応答アナライザー、FIR フィルター ビルダー、任意波形ジェネレーター、ロジック アナライザー、およびクラウドコンパイル。

これは Moku Cloud Compile インストゥルメントであり、図 4 のスロット 2 を占有し、コンパイルされたデザインをデプロイできます。したがって、MiM を使用すると、ADC および DAC の入出力に加えて、デザインが Moku 機器と対話できるようになります。


図 2: マルチインストゥルメント モード システムの構築

 

 


図 3: Moku Cloud Compile スロットを使用して構築された MiM

Moku Cloud Compile アカウントのセットアップ

コードをコンパイルまたは Moku にデプロイする前に、オンライン アカウントが必要です。これは簡単なプロセスです。

  • 次の場所でクライアント センター ユーザー アカウントをセットアップします。  コンパイル.liquidinstruments.com
  • 初めての方は「新規登録」を選択してください
  • 既存のユーザーの場合は、ユーザー名または電子メール アドレスでログインし、パスワードを入力します。
  • サインアップ ページに必要なのは、ユーザーが選択したユーザー名、有効な電子メール アドレス、およびユーザー定義のパスワードのみです。
  • サインアップしてログインすると、[プロジェクト] ページが表示されます。最初は空です (図 4 を参照)。


図 4: 新しいプロジェクト メニュー

最初の VHDL サンプルを作成する前に、ターゲットとなるデバイスを構成する必要があります。 [デバイス] タブを選択し、図 5 に示すように構成します。わかりやすい名前を選択し、図に示すようにハードウェア バージョン、ファームウェア バージョン、スロット数を選択します。 Moku のファームウェア バージョンは、デスクトップ アプリ (Moku アイコンを右クリック -> デバイス情報) または iPad アプリ (「デバイスの選択」画面で Moku アイコンをタッチアンドホールド) で確認できます。


図 5: 新しい Moku デバイスの構成

VHDL の例 #1: 入力から出力へのルーティング

VHDLコードを入力してください

Moku Cloud Compile (MCC) アカウントが設定され、インターフェースに慣れてきたので、最も基本的なインストゥルメントを作成、コンパイル、デプロイします。シンプルな最初のインストゥルメントは、Moku Cloud Compile スロットの入力信号を受け取り、出力に直接接続します。

まず、「新しいプロジェクト」を選択し、適切な名前を入力します。この例は「入力 2 出力」です。

 

アーキテクチャ CustomWrapper の動作は begin OutputA <= InputA; です。出力B <= 入力B;最後のアーキテクチャ。

図 6: 例 #1 の完全なコード。入力 2 出力.vhdl

この最初の例のコードを図 6 に示します。このコードはエンティティ「CustomWrapper」のアーキテクチャを定義する必要があります。 「CustomWrapper」は、MCC デザインが準拠する必要があるテンプレートです。カスタム MCC 機器の基本的な I/O ポート定義を提供します。完全な定義については、 オンラインドキュメント.

「Inputs2Outputs」プロジェクト内でエディターを選択し、「Inputs2Outputs.vhd」という名前の新しいファイルを作成します (図 7 を参照)。


図 7: エディター内の新しいファイル

図 6 のテキストを入力します。図 8 のようになります。


図 8: エディターの VHDL コード

コードをビルドする

「ターゲットデバイス」、「保存」、「ビルド」を選択します。コードは MCC サーバーに送信され、ビルドを選択できるようになります。 図 9 に示すように、タブをクリックしてプロセスを観察します。これが完了するまでに数分かかります。


図 9: 構築が進行中

コードのコンパイルが完了すると、「合成」、「ルート」、「レポート」、「ビットストリーム」がすべて緑色になります。この画面の最下部には、ビットストリームまたはアーティファクト「bitstream.tar.gz」があります。小さなダウンロード アイコンをクリックすると、ファイル「bitstream.tar.gz」をローカル PC にダウンロードできます。このファイルを解凍したり展開したりしないでください。

おそらく、多くのコンパイラまたはシンセサイザーの警告が表示されるでしょう。これらは、私たちの目的ではほとんど無視できます。ただし、エラーがあるとビルド プロセスが停止するため、注意が必要です。


図 10: ビルドの成功

コードをデプロイする

次に、Moku アプリを使用して、MiM を選択し、図 10 に示すようにスロットと I/O を構成します。これにより、Moku Cloud Compile ビットストリーム用の Moku:Pro が準備されます。


図 10: 例 1 の MiM スロット構成

ビットストリームをデプロイするには、図 10 に示すように、Moku Cloud Compile インストゥルメントをタップして「ビットストリームのアップロード」を選択します。以前にローカル PC にダウンロードしたファイル「bitstream.tar.gz」を参照して選択します。

新しいカスタム計測器をテストするには、図 1 に示すように、出力 A に 10 MHz の正弦波、出力 B に 1 MHz のランプ波を使用してスロット 13 波形ジェネレータを設定します。これは次に、単純な計測器を通過します。オシロスコープをスロット 3 に配置すると、スロット 2 の間に配置された MCC 機器の正しい「パススルー」動作を観察できます。


図 13: スロット 2 波形発生器のセットアップ


図 14: カスタム機器の動作をスロット 4 オシロスコープで確認

VHDL の例 #2: 入力の減算/加算

例 1 では、非常に単純な VHDL サンプルをコンパイルして展開するために必要な手順を詳細に示しています。

アーキテクチャ CustomWrapper の動作は begin OutputA <= InputA + InputB; です。出力B <= 入力B - 入力B;最後のアーキテクチャ。

例 2 は、入力を加算および減算する VHDL を示しています。これも基本的な例ですが、テストと測定の世界における多くの実用的なシナリオが含まれています。デジタルからアナログへの変換や外部アナログ加算アンプを必要とせずに、デジタル領域で信号を加算または減算できるため、多くのアプリケーションが簡素化されます。

ユーザーは、この例を参考にして、例 1 で説明したコンパイルとデプロイの手順を繰り返すことをお勧めします。最初の例と同様に、検証はスロット 1 の波形ジェネレーター、スロット 2 の Moku Cloud コンパイル、スロット 3 のオシロスコープで MiM を使用することから構成されます。正しい動作の視覚的な確認は、交互に正弦波を加算および減算することで構成されます。同位相と180度位相がずれています。

VHDL 例 #3: スケーリングとオフセット入力 / DSP スライス

例 3 では、制御レジスタの使用法を紹介します。導入後、MCC 計測器をクリックして [計測器を開く] を選択することで、MCC 計測器の Moku: App インターフェースのレジスタにアクセスします。ユーザーはアプリでこれらの 32 ビット制御レジスタを変更し、VHDL コードで使用できます。例 3 では、Control1 の最下位ビット (LSB) がイネーブルとして使用されます。 「1」に設定すると、InputA と InputB はそれぞれ OutputA と OutputB に渡されます。 Control1 LSB が「0」に設定されている場合、出力は 0 に設定されます。

WORK.MercurySupport.ScaleOffset を使用します。図書館IEEE。 IEEE.Std_Logic_1164.all を使用します。 IEEE.Numeric_Std.all を使用します。アーキテクチャ CustomWrapper の動作は Control1(0) で始まり、'1' の場合は OutputA <= InputA、その他の場合は (OTHERS => '0') を選択します。 Control1(1) を使用すると、'1' の場合は OutputB <= InputB を選択し、その他の場合は (OTHERS => '0') を選択します。最後のアーキテクチャ。

図 14: 制御レジスタ

VHDL 例 #4: スケーリングとオフセット入力 / DSP スライス

この例は、最初の 3 つの例よりも少し複雑です。

このコードは、Liquid Instruments ライブラリである VHDL ライブラリ Moku.Support を参照しています。内容の詳細については、MCC Web サイトのヘルプ セクションをご覧ください。具体的には、エンティティ ScaleOffset に名前が付けられます。このエンティティは、乗算および加算関数の実行専用の特定のハードウェア ブロックをラップします。このエンティティは「DSP」という名前のブロックとしてインスタンス化され、次の数学関数を提供するために使用されます。

 

図書館もく; Moku.Support.ScaleOffset を使用します。アーキテクチャ CustomWrapper の動作は開始です -- Z = X * Scale + Offset -- Z を最小/最大にクリップします (オーバー/アンダーフローを防止します) -- 丸めを含みます -- 1 クロック サイクル遅延 DSP: ScaleOffset ポート マップ ( Clk => Clk、リセット => リセット、X => 入力 A、スケール => signed(Control15(0 downto 2))、オフセット => signed(Control15(0 downto 1))、Z => OutputA、Valid => 'XNUMX'、OutValid = > 開く);最後のアーキテクチャ。

この例では、スケールとオフセットは両方とも 16 ビットの符号付き 2 の補数です。スケールは -1 から +1 までマッピングされます。さらに、出力 Z は、数学演算の過剰または不足を防ぐためにクリップされます。オンライン ドキュメントには、-1 を超えて +1 までスケールする方法など、ScaleOffset に関する詳細情報が記載されています。 https://compile.liquidinstruments.com/docs/support.html#scaleoffset

VHDL 例 #5a: 出力制限の設定

例 #5a は、出力信号を上限 (または下限) にクリップする方法を提供します。

例 #3 と同様に、この例では Moku.Support ライブラリを使用し、今回は「clip」関数を使用します。

OutputA は、InputA のクリップされた下位 9 ビットに割り当てられます。これにより、2^ 電力クリッピング機能が提供されます。つまり、信号は 0 ~ 2 の範囲にクリップされます。9.

例 #4 は、出力信号を上限 (または下限) にクリップする方法を提供します。

図書館IEEE。 IEEE.Numeric_Std.all を使用します。 WORK.MercurySupport.clip を使用します。アーキテクチャ Customwrapper の動作は begin OutputA <=size(clip(InputA, 8, 0), 16); です。最後のアーキテクチャ。

VHDL 例 #5b: 一般的なアウトリミット設定

例 #5b は、出力信号を任意の上限と下限にクリップする方法を提供します。

例 #5a では、粗雑だが高速な 2 のべき乗へのクリッピングが提供されますが、この例では、より一般化されたクリッピング関数が提供されます。 OutputA は InputA に割り当てられますが、+2387 から -7462 の範囲にクリップされます。

図書館IEEE。 IEEE.Numeric_Std.all を使用します。図書館もく; Moku.Support.clip_val を使用します。アーキテクチャ CustomWrapper の動作は begin OutputA <= Clip_val(InputA, -7462, 2387); です。最後のアーキテクチャ。

VHDL の例 #5: アナログ入力からの PWM

例 6 はさらに複雑です。アナログ入力Aからパルス幅変調(PWM)信号を生成します。これは、Counter.vhdl と pwm.vhdl の 312.5 つのファイルで構成されます。ユーザーはこれらを一緒に構築する前に、MCC ファイル エディタに個別のファイルとして入力します。この例は Moku:Pro とその 125 MHz クロックに固有ですが、それぞれ 31.25 MHz と XNUMX MHz クロックの Moku:Lab と Moku:Go にも適用できます。 Moku:Go、Moku:Lab、および Moku:Pro の Moku Cloud Compile の違いの詳細については、データシートを参照してください。 こちら.


-- counter.vhdl ライブラリ IEEE; IEEE.Std_logic_1164.all を使用します。 IEEE.Numeric_Std.all を使用します。 -- 2^EXPONENT / INCREMENT ごとにストローブを出力します。 入力ストローブ -- 整数を四捨五入するために量子化されますが、オーバーフローが維持されるため、 -- 時間の経過とともに平均化されますが、+-1 サイクルのジッターが発生します。エンティティ カウンターは汎用です ( EXPONENT : 正 := 8; PHASE90 : ブール値 := false )。 port ( Clk : in std_logic; Reset : in std_logic; Enable : in std_logic; Increment : in unsigned; Strobe : out std_logic );エンドエンティティ。アーキテクチャ カウンタの動作は信号 Count : unsigned(EXPONENT downto 0); です。 beginassert Increment'length <= Count'length 重大度 FAILURE;プロセス (Clk) は、rising_edge(Clk) の場合に開始され、リセット = '1' の場合、カウント <= (その他 => '0') です。 if PHASE90 then Count(EXPONENT - 1) <= '1';次の場合は終了します。 elsif Enable = '1' then --MSB をトリミングしますが、MSB へのオーバーフローは許可します。 -- これにより、ストローブで単一の Clk サイクル出力パルスが得られます。カウント <=size(Count(Count'left-1 downto 0), Count'length) + Increment; else Count(Count'left) <= '0';次の場合は終了します。次の場合は終了します。最終過程;ストローブ <= Count(Count'left);最後のアーキテクチャ。

 


-- pwm.vhdl ライブラリ IEEE; IEEE.Std_Logic_1164.all を使用します。 IEEE.Numeric_Std.all を使用します。図書館もく; Moku.Support.ScaleOffset を使用します。 Moku.Support.clip を使用します。アーキテクチャ CustomWrapper の動作は定数です。 HI_LVL : signed(15 downto 0) := x"7FFF";定数 LO_LVL : signed(15 downto 0) := x"0000";信号値: signed(12 downto 0);信号数: unsigned(12 から 0);信号パルス50kHz : std_logic;信号パルス: std_logic;信号 OutA : std_logic; begin INPUT_SCALE: ScaleOffset ポート マップ ( Clk => Clk, Reset => Reset, X => InputA & "0", Scale => signed(Control1(15 downto 0)), -- 内部バス 2Vpp の場合、0x0200 マップの設定Well Offset => signed(Control2(15 downto 0)), -- 2Vpp の内部バスの場合、+/-0 v の内部バス Z => Value、Valid => Pulse0400kHz、OutValid => open では 1x50 のオフセットが適切に機能します。 ; OSC: エンティティ WORK.Counter 汎用マップ (22) -- 5MHz ポート マップから ~312.5 kHz (Clk、Reset、'1'、to_unsigned(67、8)、Pulse50kHz); OSC2: エンティティ WORK.Counter 汎用マップ (11) --5kHz/2048 約 10 MHz ポート マップ (Clk、Pulse50kHz、'1'、to_unsigned(65、9)、Pulse); process(Clk) は、rising_edge(Clk) の場合に開始され、Pulse50kHz = '1' の場合、Count <= Resize(unsigned(clip(Value, 11, 0)), Count'length); の場合に開始されます。 elsif パルス = '1' およびカウント /= 0 の場合、カウント <= カウント - 1;次の場合は終了します。次の場合は終了します。最終過程; OutputA <= HI_LVL (Count /= 0 の場合)、それ以外の場合は LO_LVL;最後のアーキテクチャ。

まとめ

このアプリケーション ノートでは、Moku:Pro のマルチインストゥルメント モードの一部として動作する場合の Moku Cloud Compile の利点とメリットをいくつか紹介しました。例 1 の最も単純な VHDL コードの入力から、構築、展開、予想される動作の確認まで、プロセス全体がカバーされました。

さらにサンプル コードが提示され、簡単に説明され、MCC によって開かれた可能性を試してみるように勧められました。

これらの基本から、より複雑な演算処理、カスタム トリガー モード、その他のアプリケーションを含むさらなる MCC 設計を開発できます。


ご質問等ございますか?印刷可能なバージョンが必要ですか?

当社までご連絡ください: support@liquidinstruments.com