Main Content

MATLAB Function ブロックを使用したハードウェア設計パターン

この例では、よく使用されるハードウェア アルゴリズムを HDL Coder™ で MATLAB Function ブロックを使用して効率的にモデル化する方法を示します。HDL 設計パターンのライブラリを使用して、HDL Coder でサポートされる MATLAB Coder の機能を示しています。

はじめに

MATLAB Function ブロックは、MATLAB® 言語の限られたサブセットについて、シミュレーションとコード生成をサポートしています。Simulink® と Stateflow® のアルゴリズム実装のためのメカニズムが用意されています。このブロックの使用方法に関する詳細を確認するには、Simulink で次のように入力します。

  >> docsearch('About Code Generation from MATLAB Algorithms')

HDL Coder でサポートされる機能のサブセット

HDL Coder は、シーケンス検出器、パターン発生器、符号化器、復号化器など、DSP や電気通信のさまざまな用途の HDL 実装に適した MATLAB Function ブロックの強力な機能のサブセットをサポートしています。以下のリストは、HDL Coder でサポートされる MATLAB Function ブロックの機能を簡単にまとめたものです。

  • 各種の数値クラス (int、uint、logical、single、double)

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

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

  • 上記の演算子を使用した完全な MATLAB 式のサポート

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

  • 行列の添字付け

  • if、switch、for ステートメントを使用した制御フロー

  • サブ関数

  • 永続変数による状態のモデル化

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

ハードウェア アルゴリズムのモデル化

MATLAB Function ブロックは、ハードウェア アルゴリズムの動作をテキストで簡潔に表現する、高い抽象化レベルでモデル化するためのメカニズムを備えています。HDL Coder は、そのようなアルゴリズム レベルの表現から実装するための簡単な方法を提供します。以降の節で、このブロックを HDL Coder で効率的に使用する方法を示します。

% To illustrate the use of the above features in hardware modeling a
% sample patterns library is created that shows how to model common
% HDL problems. To open this sample library model please type
% at the command prompt

open_system('eml_hdl_design_patterns')

このライブラリのブロックの使用

このモデルのブロックを使用するサンプル モデルをいくつか作成し、生成されたコードを確認するには、以下の手順に従ってください。

  • 新しいモデルを作成します。

  • このモデルに eml_hdl_design_patterns ライブラリから目的のブロックをコピーします。

  • サブシステムまたはテスト対象デバイスに配置します。

  • 'hdlsetup' コマンドを実行します。

  • 'makehdl' を実行してブロックのコードを生成します。

  • その周囲に Simulink のソースとシンクを使用して有効なテスト ベンチを作成します。

  • 'makehdltb' コマンドを実行してテストベンチを生成します。

  • Modelsim の '.do' スクリプト ファイルを使用して、生成されたコードをシミュレートします。

詳細については、チュートリアルのモデル例 'eml_hdl_incrementer' を参照するか次のように入力してください。

  >> docsearch('Tutorial Example: Incrementer')

算術演算のモデル化

この節では、MATLAB Function ブロックから効率的な HDL を生成するうえで役立つ設計上の考慮事項をいくつか紹介します。符号付きおよび符号なしの論理ベクトルを使用した任意の長さの算術演算のモデル化には、fi オブジェクトの使用が推奨されることに注意してください。fi オブジェクトは、固定小数点演算をモデル化するための強力なメカニズムを提供します。MATLAB Function ブロックで fi オブジェクトを使用する際の注意事項を以下にいくつか示します。

関数 fi は、'numerictype' (符号、語長、小数部の長さを定義) や 'fimath' (丸めモードと飽和モードを定義) をカスタマイズした固定小数点オブジェクトを定義するのに役立ちます。

HDL コード生成では、以下に示す fimath ('Floor'、'Wrap'、および 'FullPrecision' モード) をお勧めします。

ただし、より複雑な丸めと飽和のロジックを必要とするアルゴリズムをモデル化するときは、fimath で他の丸めモード (floor、ceil、fix、nearest) やオーバーフロー モード (wrap、saturate) も使用できます。

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

例: 生成されたコードに対する fimath のプロパティの影響については、以下の例で示しています。

  open_system('eml_hdl_design_patterns/Adders/add_with_carry')
  open_system('eml_hdl_design_patterns/Misc/eml_expr')

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

複雑な制御ロジックをモデル化するには、レジスタをモデル化できることが基本的な要件となります。MATLAB Coder のプログラミング モデルでは、状態を保持する要素は永続変数として表現されます。永続として宣言された変数は、ソフトウェア内の関数呼び出し全体および Simulink サンプル時間のステップ全体で、その値を保持します。レジスタやフリップフロップなど、ハードウェアにおける状態を保持する要素も同様の動作になります。グローバルおよびローカルのリセット条件を使用して永続変数の値を変更する方法については、以下の例で示しています。

例: open_system('eml_hdl_design_patterns/Delays') open_system('eml_hdl_design_patterns/Delays/unit delay') open_system('eml_hdl_design_patterns/Delays/integer delay') open_system('eml_hdl_design_patterns/Delays/tap delay') open_system('eml_hdl_design_patterns/Delays/tap delay vector')

カウンターと FSM のモデル化

MATLAB Coder の switch/case や if-elseif-else などの制御構造で、遅延要素や固定小数点算術演算と組わせて制御ロジックをモデル化できます。FSM の例では、switch-case と if-elseif-end の制御ステートメントの使用方法を示しています。カウンターでは、状態をモデル化し、ループ内部でデータ要素を量子化する方法を示しています。

例: open_system('eml_hdl_design_patterns/FSMs') open_system('eml_hdl_design_patterns/Counters')

ビット演算のモデル化

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' にする

例: open_system('eml_hdl_design_patterns/Bit Twiddlers/hdl_bit_ops') open_system('eml_hdl_design_patterns/Bit Twiddlers/signal_distance') open_system('eml_hdl_design_patterns/Word Twiddlers/nibble_swap_with_slice_concat')

整数とビットの間の変換を実行する方法を示す例については、モデル hdlcoder_int2bits_bits2int を開きます。

open_system('hdlcoder_int2bits_bits2int')

このモデルでは、Word Twiddlers ライブラリに実装されている MATLAB Function ブロックを使用しています。

open_system('eml_hdl_design_patterns/Word Twiddlers/Bits2Int')
open_system('eml_hdl_design_patterns/Word Twiddlers/Int2Bits')
open_system('eml_hdl_design_patterns/Word Twiddlers/Integer to Bits')
open_system('eml_hdl_design_patterns/Word Twiddlers/Bits to Integer')

ハードウェア要素のモデリング

MATLAB Function ブロックを使用すると、バレル シフター、回転子、桁上げ保存加算器などのさまざまなハードウェア要素をシンプルで簡潔な MATLAB スクリプトを使用してモデル化できます。

例: open_system('eml_hdl_design_patterns/Shift Registers/shift_reg_universal')

まとめ

次の例では、ハードウェアのモデル化に MATLAB Function ブロックを使用することで広がるさまざまな機会を示しています。ハードウェアのモデル化における一般的な問題を MATLAB Function ブロックを使用して解決するための一連のパターンを紹介しています。このライブラリの詳細については、次のドキュメントを参照してください。

  >> docsearch('The eml_hdl_design_patterns Library')