概要
Liquid Instruments の Moku Cloud Compile (MCC) ツールを使用すると、Moku プラットフォームに実装するためのカスタム計測器を設計できます。CPU やアプリケーション固有集積回路 (ASIC) ベースの DSP アプローチと比較して、FPGA は、CPU のようにソフトウェア定義で再プログラム可能であると同時に、ASIC レベルの入出力レイテンシを提供します。FPGA プログラミングは通常、ハードウェア記述言語 (HDL) を使用して行われます。HDL コーディングの学習曲線は、ソフトウェア プログラミング言語と比較して急峻になる可能性がありますが、他のプログラミング言語のスクリプトを HDL に変換するためのツールがいくつかあります。チュートリアルのパート I では、MathWorks HDL coder を使用して 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、Fixed-Point Converterが必要です。注:Macユーザーは、MATLABでVHDLコードを生成するためにXCodeもインストールする必要があります。VHDLコードをコンパイルするには、Moku Cloud Compileにアクセスできる必要があります。コンパイルされた計測器ビットストリームを実装するには、ファームウェアバージョン601以上を実行しているMoku:Pro、Moku:アプリ、および マルチインストゥルメントモード Moku:Pro で。DSPの設計と構築
テンプレートを調整する
モデル作成の最初のステップは、DSP 設計に合わせて Simulink テンプレートを調整することです。私たちの設計は 2 チャンネル システムであるため、InputA、InputB、OutputA、および OutputB ポートのみが必要になります。
図 2: 冗長チャネルを削除します。
浮動小数点 DSP 設計
このセクションでは、2つのシュミットトリガを構築します。1つ目のチャネルはMATLAB関数ブロックを使用し、2つ目のチャネルはSimulinkトリガブロックを使用します。Simulinkのビルディングブロックは、「ライブラリブラウザー」の「シミュレーション」タブにあります。目的の要素を見つけるには、検索機能を使用するのが最適です。すべてのSimulinkブロックがHDLコード生成をサポートしているわけではないことに注意してください。DSPサブシステム内のすべての処理には、「HDLコーダー」または「HDLサポート」カタログのブロックのみを使用することをお勧めします。
図 3: 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でサポートする必要はありません。テストベンチを構築するために、「信号発生器」ブロックを使用して、パートIのテストベンチで使用したのと同じ信号を生成しました。発生器からの信号を再スケーリングして、システムの16ビット符号付き入力に合うように変換しました。信号を入力に入力する前に、浮動小数点数を固定小数点数に変換するために、「変換」ブロックを追加しました。次に、発生器信号、出力A、出力Bをオシロスコープに入力して、システムの応答を観察しました。
図 6: Simulink ベースのテストベンチのブロック図。
図 7: オシロスコープ上の DSP サブシステムの出力。
固定小数点変換
DSP サブシステムの VHDL コードを生成する前に、浮動小数点 MATLAB 関数ブロックを固定小数点関数ブロックに変換する必要があります。これは、「アプリ」タブにある MathWorks の固定小数点ツールと「反復固定小数点変換」メソッドを使用して実現します。最初から固定小数点 DSP を使用して Simulink モデルを構築する場合は、固定小数点変換を実行する必要がないことに注意してください。
図 8: 反復固定小数点変換は、Simulink アプリ タブから開始できます。
図 9: MATLAB 関数が「設計対象システム」として選択されました。
図 10: (1) テストベンチ データに基づいて信号精度を提案します。 (2) ヒストグラムで信号範囲を観察します。 (3) モデルを固定小数点設計に変換します。 (4) 最初の「convert」ブロックを削除します。
固定小数点モデルの検証
モデルの変換後、もう一度シミュレーションを実行して、動作と精度の低下が予想どおりであることを確認することが重要です。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コードを生成する場合があることに注意してください。 クロックイネーブル (NAIST) と 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 インターフェイスと Moku: アプリを使用して、Moku:Pro にシュミットトリガーをデプロイできるようになります。シュミットトリガーが概念設計どおりに機能していることを実証するために、Moku: アプリとマルチ インストゥルメント モードを使用して、Moku:Pro に計測器を実装しました。スロット 1 には、テスト ベンチで使用したのと同じ信号をシュミットトリガーへの入力信号として生成する任意波形発生器を配置しました。スロット 2 には、シュミットトリガーを配置しました。スロット3には、シュミットトリガと任意波形発生器の出力信号を比較するためにオシロスコープを設置しました。まず、MATLAB関数ブロックで設計したチャンネルAのシュミットトリガを検証します。入力信号が110mVを超えるとシュミットトリガの出力がハイに切り替わり、信号が-110mVを下回るまで待機してからゼロに切り替わることを確認できます。
図 13: (a) MATLAB 関数ブロックのシュミット トリガをテストするための複数の計測器システム構成。 (b) シュミット トリガが設計どおりに機能していることを確認するオシロスコープ測定。
図 14: (a) Simulink トリガー ブロックのシュミット トリガーをテストするためのマルチ計測器システム構成。 (b) シュミット トリガーが設計どおりに機能していることを確認するオシロスコープ測定。
図 15: MATLAB 関数ブロックを使用して設計されたシュミット トリガーとトリガー ブロックは同じ動作をします。



