プログラミング環境としてのMATLABは行列演算や解析を行うために開発された非常に抽象度の高いプログラミングで科学技術計算を行える環境です。コマンド1行で行列演算を含む複雑な演算そのままの抽象度でデジタル回路の処理を模擬するには無理があります。MATLABは行列演算が得意であるがために、画像データを2次元または3次元配列として扱い、フレーム単位で処理を行いますが、実際のFPGAの中では、フレーム単位で処理が行われているわけではなく、ピクセル単位で行われています。このような抽象度の乖離(かいり)があるのに、コード生成だけできるようにしても、どこかで破綻をきたしてしまいます。
一方Simulinkはブロック線図で処理内容を記述するシミュレーション環境です。ビット演算、論理演算、乗算、加算のような抽象度が低いものから、デジタルフィルターやFFT、画像のBlob解析など1つのブロックで高機能なものまでさまざまなブロックライブラリが提供されており、それを利用することで、アルゴリズムを一からスクラッチでプログラミングしたり、アルゴリズム自体のデバッグをしたりする手間を省けます。
Simulinkで提供されているブロックを例示します。
Simulinkで提供されているブロックは、プロセッサやFPGAに組み込むためのものだけではありません。Simulinkはそもそもシミュレーションを行う環境ですので、シミュレーションに必要なさまざまなライブラリが提供されています。例えば、シミュレーションするのには何らかの入力信号や、データを可視化、保存、チェックする機能が必要です。また、フィードバック制御系のシミュレーションを行うには制御対象が必要ですし、通信システムの送受のシミュレーションを行うには通信路を模擬する必要があります。このようなシミュレーションに必要な機能を全て提供しているのです。
VHDL/Verilogなどのコードは、複数人で共同作業を行う中でファイル数が多くなってくると、階層関係やデータの流れがカオス化してしまいます。Simulinkでは信号の流れや階層構造が分かりやすいブロック線図で設計を行います。
また、Simulinkでは組み込みシステム同様ストリーミングの動作を表現でき、組み込みシステムとの親和性が高いため、Simulinkを使う方が多くのメリットを得やすいので、組み込みシステム開発では主にSimulinkが利用されます。
プログラムによる開発が好みの場合は、組み込み開発と親和性が高いストリーミング処理に最適化されたMATLABコードのフレームワークがあります。それがDSP System Toolbox、Communications System Toolbox、Computer Vision System Toolbox、Vision HDL Toolboxなどで使えるSystem Objectです。System Objectはオブジェクト指向のMATLABコードの一種で、オブジェクトの定義、メソッドという手順でプログラムを記述、実行します。そのメソッドをループ実行することで、ストリーミング処理が実行できるのです。System ObjectとSimulinkで処理を行った場合に、どのような記述になるか示したのが下図です。
これまでMATLABで書いていたコードをSystem Objectに書き換えるのは手間と考える方もいるかもしれません。しかし、System Objectでは組み込みシステムなどの実システムの振る舞いをシミュレートしながら実現可能性をチェックすることができるだけでなく、組み込み開発においてはARM Cortex-M/A向けの最適化されたCコード生成の機能があったり、抽象度の高い関数からHDLコード生成ができたりしますので、利用をおすすめします。
松本 充史:MathWorks Japan アプリケーションエンジニアリング部 プリンシパルアプリケーションエンジニア
Copyright © ITmedia, Inc. All Rights Reserved.