Main Content

永続配列と dsp.Delay オブジェクトの RAM へのマッピング

永続配列と dsp.Delay オブジェクトをハードウェアの RAM にマッピングして、ターゲット デバイス上の使用面積を削減します。一般的な RAM マッピングの詳細については、Apply RAM Mapping to Optimize Areaを参照してください。

RAM マッピングの有効化

  1. HDL ワークフロー アドバイザーの左側のペインで [HDL ワークフロー アドバイザー][HDL コード生成] をクリックします。その後、[最適化] タブをクリックします。

  2. [永続配列変数を RAM にマッピング] を選択します。

  3. [RAM マッピングのしきい値] を次のいずれかに設定します。

    • RAM にマッピングする永続配列、ユーザー定義 System object™ のプライベート プロパティ、または dsp.Delay オブジェクトの最小 RAM サイズを指定する整数。

    • RAM にマッピングするデータの形状を定義する 2 つのしきい値を指定する MxN の形式の string。ここで、M は遅延の長さ (遅延の場合) または配列サイズ (永続配列変数の場合)、N はデータ型の語長またはビット幅です。両方のしきい値を設定すると、ターゲット ハードウェアのブロック RAM に効率的にマッピングされない遅延または永続配列が RAM マッピングの対象から除外されます。

永続配列と System object のプロパティに対する RAM マッピングの要件

次の表では、永続配列とユーザー定義 System object のプライベート プロパティに対する RAM マッピング動作の概要を説明します。

[永続配列変数を RAM にマッピング] の設定マッピングの動作

オン

RAM にマップします。制限事項は、RAM マッピングの制限を参照してください。

オフ

生成された HDL コードのレジスタにマップします。

RAM マッピングの制限

RAM マッピングを有効にした場合、次の条件がすべて満たされたときに、永続配列またはユーザー定義 System object のプライベート プロパティがブロック RAM にマッピングされます。

  • それぞれの読み取りまたは書き込みアクセス権限が、単一の要素のみを対象としている。たとえば、部分行列のアクセスおよび配列のコピーはサポートされません。

  • アドレスの計算ロジックが読み取りに依存しない。たとえば、配列から読み取られたデータを使用した読み取りまたは書き込みアドレスの計算はサポートされません。

  • 永続変数またはユーザー定義 System object のプライベート プロパティに循環依存がある場合、0 に初期化される。たとえば、2 つの永続変数 A と B がある場合、A が B に依存し、B が A に依存していれば循環依存があります。

  • アクセスが条件付きステートメント内の場合、条件付きステートメントは簡単な論理式 (&&||~) または関係演算子のみを使用している。たとえば、次のコードの r1 は RAM にマッピングされません。

    if (mod(i,2) > 0)
        a = r1(u);
    else
        r1(i) = u;
    end 

    関数を呼び出す条件などの複雑な条件は、それらを一時変数に代入し、その一時変数を条件付きステートメント内で使用するように書き換えることができます。たとえば、r1 を RAM にマッピングするには、前述のコードを次のように書き換えます。

    temp = mod(i,2);
    if (temp > 0)
        a = r1(u);
    else
        r1(i) = u;
    end 

  • 永続配列またはユーザー定義 System object のプライベート プロパティの値が外部入力に依存している。

    たとえば、次のコードでは bigarrayu に依存していないため、RAM にマッピングされません。

    function z = foo(u)
    
    persistent cnt bigarray
    if isempty(cnt)
        cnt = fi(0,1,16,10,hdlfimath);
        bigarray = uint8(zeros(1024,1));
    end
    z = u + cnt;
    idx = uint8(cnt);
    temp = bigarray(idx+1);
    cnt(:) = cnt + fi(1,1,16,0,hdlfimath) + temp;
    bigarray(idx+1) = idx; 

  • RAM サイズが RAMMappingThreshold の値以上である。RAM サイズは Array Size * Word Length * Complexity の積です。ここで、次のようになります。

    • Array Size は配列内の要素数です。

    • Word Length は、配列のデータ型を表すビット数です。

    • Complexity は、複素数データ型の場合は 2、実数データ型の場合は 1 です。

  • RAM にマッピングする永続変数へのアクセスが、ループを展開しない限り、for ループなどのループ内にない。詳細については、coder.unroll を参照してください。

  • RAM にマッピングする永続変数へのアクセスが、入れ子にされた if ステートメントや入れ子にされた switch ステートメントなどの入れ子にされた条件付きステートメント内にない。

上記の条件のいずれかが満たされていない場合、永続配列またはユーザー定義 System object のプライベート プロパティは、HDL コード内のレジスタにマップされます。

dsp.Delay System Objects に対する RAM マッピングの要件

次の表は、dsp.Delay System object の RAM マッピングの動作について説明したものです。

[永続配列変数を RAM にマッピング] オプションマッピングの動作

オン

次の条件がすべて真であれば、dsp.Delay System object はブロック RAM にマッピングされます。

  • Length プロパティが 4 より大きい。

  • InitialConditions プロパティが 0。

  • 遅延入力データ型が次の型のいずれかである。

    • 浮動小数点データ型ではない実数スカラー

    • 浮動小数点ではない実数部と虚数部をもつ複素数スカラー

    • 各要素が浮動小数点ではない実数スカラーまたは複素数スカラーであるベクトル

  • RAM サイズが [RAM マッピングのしきい値] の値以上である。RAM サイズは DelayLength * WordLength* VectorLength * Complexity の積です。ここで、次のようになります。

    • DelayLength は、遅延の数です。

    • WordLength は、入力データ型を表すビット数です。

    • VectorLength は、遅延への入力のベクトル長です。

    • Complexity は、複素数データ型の場合は 2、実数データ型の場合は 1 です。

これらの条件のいずれかが偽である場合は、dsp.Delay System object は HDL コードでレジスタにマッピングされます。

オフ

dsp.Delay System object は生成される HDL コードでレジスタにマッピングされます。

RAM マッピングの比較

hdl.RAM オブジェクト、dsp.Delay オブジェクト、永続配列変数およびユーザー定義 System object のプライベート プロパティは RAM にマップできますが、異なる属性をもちます。次の表は、それらの違いをまとめたものです。

属性hdl.RAM オブジェクトdsp.Delay オブジェクト 永続配列および
ユーザー定義 System object のプロパティ
RAM マッピングの条件無条件で RAM にマッピング特定の条件で HDL コードで RAM にマッピング。dsp.Delay System Objects に対する RAM マッピングの要件を参照。特定の条件で HDL コードで RAM にマッピング。永続配列と System object のプロパティに対する RAM マッピングの要件を参照。
アドレスの生成と端子のマッピングユーザー指定自動自動
アクセスのスケジューリングユーザー指定自動的に推定自動的に推定
オーバークロックなしなしアクセス スケジュールで必要な場合はローカル マルチレート。
MATLAB® でのシミュレーションに対するレイテンシ00ローカル マルチレートで 2 サイクル、それ以外は 1 サイクル
RAM タイプユーザー指定デュアル ポートデュアル ポート

関連するトピック