HDL コード生成用の Simulink テンプレートの使用
Simulink® の HDL Coder™ モデル テンプレートは、HDL コード生成用のモデルに設計パターンとベスト プラクティスを提供します。いずれかの HDL Coder モデル テンプレートから作成されたモデルには、コンフィギュレーション パラメーターとソルバー設定が HDL コード生成用に設定されています。既存のモデルを HDL コード生成用に構成するには、hdlsetup
を使用します。
HDL Coder モデル テンプレートを使用したモデルの作成
ハードウェアを効率的な HDL コード生成用にモデル化するには、HDL Coder モデル テンプレートを使用したモデルを作成します。
Simulink スタート ページを開きます。MATLAB® の [ホーム] タブで、[Simulink] ボタンを選択します。あるいは、コマンド ラインで次のように入力します。
simulink
[HDL Coder] セクションに、HDL コード生成用に事前設定されているテンプレートがあります。テンプレートを選択すると、Simulink エディターで空のモデルが開きます。モデルを保存するには、[ファイル] 、 [名前を付けて保存] を選択します。
Simulink ライブラリ ブラウザーを開いてから、[HDL Coder] ブロック ライブラリを開くには、Simulink エディターで [ライブラリ ブラウザー] ボタンを選択します。あるいは、コマンド ラインで次のように入力します。
slLibraryBrowser
Simulink ライブラリ ブラウザーをフィルター処理して HDL コード生成をサポートするブロック ライブラリを表示するには、関数
hdllib
を使用します。hdllib
HDL Coder モデル テンプレート
Complex Multiplier
Complex Multiplier テンプレートは、複素数の乗算器アキュムレータをモデル化する方法と、中間段階を手動でパイプライン化する方法を示します。複素数乗算のハードウェア実行は、4 つの乗算器と 2 つの加算器を使用します。
このテンプレートは次のベスト プラクティスを適用します。
[コンフィギュレーション パラメーター] ダイアログ ボックスで、[HDL コード生成] 、 [グローバル設定][リセット タイプ] を
[同期]
に設定します。速度を改善するため、ハードウェア内のレジスタにマッピングする Delay ブロックを乗算器と加算器の入力と出力に配置します。
完全精度の複素数乗算器の出力データをサポートするため、出力データの語長を手動で (
operand_word_length
* 2) + 1 に指定します。たとえば、テンプレートでは、オペランドの語長は 18 で、出力語長は 37 です。
MATLAB Arithmetic
MATLAB Arithmetic テンプレートには、ハードウェア内の DSP48s を推測する MATLAB 算術演算が含まれます。
たとえば、ml_mul_acc
MATLAB Function ブロックは MATLAB 内に積和演算を記述する方法を示します。hdlfimath は HDL コード生成に対して固定小数点の算術設定を適用します。
function y = fcn(u1, u2) % design of a 6x6 multipler % same reset on inputs and outputs % followed by an adder nt = numerictype(0,6,0); nt2 = numerictype(0,12,0); fm = hdlfimath; persistent u1_reg u2_reg mul_reg add_reg; if isempty(u1_reg) u1_reg = fi(0, nt, fm); u2_reg = fi(0, nt, fm); mul_reg = fi(0, nt2, fm); add_reg = fi(0, nt2, fm); end mul = mul_reg; mul_reg = u1_reg * u2_reg; add = add_reg; add_reg(:) = mul+add; u1_reg = u1; u2_reg = u2; y = add;
ROM
ROM テンプレートは、ハードウェア内の ROM にマッピングする設計パターンです。
このテンプレートは次のベスト プラクティスを適用します。
ルックアップ テーブルの出力に、
ResetType
=none
の Delay ブロックを配置します。ルックアップ テーブルは、ブレークポイント間の間隔が 2 のべき乗になるように構成されています。
2 のべき乗のテーブルの次元を使用すると、HDL Coder で除算演算ではなくシフト演算を生成できます。必要に応じて、テーブルにゼロを付加します。
ルックアップ テーブルのエントリ数は 2 のべき乗です。一部の合成ツールでは、エントリ数が 2 のべき乗のルックアップ テーブルによる ROM へのマッピングから、より良い結果が得られます。必要に応じて、テーブルにゼロを付加します。
Register
Register テンプレートは、次のようなハードウェア レジスタをモデル化する方法を示します。
Simulink で Delay ブロックを使用。
MATLAB で永続変数を使用。
この設計パターンは、
cast
を使用してデータ型を自動的に伝播する方法も示します。
MATLAB Function ブロック内の MATLAB コードは、永続変数を使用してレジスタをモデル化します。
function y = fcn(u) % Unit delay implementation that maps to a register in hardware persistent u_d; if isempty(u_d) % defines initial value driven by unit delay at time step 0 u_d = cast(0, 'like', u); end % return delayed input from last sample time hit y = u_d; % store the current input u_d = u;
SRL
SRL テンプレートは、ハードウェア内の SRL16 にマッピングするシフト レジスタの実装方法を示します。同様のパターンを使用して SRL32 にマッピングすることもできます。
シフト レジスタのサブシステムで、Tapped Delay はシフト操作を実装し、MATLAB Function の select_tap
は出力 Mux を実装します。
select_tap
では、0 ベースのアドレス addr
は 1 ずつインクリメントします。これは MATLAB インデックスが 1 ベースだからです。
function dout = fcn(addr, tdelay) %#codegen addr1 = fi(addr+1,0,5,0); dout = tdelay(addr1);
このテンプレートは、ハードウェアの SRL16 にマッピングするための次のベスト プラクティスも適用します。
Tapped Delay ブロックの場合:
[ブロック パラメーター] ダイアログ ボックスで、[出力ベクトル内の現在の入力を含む] を有効にしません。
[HDL ブロック プロパティ] ダイアログ ボックスで、[ResetType] を
[none]
に設定します。
Subsystem ブロックの場合は、[HDL ブロック プロパティ] ダイアログ ボックスで、[FlattenHierarchy] を
[on]
に設定します。
Simulink Hardware Patterns
Simulink Hardware Patterns テンプレートには、一般的なハードウェア操作の設計パターンが含まれています。
シリアルからパラレルへのシフト レジスタ
立ち上がりエッジ検出
立ち下がりエッジ検出
SR ラッチ
RS ラッチ
たとえば、立ち上がりエッジ検出と立ち下がりエッジ検出の設計パターンは次のとおりです。
State Machine in MATLAB
MATLAB テンプレートのステート マシンは、MATLAB Function ブロックを使用した Mealy および Moore ステート マシンの実装方法を示します。
ステート マシンをモデル化する場合のベスト プラクティスの詳細は、HDL コード生成および SystemC コード生成のステート マシンのモデル化を参照してください。