Stateflow HDL コード生成の紹介
Stateflow® チャートは、階層型有限ステート マシン (FSM) 理論、流れ図の表記法および状態遷移図を使用して複雑なシステム動作を簡潔に記述します。
チャートを使用して、有限ステート マシンまたは ASIC や FPGA の実現を目的とした複雑な制御アルゴリズムをモデル化します。モデルが設計要件を満たす場合、モデル内に組み込まれた設計を実装する HDL コード (VHDL® または Verilog®) を生成します。生成された HDL コードは業界標準ツールを使用してシミュレーションと合成ができ、その後システム設計を FPGA および ASIC にマップできます。有限ステート マシン用の HDL コードを生成する方法の詳細については、Mealy および Moore 有限ステート マシンでの HDL 生成を参照してください。
チャートを含むモデルからの VHDL または Verilog コードの生成には、他のモデルからの HDL コード生成と大きな違いはありません。HDL コード ジェネレーターは以下のように設計されています。
HDL コードに一致するチャート セマンティクスの取り得る最大のサブセットをサポートする。この広範なサブセットにより、大幅にモデリングし直さなくても、既存のモデルから HDL コードを生成できます。
Stateflow シミュレーション セマンティクスとの完全な互換性を備えたビットトゥルーでサイクルアキュレートな HDL コードを生成する。
例
この例では、hdlcodercfir モデルを使用して、Stateflow チャートを含むサブシステムの HDL コードを生成する方法を示します。
モデルを開くには、コマンド ラインで次を入力します。
hdlcodercfir
チャートの初期化
[初期化時に指定されたチャートを実行 (入力)] プロパティを有効にすると、チャートの初期化の直後にチャートの更新関数が実行されます。チャートのプロパティ [初期化時に指定されたチャートを実行 (入力)] は無効のままにできます。このプロパティを使用すると、Stateflow Chart の動作と生成される HDL コードが大幅に変更される可能性があります。このプロパティが Stateflow Chart に与える影響については、チャートの初期化実行 (Stateflow)を参照してください。
リセット アクションでは組み合わせ論理の遅延を処理できないため、初期化アクションで算術演算は実行できません。
[チャート起動ごとに出力を初期化] をオンまたはオフにできます。オフにすると、生成される HDL コードにステート マシンの出力値のための追加のレジスタが含まれます。
調整可能なパラメーター
調整可能なパラメーターを HDL コード生成用の StateflowChart で使用できます。
詳細については、調整可能なパラメーターの DUT 端子を生成するを参照してください。
Stateflow チャートのコメント
Simulink® モデルにコメントを使用する Stateflow Chart が含まれている場合、HDL Coder™ は HDL コード内でコメントを生成します。
このモデルから Verilog コードを生成する場合、HDL Coder は対応する Stateflow オブジェクトの横の Stateflow Chart にインラインでコメントを表示します。
制限
HDL Coder では、HDL コード生成のためのメッセージが含まれる Stateflow ブロックはサポートされません。
モデル内でのチャートの位置
HDL コード生成用のチャートは Simulink サブシステムの一部でなければなりません。コードを生成するチャートがモデルのルート レベルにある場合、サブシステム内にチャートを組み込みます。関連する信号をサブシステムの入出力に接続します。
データ型
コード ジェネレーターは、次を含む MATLAB® データ型のサブセットをチャート内でサポートします。
符号付き整数と符号なし整数
固定小数点
boolean
列挙型
メモ
端子に割り当てられているデータ型を除いて、これらのデータ型の多次元配列がサポートされます。端子のデータ型はスカラーまたはベクトルでなければなりません。
single または double のデータ型を使用する場合、HDL Coder は HDL コード内で実数データ型を生成します。ModelSim® などのサードパーティ製シミュレーターを使用して、コードのシミュレーションと検証を実行できます。
実数データ型はターゲット FPGA デバイスで合成できません。コード ジェネレーターは、Native Floating Point
モードでの Stateflow Chart の HDL コード生成はサポートしません。浮動小数点データ型を使用するときに合成可能な HDL コードを生成するには、MATLAB Function ブロックまたはその他のネイティブ浮動小数点を使用してサポートされる Simulink ブロックを使用してアルゴリズムを開発します。
インポートされるコード
HDL コード生成用のチャートは、完全に自己完結型でなければなりません。次の制限が適用されます。
min
とmax
を除き、それ以外の MATLAB 関数は呼び出さないでください。MATLAB System object は Chart ブロックで使用しないでください。
MATLAB ワークスペース データは使用しないでください。
C の数学関数は呼び出さないでください。HDL には C の数学ライブラリに対応するライブラリはありません。
[C 言語のビット演算が可能] プロパティを無効にしている場合、指数演算子 (
^
) は使用しないでください。指数演算子は C の数学ライブラリの関数pow
で実装されます。カスタム コードは含めないでください。[コンフィギュレーション パラメーター] ダイアログ ボックスの [シミュレーション ターゲット] 、 [カスタム コード] ペインに入力された情報は無視されます。
データをクライアント間で (Data Store Memory ブロックを介して) 共有しないでください。グローバル データは HDL ではサポートされないため、HDL Coder で HDL にマッピングされません。
調整可能なパラメーターのベクトル
調整可能なパラメーターのベクトルは Chart ブロックのデータ型としてサポートされていません。
入力イベントと出力イベント
HDL Coder では、Stateflow チャートでの入力イベントと出力イベントの使用がサポートされますが、次の制約があります。
定義および使用できる入力イベントの数は Stateflow チャートごとに 1 つだけです。使用できる出力イベントの数に制限はありません。
チャートの入力イベントが 1 つで、そのチャートの出力端子に非ゼロの初期値がある場合、HDL コード生成はサポートされません。
入力イベントと出力イベントはいずれもエッジトリガー イベントでなければなりません。
入力イベントと出力イベントの詳細については、入力イベントの送信による Stateflow チャートのアクティブ化 (Stateflow)および出力イベントの送信による Simulink ブロックのアクティブ化 (Stateflow)を参照してください。
メッセージ
Stateflow メッセージは HDL コード生成ではサポートされていません。
ループ
HDL コード生成用のチャートでは、for
ループを除き、それ以外のループは明示的に使用しないでください。for
ループについては、次の制限が適用されます。
ループ カウンター変数のデータ型は
int32
でなければなりません。HDL Coder では、定数で制限されたループのみがサポートされます。
for
ループの例 sf_for
は、グラフィカル関数を使用する for
ループの設計パターンを示しています。
その他の制限
HDL Coder には、Classic チャート機能の使用に関して追加の制限があります。これらの制限は、汎用の逐次プログラミング言語の一部の機能が HDL でサポートされないことによるものです。
HDL コードを生成するチャートでローカル イベントは定義しないでください。
次の暗黙的なイベントは使用しないでください。
enter
exit
change
次の暗黙的なイベントを使用できます。
wakeup
tick
ベース イベントがこれらのタイプの暗黙的なイベントに制限されていれば時相論理を使用できます。
グラフィカル関数による再帰は使用しないでください。HDL Coder では再帰はサポートされていません。
構造化されていないコードの使用は避けてください。遷移フロー図およびグラフィカル関数を介してチャートで構造化されていないコードを使用することは可能ですが、使用すると
goto
ステートメントと複数の関数の return ステートメントが生成されます。HDL ではgoto
ステートメントまたは複数の関数の return ステートメントはサポートされません。そのため、構造化されていない流れ図は使用しないでください。[チャート起動ごとに出力を初期化] チャート オプションを選択していない場合、出力端子からの読み取りは行わないでください。
データ ストア メモリ オブジェクトは使用しないでください。
ポインター (
&
) 演算子または間接参照 (*
) 演算子は使用しないでください。ポインター演算とアドレス演算 (Stateflow)を参照してください。チャートのシミュレーションで実行時オーバーフロー エラーが発生した場合、データ範囲エラーのチェックを無効にしてチャートの HDL コードを生成することができます。この場合、生成された HDL コードから取得された一部の結果が、シミュレーションの結果に対してビットトゥルーにならないことがあります。オーバーフローのチェックを有効にし、シミュレーションでモデルのオーバーフロー状態を解消することをお勧めします。
参考
State Transition Table (Stateflow) | Truth Table (Stateflow) | Sequence Viewer (Stateflow)