Multiply-Accumulate
入力に対して Multiply-Accumulate 演算を実行する
ライブラリ:
HDL Coder /
HDL Operations
説明
Multiply-Accumulate ブロックは、入力 a、b、およびバイアス c に対してこの演算を実行して結果 dataOut を計算します。
dataOut = sum(a.* b) + c
既定では、このブロックはベクトル モードで動作します。入力 a および b はスカラー、ベクトル、または 2 次元行列にすることができます。既定では、バイアス値 c はゼロです。このブロックは入力 a と入力 b のドット積を計算します。Dialog または Input port を [ソース] として使用して、c に非ゼロの値を指定できます。このブロックはこのバイアスを a と b のドット積に加算します。乗算演算は、[出力データ型] の設定に関係なく完全精度です。[出力データ型] および [整数丸めモード] の設定は、加算演算に適用されます。ブロックの HDL コードを生成するには、ベクトル入力を使用します。スカラー入力では、Multiply-Add ブロックを使用します。
[演算モード] 設定を使用して、Multiply-Accumulate ブロックのストリーミング演算モードを指定できます。HDL コード生成では、ストリーミング演算モードを使用している場合、スカラー値をブロックに入力する必要があります。このブロックには Streaming - using Start and End ports と Streaming - using Number of Samples という 2 つのストリーミング モードがあります。これらのストリーミング モードを選択した場合、モードで使用する制御信号を指定できます。制御信号は、累積を開始および終了するタイミングおよび出力が有効である条件を指定します。
端子
入力
ブロックへの入力を提供する端子。
データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixed point
ブロックへの入力を提供する端子。
データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | Boolean | fixed point | enumerated | bus
ブロックにバイアス信号を提供する端子。ブロックはこのバイアスを入力に加算します。バイアス信号のデータ型が入力のドット積のデータ型に一致していることを確認してください。
依存関係
この端子を有効にするには、[ソース] を [入力端子] に設定します。
データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixed point
累積を開始する制御信号を提供する端子。端子への入力として boolean データ型の信号を使用することをお勧めします。dataOut 信号からの累積された出力値の取得を開始するには、startIn と validIn の信号がともに High になっている必要があります。dataOut 信号は、次のクロック サイクルから累積結果を生成します。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports] に設定します。
データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixed point
入力信号が累積用に有効であることを示す制御信号を提供する端子。端子への入力として boolean データ型の信号を使用することをお勧めします。dataOut 信号からの累積された出力値の取得を開始するには、validIn と startIn の信号がともに High になっている必要があります。dataOut 信号は、次のクロック サイクルから累積結果を生成します。validIn 信号は startIn 信号および endIn 信号より優先順位が高くなっています。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports] または [Streaming - using Number of Samples] に設定します。
データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixed point
累積の終了を示す制御信号を提供する端子。startIn 信号および endIn 信号を validIn 信号とともに使用して、累積出力を含むフレームを示すことができます。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports] に設定してから、[End input and output ports] を選択します。
データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixed point
出力
Multiply-Accumulate 演算からの出力データを生成する端子。既定では、ブロックは [Vector] 演算モードを使用し、入力信号のドット積を計算し、バイアスを加算して結果を生成します。[演算モード] としてストリーミング演算モードを指定した場合、dataOut 信号の値は、指定した制御信号によって異なります。出力信号のデータ型は、アキュムレータのデータ型と同じです。
データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixed point
累積の開始を示す出力制御信号を生成する端子。validIn と startIn がともに High の場合、startOut 信号は次のクロック サイクルで高くなります。startOut が High になるクロック サイクルは、フレームの開始を示し、dataOut 信号が有効な累積出力の生成を開始したことを示しています。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports] に設定してから、[Start output port] を選択します。
データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixed point
dataOut 信号が有効であることを示す出力制御信号を生成する端子。validIn 信号が High になると、validOut 信号は次のクロック サイクルで High になり、dataOut が有効であることを示します。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports] に設定してから、[Valid output port] を選択します。
データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixed point
累積の終了を示す出力制御信号を生成する端子。startOut 信号が High になったときから endOut 信号が High になるまでの間のクロック サイクルを使用して、累積出力を含む有効なフレームを示すことができます。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports] に設定してから、[End input and output ports] を選択します。
データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixed point
累積サンプル数を示す出力制御信号を生成する端子。この信号の値は、1 から、[サンプル数] に指定した値まで増加します。validIn 信号が High である間、countOut はクロック サイクルごとに 1 ずつインクリメントされます。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Number of Samples] に設定してから、[Count output port] を選択します。
データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | fixed point
パラメーター
[演算モード] を次のいずれかとして指定します。
Vector: 入力としてスカラーまたはベクトルを使用できます。ブロックは入力u1と入力u2のドット積を実行し、バイアスkを加算して結果を生成します。Streaming - using Start and End Ports: HDL コード生成にスカラー入力を使用します。このモードでは、startIn および endIn 制御信号を使用して、累積を開始および停止するタイミングを決定できます。validIn が High の場合、出力データは有効です。Streaming - using Number of Samples: HDL コード生成にスカラー入力を使用します。このモードでは、[サンプル数] を指定し、countIn 制御信号を使用して累積を開始および停止するタイミングを決定できます。validIn が High の場合、出力データは有効です。
プログラムでの使用
ブロック パラメーター: opMode |
| 型: 文字ベクトル |
値: 'Vector' | 'Streaming - using Start and End Ports' | 'Streaming - using Number of Samples' |
既定の設定: 'Vector' |
以下のようにバイアスを指定できます。
[ソース] を
Dialogとして。この場合は、[値] を指定します。[ソース] を
Input portとして。この設定では、バイアス信号をブロックに入力する外部入力端子cが作成されます。
プログラムでの使用
ブロック パラメーター: initValueSetting |
| 型: 文字ベクトル |
値: 'Dialog' | 'Input port' |
既定の設定: 'Dialog' |
[ソース] を Dialog として設定した場合、initValue2 設定を使用して初期値を指定できます。
ブロック パラメーター: initValue2 |
| 型: 文字ベクトル |
| 値: 0 以上の整数 |
既定の設定: '0.0' |
[サンプル数] を指定して、有効な累積出力 dataOut のサンプル数を含むフレームを指定できます。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Number of Samples] に設定します。
プログラムでの使用
ブロック パラメーター: num_samples |
| 型: 文字ベクトル |
| 値: 0 以上の整数 |
既定の設定: '2' |
出力データ型を次のように設定します。
Inherit: Same as first inputなど、データ型を継承するルール。singleやint16など、組み込みデータ型。Simulink.NumericTypeオブジェクトなど、データ型オブジェクトの名前。有効なデータ型として評価される式。例:
fixdt(1,16,0)
ストリーミング モードでは Inherit: Inherit via internal rule はサポートされていません。[出力データ型] を設定する際に [データ型アシスタント] を使用できます。アシスタントを表示するには、[データ型アシスタントを表示]
をクリックします。
プログラムでの使用
ブロック パラメーター: OutDataTypeStr |
| 型: 文字ベクトル |
既定の設定: {'Inherit: Inherit via internal rule'} |
このパラメーターに指定できる値を確認するには、プログラムによるブロックのパラメーターとプロパティの指定を参照してください。
以下のいずれかとして丸めアクションを指定します。
Ceiling正の無限大方向に正負の値を丸めます。MATLAB® 関数
ceilと等価です。Convergent最も近い表現可能な値に数値を丸めます。同順位が発生した場合は、最も近い偶数の整数に丸めます。Fixed-Point Designer™ 関数
convergentと等価です。Floor負の無限大方向に正負の値を丸めます。MATLAB 関数
floorと等価です。Nearest最も近い表現可能な値に数値を丸めます。同順位が発生した場合は、正の無限大方向に丸めます。Fixed-Point Designer 関数
nearestと等価です。Round最も近い表現可能な値に数値を丸めます。同順位が発生した場合は、正の数値を正の無限大方向、負の数値を負の無限大方向に丸めます。Fixed-Point Designer 関数
roundと等価です。Simplest負方向の丸めとゼロ方向の丸めのいずれかを選択し、できるだけ効率の高い丸めコードを生成します。
Zeroゼロ方向に数値を丸めます。MATLAB 関数
fixと等価です。
プログラムでの使用
ブロック パラメーター: RndMeth |
| 型: 文字ベクトル |
既定の設定: {'Floor'} |
このパラメーターに指定できる値を確認するには、プログラムによるブロックのパラメーターとプロパティの指定を参照してください。
validOut 出力端子の生成を制御します。この端子は、dataOut が有効かどうかを示します。
オフvalidOut 出力端子を表示しません。
オンvalidOut 出力端子を表示します。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Number of Samples] または [Streaming - using Start and End Ports] に設定します。
プログラムでの使用
ブロック パラメーター: validOut |
| 型: 文字ベクトル |
値: 'off' | 'on' |
既定の設定: 'off' |
endIn 入力端子および endOut 出力端子の生成を制御します。これらの端子は、有効な累積出力を含むフレームの最後を示します。
オフendIn 入力端子および endOut 出力端子を表示しません。
オンendIn 入力端子および endOut 出力端子を表示します。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports] に設定します。
プログラムでの使用
ブロック パラメーター: endInandOut |
| 型: 文字ベクトル |
値: 'off' | 'on' |
既定の設定: 'off' |
startOut 出力端子の生成を制御します。この端子は、有効な累積出力を含むフレームの開始を示す startOut 信号を生成します。
オフstartOut 出力端子を表示しません。
オンstartOut 出力端子を表示します。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports] に設定します。
プログラムでの使用
ブロック パラメーター: startOut |
| 型: 文字ベクトル |
値: 'off' | 'on' |
既定の設定: 'off' |
countOut 出力端子の生成を制御します。この端子は、有効なサンプルを含むフレームを示すカウンターを生成します。
オフcountOut 出力端子を表示しません。
オンcountOut 出力端子を表示します。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Number of Samples] に設定します。
プログラムでの使用
ブロック パラメーター: countOut |
| 型: 文字ベクトル |
値: 'off' | 'on' |
既定の設定: 'off' |
ヒント
Multiply-Accumulate ブロックでは次のことが可能です。
行列乗算演算を実行する。たとえば、次元が
N-by-MおよびM-by-Pの 2 つの行列入力がある場合、N-by-PMultiply-Accumulate 演算を並列で使用して結果を計算できます。フィルター ブロックなどで乗算および加算の演算の順序を置き換え、FPGA 上の DSP スライスにマッピングしてハードウェアでのパフォーマンスを向上させる。次の図では、
sfir_fixedモデルで Multiply-Accumulate ブロックを使用する方法を示します。
アルゴリズム
ブロックの [演算モード] 設定を使用して、ストリーミング演算モードを指定できます。Streaming - using Start and End Ports を選択すると、3 つの追加設定が既定で有効になります。以下の設定があります。
Valid output port
End input and output ports
Start output port
これらの設定は有効のままにしておくことを推奨します。設定を適用すると、3 つの追加入力端子および 3 つの追加出力端子が表示されます。
| 入力端子 | 出力端子 |
|---|---|
| startIn | startOut |
| validIn | validOut |
| endIn | endOut |
下図では、開始端子と終了端子を使用したストリーミング演算モードを示します。この例では、バイアス値は 8 です。

最初、validIn が Low のとき、dataOut はゼロです。時間 1s に、startIn と validIn がともに High になっています。したがって、validOut は次のクロック サイクルで High になり、dataOut は有効な累積出力の生成を開始します。累積時に、dataOut は前のクロック サイクルから値 a および b を受け取ります。たとえば、時間 t = 2s では、dataOut = 1*1 + 8 = 9 です。
累積を続行するために、次のクロック サイクルで startIn を Low にし、validIn は High のままにしています。dataOut は、validIn が Low になるまで入力の累積を続行します。各タイム ステップで、dataOut は前のクロック サイクルからの入力の積を計算し、前のクロック サイクルからの dataOut 値を使用して結果の和を求めます。たとえば、時間 t = 3s では、dataOut = 2*2 + 9 = 13 です。
validIn が Low になると、dataOut は出力値を保持します (時間 t = 5s を参照)。t = 5s では、endIn と validIn は High です。そのため、endOut は次のクロック サイクルで High になり、フレームの最後を示します。したがって、t = 2s (startOut が High) から t = 6s (endOut が High) までのフレームは、有効な出力を含むフレームを示しています。
startIn、validIn、および endIn がともに同時に High の場合、それらの入力に対応する dataOut のみが累積されます (t = 8s を参照)。startIn が複数のクロック サイクルの間 High で、validIn が High の場合、アキュムレータは各クロック サイクルでリセットされます (t = 10s と t = 11s を参照)。累積は t = 12s から続行されています。
ブロックの [演算モード] 設定を使用して、ストリーミング演算モードを指定できます。Streaming - using Number of Samples を選択すると、2 つの追加設定が既定で有効になります。以下の設定があります。
Valid output port
Count output port
これらの設定は有効のままにしておくことを推奨します。設定を適用すると、1 つの追加入力端子 validIn および次の 3 つの追加出力端子が表示されます。
endOut
validOut
countOut
下図では、サンプル数を使用したストリーミング演算モードを示します。この例では、バイアス値は 8 であり、[サンプル数] は 5 です。

最初、validIn が Low のとき、dataOut は 0 であり、countOut は 1 です。時間 1s に、validIn が High になっています。したがって、validOut は次のクロック サイクルで High になり、dataOut は有効な累積出力の生成を開始します。累積時に、dataOut は前のクロック サイクルから値 a および b を受け取ります。たとえば、時間 t = 2s では、dataOut = 1*1 = 1 です。countOut は次のクロック サイクルで 1 ずつインクリメントされます。つまり、t = 3s では、countOut は 2 になります。
累積を続行するために、validIn を High のままにします。dataOut は、validIn が Low になるまで入力の累積を続行します。5 つの有効な出力が dataOut から取得されると、countOut は 5 になり、endOut は High になり、フレームの最後を示します。したがって、countOut が 1 のときから countOut が 5 になったときまでの時間が、有効な出力を含むフレームを示しています。
次にアキュムレータのカウンターがリセットされ、countOut は 1 から開始しています。validIn がまた High になると、dataOut が新しい値セットの累積を開始し、countOut が有効な dataOut ごとにインクリメントを開始します。
拡張機能
C/C++ コード生成
Simulink® Coder™ を使用して C および C++ コードを生成します。
HDL Coder™ には、HDL の実装および合成されたロジックに影響する追加の構成オプションがあります。
| HDL アーキテクチャの設定 | 説明 |
|---|---|
Parallel | サイズ |
Serial (既定値) | サイズ
設計を合成すると、入力ビット幅に応じて、このアーキテクチャは FPGA 上の 1 つの DSP スライスにマッピングします。 |
| 一般 | |
|---|---|
| ConstrainedOutputPipeline | 既存の遅延を設計内で移動することによって出力に配置するレジスタの数。分散型パイプラインではこれらのレジスタは再分散されません。既定の設定は |
| InputPipeline | 生成されたコードに挿入する入力パイプライン ステージ数。分散型パイプラインと制約付き出力パイプラインでは、これらのレジスタを移動できます。既定の設定は |
| OutputPipeline | 生成されたコードに挿入する出力パイプライン ステージ数。分散型パイプラインと制約付き出力パイプラインでは、これらのレジスタを移動できます。既定の設定は |
複素信号を使用している場合、このブロックは HDL コードを生成できますが、DSP スライスへのマッピングは行いません。
DSP スライスへの Multiply-Accumulate ブロックのマッピングには、以下のリセット タイプ設定を使用します。
Xilinx® FPGA ボードの場合、[リセット タイプ] を
[同期]に設定します。Altera® FPGA ボードの場合、[リセット タイプ] を
[非同期]に設定します。
リセット タイプを設定するには、[HDL コード生成] 、 [グローバル設定] 、 [クロック設定] 、 [リセット タイプ] を選択します。
ブロック端子インターフェイスでは行列のデータ型はサポートされていません。行列型の信号がある場合は、行列乗算モードで Product, Matrix Multiply ブロックを使用します。
HDL コード生成では Resettable Subsystem ブロック内でブロックのストリーミング演算モードはサポートされていません。
このブロックでは、HDL コード生成で浮動小数点データ型はサポートされていません。
バージョン履歴
R2017b で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)