Main Content

HDL コード生成用の Simulink テンプレートの使用

Simulink® の HDL Coder™ モデル テンプレートは、HDL コード生成用のモデルに設計パターンとベスト プラクティスを提供します。いずれかの HDL Coder モデル テンプレートから作成されたモデルには、コンフィギュレーション パラメーターとソルバー設定が HDL コード生成用に設定されています。既存のモデルを HDL コード生成用に構成するには、hdlsetup を使用します。

HDL Coder モデル テンプレートを使用したモデルの作成

ハードウェアを効率的な HDL コード生成用にモデル化するには、HDL Coder モデル テンプレートを使用したモデルを作成します。

  1. Simulink スタート ページを開きます。MATLAB® の [ホーム] タブで、[Simulink] ボタンを選択します。あるいは、コマンド ラインで次のように入力します。

    simulink

  2. [HDL Coder] セクションに、HDL コード生成用に事前設定されているテンプレートがあります。テンプレートを選択すると、Simulink エディターで空のモデルが開きます。モデルを保存するには、[ファイル][名前を付けて保存] を選択します。

  3. 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 Functionselect_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);
生成されたコードでは Verilog®SystemVerilog および VHDL® は 0 ベースなので、HDL Coder は自動的にこのインクリメントを省略します。

このテンプレートは、ハードウェアの 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 コード生成のステート マシンのモデル化を参照してください。

参考

|

関連するトピック