メインコンテンツ

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 です。

Simulink Template of Complex Multiplier.

Complex multiplier model. The model contains four multiplier blocks, top two multiplier blocks computes multiplication of real part and bottom two multiplier computes multiplication of imaginary part.

MATLAB Arithmetic

MATLAB Arithmetic テンプレートには、ハードウェア内の DSP48s を推測する MATLAB 算術演算が含まれます。

Simulink Template of MATLAB Arithmetic System

MATLAB Arithmetic model that has five MATLAB Function blocks.

たとえば、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 へのマッピングから、より良い結果が得られます。必要に応じて、テーブルにゼロを付加します。

Simulink template of Read-Only Memory System

LUT Based Read only memory system, which has a Direct Lookup Table block followed by a Delay block.

Register

Register テンプレートは、次のようなハードウェア レジスタをモデル化する方法を示します。

  • Simulink で Delay ブロックを使用。

  • MATLAB で永続変数を使用。

    この設計パターンは、cast を使用してデータ型を自動的に伝播する方法も示します。

Simulink Template of Register

Simulink model that has MATLAB Function block and Unit Delay block.

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 にマッピングすることもできます。

Simulink template for SRL system

SRL Subsystem that has MATLAB function block named select_tap.

シフト レジスタのサブシステムで、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 ラッチ

Simulink Hardware Pattern Template

Simulink Hardware Pattern Subsystem. A subsystem contains five subsystems named, shift_reg, detect_rising_edge, detect_falling_edge, SR_latch, and RS_latch.

たとえば、立ち上がりエッジ検出と立ち下がりエッジ検出の設計パターンは次のとおりです。

detect_rising_edge subsystem

detect_falling_edge subsystem

State Machine in MATLAB

MATLAB テンプレートのステート マシンは、MATLAB Function ブロックを使用した Mealy および Moore ステート マシンの実装方法を示します。

Simulink Template for State Machine

ステート マシンをモデル化する場合のベスト プラクティスの詳細は、HDL コード生成および高位合成コード生成のステート マシンのモデル化を参照してください。

参考

|

トピック