Main Content

HDL コード生成のための MATLAB Function ブロックを使用したハードウェア設計パターンの作成

HDL 設計パターン ライブラリ em_hdl_design_patterns を使用して、ハードウェアのモデル化における一般的な問題を MATLAB Function ブロックを使用して解決するパターンを実装できます。em_hdl_design_patterns ライブラリの詳細については、HDL 用の MATLAB Function ブロック設計パターンを参照してください。

HDL Coder™ は、シーケンス検出器、パターン発生器、符号化器、復号化器など、デジタル信号処理 (DSP) や電気通信のさまざまな用途の HDL 実装で使用できる MATLAB Function ブロックの機能のサブセットをサポートしています。MATLAB Function ブロックによって HDL Coder でサポートされる機能の一部を次に示します。

  • intuintlogicalsingledouble などの数値クラス

  • fi オブジェクトを使用した固定小数点演算

  • 算術演算子、論理演算子、関係演算子、ビット演算子のサポート

  • 上記の演算子を使用した MATLAB® 式

  • 1 次元および 2 次元の行列演算

  • 行列の添字付け

  • ifswitchfor ステートメントを使用した制御フロー

  • サブ関数

  • 状態をモデル化する永続変数

  • 固定小数点と整数の MATLAB ライブラリ関数

パターン ライブラリを開く

MATLAB Function ブロックは、アルゴリズムの動作をテキストで簡潔に表現します。これにより、ハードウェア アルゴリズムを高いレベルでモデル化できます。ハードウェアとの親和性が高い、それらの MATLAB Function ブロックのアルゴリズムを HDL Coder を使用して実装できます。サンプル パターン ライブラリ em_hdl_design_patterns は、HDL でサポートされる一般的なハードウェア モデリング構造を MATLAB Function ブロックを使用してモデル化する方法を示したものです。このサンプル ライブラリ モデルを開くには、MATLAB コマンド プロンプトで次のように入力します。

open_system('eml_hdl_design_patterns')

MATLAB Function ブロックを使用した算術式のモデル化

em_hdl_design_patterns ライブラリの Adders サブシステムと Misc サブシステムのブロックを使用して算術式をモデル化できます。符号付きおよび符号なしの論理ベクトルを使用した任意の長さの算術演算のモデル化には fi オブジェクトを使用します。MATLAB Function ブロックで fi オブジェクトを使用するときは、関数 fi を使用すると、numerictype オブジェクトと fimath オブジェクトをカスタマイズした固定小数点オブジェクトを定義するのに役立ちます。numerictype オブジェクトで fi オブジェクトの符号、語長、小数部の長さの属性を定義し、fimath オブジェクトで丸めモードと飽和モードを定義します。詳細については、fiを参照してください。関数 fi を使用して HDL コードを生成するには、fimath で次の設定を使用します。

  fimath(...
  'RoundMode', 'floor',...
  'OverflowMode', 'wrap',...
  'ProductMode', 'FullPrecision', 'ProductWordLength', 32,...
  'SumMode', 'FullPrecision', 'SumWordLength', 32);

より複雑な丸めや飽和のロジックを必要とするアルゴリズムをモデル化するときは、fimath で他のモードを使用できます。roundingfloorceilfixnearest を使用したり、overflowwrapsaturate を使用できます。

生成された HDL コードに対する fimath プロパティの影響を確認するには、eml_hdl_design_patterns/Adders/add_with_carry および eml_hdl_design_patterns/Misc/eml_expr の HDL コードを生成します。

固定小数点アルゴリズムを使用した組み合わせ理論のモデル化

eml_hdl_design_patterns ライブラリを開き、Combinatorics/eml_expr ブロックを選択します。MATLAB Function ブロック eml_expr は、異なる固定小数点データ型をもつ加算、減算、乗算の演算子を含む単純な式を実装しています。Generate HDL Code from a MATLAB Function Blockのプロセスに従って、MATLAB Function ブロックの HDL コードを生成します。

生成される VHDL コードは次のとおりです。

BEGIN
   --MATLAB Function 'Subsystem/eml_expr': '<S2>:1'
   -- fixpt arithmetic expression
   --'<S2>:1:4'
   mul_temp <= signed(a) * signed(b);
   sub_cast <= resize(mul_temp, 11);
   add_cast <= resize(signed(a & '0'), 7);
   add_cast_0 <= resize(signed(b), 7);
   add_temp <= add_cast + add_cast_0;
   sub_cast_0 <= resize(add_temp & '0' & '0', 11);
   expr <= sub_cast - sub_cast_0;
   -- cast the result to correct output type
   --'<S2>:1:7'
   y <= "0111111" WHEN ((expr(10) = '0') AND (expr(9 DOWNTO 7) /= "000"))
           OR ((expr(10) = '0') AND (expr(7 DOWNTO 1) = "0111111"))
          ELSE
         "1000000" WHEN (expr(10) = '1') AND (expr(9 DOWNTO 7) /= "111")
          ELSE
          std_logic_vector(expr(7 DOWNTO 1) + ("0" & expr(0)));
END fsm_SFHDL;

MATLAB Function ブロック eml_expr から生成される Verilog コードは次のとおりです。

//MATLAB Function 'Subsystem/eml_expr': '<S2>:1'
   // fixpt arithmetic expression
   //'<S2>:1:4'
   assign mul_temp = a * b;
   assign sub_cast = mul_temp;
   assign add_cast = {a[4], {a, 1'b0}};
   assign add_cast_0 = b;
   assign add_temp = add_cast + add_cast_0;
   assign sub_cast_0 = {{2{add_temp[6]}}, {add_temp, 2'b00}};
   assign expr = sub_cast - sub_cast_0;
   // cast the result to correct output type
   //'<S2>:1:7'
   assign y = (((expr[10] == 0) && (expr[9:7] != 0))
             || ((expr[10] == 0) && (expr[7:1] == 63)) ? 7'sb0111111 :
             ((expr[10] == 1) && (expr[9:7] != 7) ? 7'sb1000000 :
             expr[7:1] + $signed({1'b0, expr[0]})));

生成される HDL コードは、この式の固定小数点オペランドによる変換を示しています。ブロックの既定の fimath 仕様によって、MATLAB Function ブロック内の固定小数点オペランドを使用した算術式の動作が決まります。fimath の設定は eml_expr ブロックのブロック コメントで確認できます。

永続変数を使用したモデルの状態

複雑な制御ロジックをモデル化するには、モデルでレジスタをモデル化できなければなりません。コードを生成する際、状態を保持する要素を永続変数として表現できます。永続変数の値は、MATLAB コード内の関数呼び出し全体およびシミュレーション時のサンプル タイム ステップ全体で保持されます。レジスタやフリップフロップなど、ハードウェアにおける状態を保持する要素も同様の動作になります。したがって、MATLAB Function ブロックの永続変数はハードウェアのレジスタにマッピングされます。

em_hdl_design_patterns ライブラリの Delays サブシステムに、グローバルとローカルのリセット条件を使用して永続変数の値を変更する方法、および永続変数のベクトルを使用して整数の遅延、タップ遅延、タップ遅延ベクトル ブロックをモデル化する方法を示す MATLAB Function ブロックが含まれています。それらの設計パターンを使用して、モデル内の MATLAB Function ブロックの各実行間で状態を伝達する逐次アルゴリズムを実装できます。

HDL Coder で HDL コード内のレジスタに永続変数をマッピングするには、永続変数が書き込まれる前に MATLAB コードでそれを読み取らなければならないことに注意してください。MATLAB コードがこの規則に従っていない場合、コードの生成時に HDL Coder で警告メッセージが表示されます。

制御ロジックと有限ステート マシンのモデル化

switchcaseifelse などの条件付きステートメントを固定小数点算術演算および遅延要素と一緒に使用して、制御ロジックをモデル化できます。em_hdl_design_patterns ライブラリでは、それらの条件付きステートメントの使用方法を FSMs サブシステムの MATLAB Function ブロックで示しています。mealy_fsm_blkmoore_fsm_blk blocks は、MATLAB Function ブロックにおける Mealy および Moore 有限ステート マシンの実装例を提供しています。

MATLAB Function ブロックでは、制御ステートメントと永続変数を使用して、単純なステート マシンとその他の制御ベースのハードウェア アルゴリズム (パターン マッチング機能や同期関連のコントローラーなど) をモデル化できます。複雑な時相論理を用いたより複雑な階層ステート マシンをモデル化するには、Stateflow® チャートを使用してステート マシンをモデル化します。

カウンターのモデル化

Counters サブシステムの MATLAB Function ブロックは、状態をモデル化し、データ要素をループで量子化する方法を示しています。永続状態変数のグローバル リセット制御とローカル リセット制御にカウンターを使用できます。HDL コード生成用に MATLAB Function ブロックで算術および制御ロジック アルゴリズムを実装するには、次の点に従っていることを確認してください。

  • 最上位の MATLAB Function ブロックをタイム ステップごとに 1 回呼び出す。

  • プログラム ループを完全に展開できる。

  • リセット値と更新ロジックをもつ永続変数を使用してシミュレーションのタイム ステップ間で値を保持する。

  • ループ内部では量子化されたデータ変数を使用する。

ビット演算とビット変換演算のモデル化

MATLAB Function ブロックは、ビットから整数への変換、整数からビットへの変換、ビットの連結、ビットのパックとアンパック、PN シーケンスの生成とビットスクランブラなど、ハードウェアのビット操作演算に役立つさまざまなビット演算子をサポートしています。

HDL Coder では、次のビット単位関数がサポートされます。

  • bitget, bitsliceget, bitconcat, bitset, bitcmp

  • bitand, bitor, bitxor

  • bitandreduce, bitorreduce, bitxorreduce

  • bitshift, bitsll, bitsrl, bitsra, bitrol, bitror

算術演算を含まない純粋なロジックを MATLAB Function ブロックでモデル化するときは次を使用します。

  • 符号付きではなく符号なしの入力オペランド。

  • 飽和しない fimath オプション (生成されるハードウェアを抑えるため)。

  • OverflowMode の設定として wrap

  • RoundMode の設定として floor

em_hdl_design_patterns ライブラリでは、これらの設定の適用方法を Bit Twiddlers サブシステムの MATLAB Function ブロック hdl_bit_opsWord Twiddlers サブシステムの MATLAB Function ブロック signal_distance および nibble_swap_with_slice_concat で示しています。

整数からビットへの変換とビットから整数への変換の実行方法を示すモデル例については、次のように入力してモデル hdlcoder_int2bits_bits2int を開きます。

open_system('hdlcoder_int2bits_bits2int')

Word Twiddlers サブシステムで黒のテキスト ボックス hdlcoder_int2bits_bits2int をダブルクリックしてモデルを開くこともできます。

hdlcoder_int2bits_bits2int モデルでは、em_hdl_design_patterns ライブラリの Word Twiddlers サブシステムにある次の MATLAB Function ブロックを使用します。

  • Bits2Int

  • Int2Bits

  • Integer to Bits

  • Bits to Integer

ハードウェア要素のモデル化

MATLAB Function ブロックを使用すると、バレル シフター、回転子、桁上げ保存加算器などのさまざまなハードウェア要素を MATLAB スクリプトを使用してモデル化できます。32 ビットと 64 ビットのシフト レジスタなど、さまざまなシフト レジスタのハードウェア要素をモデル化する MATLAB Function ブロックについては、em_hdl_design_patterns ライブラリの Shift Registers サブシステムを参照してください。

参考

関連するトピック