アプリケーションノート

Moku Cloud を MathWorks HDL Coder でコンパイルする

Moku:Pro での配置可能な VHDL コードの生成、パート 2 - Simulink

これは、「Moku Cloud Compile with MathWorks HDL Coder」チュートリアルのパート 2 です。パート 1 はこちらからご覧いただけます こちら。パート 2 では、MathWorks の Simulink を使用して、Moku:Pro 上に XNUMX チャネルのシュミット トリガーを構築して展開します。 MATLAB スクリプト アプローチと Simulink モデル アプローチの間の一般的なワークフローは似ていますが、Simulink には、すぐに使用できる追加のファーストパーティ DSP およびテスト ブロックが用意されています。ブロック図ベースの設計方法は、特に複雑なシステムの場合に、DSP ワークフローを構築するためのより直感的な方法を提供します。このチュートリアルでは、最初のチャネルを MATLAB-Simulink ハイブリッド デザインで構築し、XNUMX 番目のチャネルを Simulink ライブラリで構築します。

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


概要

Liquid Instruments の Moku Cloud Compile (MCC) ツールを使用すると、ユーザーは Moku プラットフォームに実装するカスタム機器を設計できます。 CPU および特定用途向け集積回路 (ASIC) ベースの DSP アプローチと比較して、FPGA は、CPU と同様にソフトウェア定義で再プログラム可能でありながら、ASIC レベルの入出力レイテンシを提供します。 FPGA プログラミングは通常、ハードウェア記述言語 (HDL) を使用して行われます。 HDL コーディングの学習曲線は、ソフトウェア プログラミング言語に比べて急勾配になる可能性がありますが、他のプログラミング言語のスクリプトを HDL に変換するために利用できるツールがいくつかあります。チュートリアルのパート I では、MathWorks HDL コーダーを使用して MATLAB スクリプトを Moku:Pro に実装するための HDL コードに変換する方法について説明しました。このパート II では、Simulink モデルから HDL コードを生成する方法を説明します。

Simulink は、MathWorks によって開発されたグラフィカル ベースのモデリング ツールです。ブロック図ベースの設計哲学により、手書きのデジタル信号処理 (DSP) システムをコンピュータベースのモデルに変換するプロセスが合理化されます。波形ジェネレータやオシロスコープなどの仮想テストおよび測定機器は、テストベンチを構築して DSP モデルを検証するためのより直観的な方法を提供します。さらに、ユーザーは Simulink を使用して固定小数点システムを最初から構築するオプションもあります。一部の論理演算は MATLAB 関数を使用して実装する方が簡単です。この場合、ユーザーは MATLAB 関数ブロックを設計に追加できます。より複雑なシステムの場合、両方のツールを利用すると、設計プロセスを大幅に合理化できます。

このチュートリアルでは、2 チャネルのシュミット トリガーを構築します。シュミット トリガーの基本と概念設計については、チュートリアルのパート I を参照してください。最初のチャネルでは、チュートリアルのパート I とまったく同じ MATLAB 関数を使用して DSP を構築します。 2 番目のチャネルでは、Simulink 組み込み DSP ブロックを使用して同じ機能を実現します。


図 1: Moku Cloud Compile + HDL Coder DSP 設計の推奨ワークフロー。

要件

シュミット トリガーの構築と実装を開始する前に、システムが次の要件を満たしていることを確認してください。 Simulink モデルから VHDL コードを生成するには、MATLAB と Simulink、HDL Coder、および固定小数点コンバーターが必要です。注: Mac ユーザーが VHDL コードを生成するには、MATLAB 用の XCode もインストールする必要があります。 VHDL コードをコンパイルするには、Moku Cloud Compile にアクセスする必要があります。コンパイルされた計測器ビットストリームを実装するには、ファームウェア バージョン 551 以降を実行している Moku:Pro、Moku:iPad アプリ、および Moku:Pro のマルチ計測器モードへのアクセスが必要です。

DSPの設計と構築

テンプレートを調整する

モデル作成の最初のステップは、DSP 設計に合わせて Simulink テンプレートを調整することです。私たちの設計は 2 チャンネル システムであるため、InputA、InputB、OutputA、および OutputB ポートのみが必要になります。


図 2: 冗長チャネルの削除

浮動小数点 DSP 設計

このセクションでは、2 つのシュミット トリガーを構築します。最初のチャンネルは MATLAB 関数ブロックを使用し、2 番目のチャンネルは Simulink トリガー ブロックを使用します。

Simulink ビルディング ブロックは、シミュレーション タブの「ライブラリ ブラウザ」にあります。検索機能は、目的の要素を見つけるための最良の方法です。すべての Simulink ブロックが HDL コード生成をサポートしているわけではないことに注意してください。 DSP サブシステム内のすべてのものに対して、「HDL Coder」または「HDL Support」カタログにあるブロックのみを使用することをお勧めします。


図 3: Simulink ビルディング ブロックは、ライブラリ ブラウザーから見つけることができます。

最初のチャネルでは、MATLAB 関数ブロックをモデルに配置します。 MATLAB 関数は浮動小数点モデルであり、Simulink テンプレートではすべての端子のデータ型が事前定義されているため、データ型は一致しません。 MATLAB 関数ブロックの前後に 2 つの「convert」ブロックを配置することで、この問題に対処します。ユーザーは固定小数点アルゴリズムを使用してモデルを設計できますが、モデルに MATLAB 関数ブロックを実装する場合は、浮動小数点から始める方が簡単であることがわかります。 HDL 変換ステップの前に、最初の変換ブロックを削除する必要がある場合があることに注意してください。

シュミット トリガー関数を MATLAB 関数ブロックに追加するには、ブロックをダブルクリックします。関数名を除いて、チュートリアルのパート I と同じ MATLAB 関数を使用します (したがって、MATLAB 関数と Simulink サブシステムに同じ名前は使用しません)。


図 4: MATLAB 関数ベースのシュミット トリガーのブロック図設計。

 

function 出力A = シュミットトリガー(入力A)
%#codegen
永続性 アウト0; %関数呼び出し間で変数値を保持します。
if 空(out0) %最初の呼び出しの値を初期化します。
     アウト0 = 0;
end

upperThreshold = フロア(2^15/10); % 上限しきい値を正の範囲全体の 1/10 に設定します。
lowerThreshold = -floor(2^15/10); %下限しきい値を負の範囲全体の 1/10 に設定します。

if 入力A > 上限閾値 %シュミットトリガ機能を実行するロジック。
     out0 = 2^15-1; %最大の正の数値にマップします。
elseif 入力A
     アウト0 = 0;
end

出力A = 出力0; %変数 out0 を OutputA に割り当てます。

 

2 番目のチャネルでは、Simulink の「Relay」ブロックを使用してシュミット トリガー ロジックを実行します。リレー ブロックを入力 B と出力 B の間に配置し、「リレー」ブロックをダブルクリックして、スイッチのオンとオフのしきい値をそれぞれfloor(15^10/2)と-floor(15^10/XNUMX)に変更しました。 「信号属性」タブで、信号出力を次のように設定します。 fixdt(1, 16,0) 出力と一致するようにします。


図 5: 「リレー」ブロックは、最初のチャネルと同じシュミット トリガー ロジックを実行するように設定されました。

テストベンチを構築する

Simulink には、信号発生器、オシロスコープ、その他の一般的なテストおよび測定機器のブロックが組み込まれています。これにより、より直感的な方法でテストベンチを設計できるようになります。 DSP システムの外部のビルディング ブロックはシミュレーションのみに使用されるため、HDL Coder でサポートされる必要がないことに注意してください。

テストベンチを構築するために、「Signal Generator」ブロックを使用して、パート I でテストベンチに使用したのと同じ信号を生成しました。システムの 16 ビット符号付き入力に一致するように、ジェネレーターからの信号を再スケーリングおよび変換しました。信号を入力に供給する前に、浮動小数点数を固定小数点数に変換するために「Convert」ブロックが追加されました。次に、ジェネレータ信号、OuputA、および OutputB をオシロスコープに入力して、システムの応答を観察しました。


図 6: Simulink ベースのテストベンチのブロック図

システムが構築されたら、シミュレーションを実行して出力を検証します。出力信号が予想どおりであることがわかりました。


図 7: オシロスコープ上の DSP サブシステムの出力。

固定小数点変換

DSP サブシステムの VHDL コードを生成する前に、浮動小数点 MATLAB 関数ブロックを固定小数点関数ブロックに変換する必要があります。これは、「アプリ」タブにある MathWorks の固定小数点ツールと「反復固定小数点変換」メソッドを使用して実現します。最初から固定小数点 DSP を使用して Simulink モデルを構築する場合は、固定小数点変換を実行する必要がないことに注意してください。


図 8: 反復固定小数点変換は、Simulink アプリ タブから開始できます。

次に、ターゲットとして MATLAB 関数を選択し、[範囲を収集] ボタンをクリックして変換プロセスを開始しました。 Simulink は、モデルを変換するための参照としてテストベンチ データ ポイントを使用します。


図 9: MATLAB 関数が「設計中のシステム」として選択されました。

次に、[データ型の提案] ボタンを使用して、Simulink に最適な固定小数点精度を決定させることができます。下部のヒストグラムは、各信号の範囲を表示します。必要に応じて、信号の精度を手動でオーバーライドできます。精度が決定したら、「データ型を適用」ボタンを使用して変換を続行できます。


図 10: (1) テストベンチ データに基づいて信号精度を提案します。 (2) ヒストグラムで信号範囲を観察します。 (3) モデルを固定小数点設計に変換します。 (4) 最初の「convert」ブロックを削除します。

固定小数点変換後、最初の「Convert」ブロックを削除する必要があります。新しい「MATLAB Function」ブロックは、float/double の代わりに固定小数点数を取り込むためです。

固定小数点モデルの検証

モデルの変換後、もう一度シミュレーションを実行して、動作と精度の低下が予想どおりであることを確認することが重要です。

VHDLコード生成

HDLコードは、「HDLコード」タブの「HDLコードの生成」ボタンをクリックすることで生成できます。 HDL Coder の生成設定は Simulink テンプレートですでに構成されているため、ここで設定を調整する必要はありません。


図 11: [HDL コードの生成] ボタンは HDL コード アプリの下にあります。

サードパーティツールを使用した VHDL シミュレーション (オプション)

VHDL テストベンチ ファイルは、HDL コード アプリの下にある [テストベンチの生成] ボタンをクリックして生成できます。検証手順は MATLAB の例と同じです。


図 12: [Generate Testbench] ボタンは HDL コード アプリの下にあります。

DSP のコンパイルと展開

Moku Cloud Compile には、カスタム計測器が Moku:Pro の他の部分と対話できるようにする標準ラッパーが組み込まれています。標準ラッパーは、インストゥルメントの 4 つの入力チャンネルと出力チャンネルをすべて使用します。これは、2 つの入力と 2 つの出力を持つシュミット トリガーの例とは一致しません。したがって、提供されたテンプレートから楽器のカスタム ラッパーを作成する必要があります。

[クロック イネーブルの最小化] オプションが選択されていても、HDL Coder は引き続き次の VHDL コードを生成する場合があることに注意してください。 クロックイネーブル & ce_out ポート (このチュートリアルのように)。接続していきます クロックイネーブル 一定の High 信号を使用し、これらのポートが VHDL 変換プロセス中に作成される場合は、ce_out ポートを開いたままにします。

アーキテクチャ HDLCoderWrapper OF カスタムラッパー IS
-- シグナル宣言
SIGNAL 定数高:std_logic。 :='1';
--コンポーネントの宣言
成分 DSP
ポート(クロック: IN 標準ロジック;
     リセット : IN 標準ロジック;
     clk_enable : IN 標準ロジック;
     入力A: IN 署名済み(15 DOWNTO 0); -- sfix16_En16
     入力B                           : IN 署名済み(15 DOWNTO 0); -- sfix16_En16
     ce_out_0 : OUT 標準ロジック;
     ce_out_1 : OUT 標準ロジック;
     出力A: OUT 署名済み(15 DOWNTO 0); -- sfix16_En14
     出力B: OUT 署名済み(15 DOWNTO 0); -- sfix16_En14
     );
エンドコンポーネント;

ベギン
     u_DSP:DSP
          ポートマップ(クロック => クロック、
               リセット => リセット、
               clk_enable => 定数高、
               入力A => 入力A、
               入力B => 入力B、
               ce_out_0 => 開いた,
               ce_out_1 => 開いた,
               出力A => 出力A、
               出力B => 出力B
          );
終わり HDLCoderWrapper;

計測器のコンパイルと展開

Moku Cloud Compile を使用して計測器のビットストリームを構築し、計測器を展開する方法の詳細な手順については、次のリンクを参照してください。 Moku Cloud Compile スタートガイド.

シュミット トリガーをコンパイルするには、Liquid Instruments の Moku Cloud Compile で新しいプロジェクトを作成します。このプロジェクトでは、シュミット トリガーの VHDL コードである DSP_fixpt.vhd のファイルを作成します。また、前のセクションのカスタム ラッパーのラッパー ファイルも作成します。ターゲット デバイスを 4 スロットの Moku:Pro として選択し、プロジェクトをビルドします。ビットストリームが構築されると、Web インターフェイスと iPad アプリを使用して Moku:Pro にシュミット トリガーを展開できるようになります。

シュミット トリガーが概念設計どおりに機能していることを実証するために、Moku: アプリとマルチ計測器モードを使用して Moku:Pro に計測器を実装しました。スロット 1 には、シュミット トリガへの入力信号としてテストベンチで使用したのと同じ信号を生成する任意波形発生器を配置しました。スロット 2 にはシュミット トリガーを配置しました。スロット 3 には、シュミット トリガと任意波形発生器からの出力信号を比較するためにオシロスコープを配置しました。

まず、MATLAB 関数ブロックを使用して設計されたチャネル A のシュミット トリガーを検証します。入力信号が 110 mV を超えるとシュミット トリガーからの出力が High に切り替わり、信号が -110 mV を下回ってゼロに切り替わるまで待機することが確認できます。


図 13: (a) MATLAB 関数ブロック シュミット トリガーをテストするためのマルチ計測器システム構成。 (b) シュミット トリガが設計どおりに機能していることを確認するオシロスコープ測定。

また、Simulink トリガー ブロックを使用して設計されたチャネル B のシュミット トリガーも検証し、同じ動作を観察しました。


図 14: (a) Simulink トリガー ブロックのシュミット トリガーをテストするためのマルチ計測器システム構成。 (b) シュミット トリガが設計どおりに機能していることを確認するオシロスコープ測定。

最後に、2 つの出力チャンネルを比較し、同じ時点でハイとローに切り替わることを確認できます。


図 15: MATLAB 関数ブロックを使用して設計されたシュミット トリガーとトリガー ブロックは同じ動作をします。

まとめ

チュートリアルのこの第 2 部では、MathWorks の Simulink および HDL Coder を利用して Moku:Pro 上で DSP モデルを構築、検証、展開する方法について説明しました。 MATLAB のみのアプローチと比較して、Simulink では、DSP ライブラリを介して DSP を設計し、固定小数点モデルを使用してモデルを最初から構築するオプションが提供されます。複雑な DSP システムを構築する場合に推奨されます。

コードの利用可能性

このプロジェクトのソースコードは次のコマンドでダウンロードできます。 このリンク.


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

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