Main Content

生成された VHDL コードのベクトル端子のスカラー化

この例では、Simulink® モデルのベクトル信号をフラットにして、生成された VHDL® コードのスカラー信号の構造体にする方法を示します。

ベクトル端子のスカラー化の指定

Verilog コードを生成するときに、既定では、ベクトル信号はスカラーにフラット化されます。VHDL コードを生成するとき、ベクトル信号をモデル全体で、または DUT レベルでフラットにするかを指定できます。ベクトル端子を DUT レベルのみでフラットにすると、特に多くのベクトル入力をもつ大規模なモデルの場合はコード生成が高速になります。

MATLAB® および Simulink から HDL コードを生成するときに、ベクトル端子をスカラーにスカラー化できます。MATLAB® から HDL へのワークフローについては、[HDL コード生成] タスクの [クロックと端子] タブで [端子のスカラー化] を [dutlevel] または [on] に設定します。

Simulink モデルの HDL コードを生成するときにベクトル端子をスカラー化するには、次を実行します。

  • [コンフィギュレーション パラメーター] ダイアログ ボックスの [HDL コード生成]、[グローバル設定]、[端子] タブで、[端子のスカラー化] パラメーターを [dutlevel] または [on] に設定します。

  • HDL ワークフロー アドバイザーの [HDL コード生成]、[コード生成オプションを設定]、[詳細オプションを設定]、[端子] タブで、Scalarize portsパラメーターを dutlevel または on に設定します。

  • MATLAB コマンド プロンプトで、hdlset_param または makehdl を使用して、ScalarizePorts プロパティを on または dutlevel に設定します。

ベクトル和モデル

ベクトル端子のフラット化を確認するには、モデル hdlcoder_hdlcoder_vector_sum_nested を開きます。モデルは、幅が 10 のベクトル入力により駆動されます。またモデルにはスカラー出力があります。

open_system('hdlcoder_vector_sum_nested')
set_param('hdlcoder_vector_sum_nested','SimulationCommand','update')

このモデルは simplevectorsum モデルと同じであり、vsum サブシステム内のサブシステム vsum_mid で構成されます。

open_system('hdlcoder_vector_sum_nested/vsum')

vsum_mid サブシステムには、ベクトル和のために構成されている Sum of Elements ブロックが含まれます。モデルは、vsum サブシステム内の Sum of Elements ブロックの HDL コードを生成する際に Tree 実装を使用するように設定されています。この実装はレイテンシを最小にするように最適化されていて、ブロックに対して加算器のツリー状の構造が生成されます。

open_system('hdlcoder_vector_sum_nested/vsum/vsum_mid')

ベクトル端子のスカラー化

既定の設定では、ScalarizePorts プロパティは off です。HDL Coder™ は、次のコードに示すように、ベクトル端子 In1 の型定義と端子宣言を生成します。

PACKAGE simplevectorsum_pkg IS
  TYPE vector_of_std_logic_vector16 IS ARRAY (NATURAL RANGE <>)
     OF std_logic_vector(15 DOWNTO 0);
  TYPE vector_of_signed16 IS ARRAY (NATURAL RANGE <>) OF signed(15 DOWNTO 0);
END simplevectorsum_pkg;

...

ENTITY vsum IS
  PORT( In1     :  IN    vector_of_std_logic_vector16(0 TO 9);  -- int16 [10]
        Out1    :  OUT   std_logic_vector(19 DOWNTO 0)  -- sfix20
      );
END vsum;

HDL コードの生成時にベクトル端子をスカラー化するには、[コンフィギュレーション パラメーター] ダイアログ ボックスで [端子のスカラー化] パラメーターを設定するか、関数 hdlset_param または makehdl を使用して ScalarizePorts プロパティを on または dutlevel に設定します。ScalarizePortsdutlevel に設定すると、DUT のベクトル信号のみがスカラーにフラット化されます。スカラーはベクトルとして vsim_mid サブシステムへの入力になります。

makehdl('hdlcoder_vector_sum_nested/vsum', 'ScalarizePorts', 'dutlevel')
ENTITY vsum IS
  PORT( In1_0                :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_1                :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_2                :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_3                :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_4                :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_5                :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_6                :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_7                :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_8                :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_9                :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        Out1                 :   OUT   std_logic_vector(19 DOWNTO 0)  -- sfix20
        );
END vsum;
ENTITY vsum_mid IS
  PORT( In1                               :   IN    vector_of_std_logic_vector16(0 TO 9);  -- int16 [10]
        Out1                              :   OUT   std_logic_vector(19 DOWNTO 0)  -- sfix20
        );
END vsum_mid;

モデル コンフィギュレーション パラメーターIndexing for scalarized port namingOne-based に設定すると、スカラー化されたベクトル端子の名前の開始インデックスを Zero-based から One-based に変更できます。

モデル全体のベクトル端子をフラットにするには、ScalarizePortson に設定します。vsum_mid のベクトル端子と Sum of Elements ブロックへの入力も、スカラーにフラット化されます。

makehdl('hdlcoder_vector_sum_nested/vsum', 'ScalarizePorts', 'on')
ENTITY vsum_mid IS
  PORT( In1_0                             :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_1                             :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_2                             :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_3                             :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_4                             :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_5                             :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_6                             :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_7                             :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_8                             :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        In1_9                             :   IN    std_logic_vector(15 DOWNTO 0);  -- int16
        Out1                              :   OUT   std_logic_vector(19 DOWNTO 0)  -- sfix20
        );
END vsum_mid;

使用に関するメモと制限

  • 保護モデルの ScalarizePorts プロパティを使用する場合、このプロパティには、参照元となる最上位モデルのこのパラメーターに指定されている値と同じ値を使用しなければなりません。

  • IP Core Generation ワークフローと FPGA-in-the-Loop ワークフローを使用する場合、ベクトル端子はサポートされません。ScalarizePortson または dutlevel に設定します。コード生成を高速化するために、ScalarizePortsdutlevel に設定します。

  • ベクトル端子または行列端子をモデル参照インターフェイスへの入力としてスカラー化してから HDL コードを生成しなければなりません。ScalarizePortsdutlevel に設定します。

  • 既定では、[モデル参照用の VHDL コードを単一のライブラリに生成] が有効になっています。VHDL コードは別個のライブラリではなく 1 つのライブラリで生成されます。この場合、ScalarizePorts プロパティを off に設定してから HDL コードを生成します。

  • コードの生成時に、生成された 2 つ以上の VHDL コード モジュールのインターフェイス時にベクトル端子間で型指定または命名の競合が発生する場合は、競合しない端子定義を生成するために ScalarizePorts プロパティを使用します。

参考

関連するトピック