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 つのストリーミング モードがあります。これらのストリーミング モードを選択した場合、モードで使用する制御信号を指定できます。制御信号は、累積を開始および終了するタイミングおよび出力が有効である条件を指定します。
端子
入力
a — 入力信号
ベクトル | 行列 | 配列 | バス
ブロックへの入力を提供する端子。
データ型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| fixed point
b — 入力信号
スカラー | ベクトル | 行列 | 配列 | バス
ブロックへの入力を提供する端子。
データ型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| Boolean
| fixed point
| enumerated
| bus
c — バイアス信号
スカラー | ベクトル | 行列 | 配列 | バス
ブロックにバイアス信号を提供する端子。ブロックはこのバイアスを入力に加算します。バイアス信号のデータ型が入力のドット積のデータ型に一致していることを確認してください。
依存関係
この端子を有効にするには、[ソース] を [入力端子]
に設定します。
データ型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| fixed point
startIn — 累積制御信号の開始
スカラー | ベクトル | 行列 | 配列 | バス
累積を開始する制御信号を提供する端子。端子への入力として boolean
データ型の信号を使用することをお勧めします。dataOut 信号からの累積された出力値の取得を開始するには、startIn と validIn の信号がともに High になっている必要があります。dataOut 信号は、次のクロック サイクルから累積結果を生成します。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports]
に設定します。
データ型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| fixed point
validIn — 有効な入力の制御信号
スカラー | ベクトル | 行列 | 配列 | バス
入力信号が累積用に有効であることを示す制御信号を提供する端子。端子への入力として 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
endIn — 累積制御信号の終了
スカラー | ベクトル | 行列 | 配列 | バス
累積の終了を示す制御信号を提供する端子。startIn 信号および endIn 信号を validIn 信号とともに使用して、累積出力を含むフレームを示すことができます。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports]
に設定してから、[End input and output ports] を選択します。
データ型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| fixed point
出力
dataOut — 出力信号
スカラー | ベクトル | 行列 | 配列 | バス
Multiply-Accumulate 演算からの出力データを生成する端子。既定では、ブロックは [Vector]
演算モードを使用し、入力信号のドット積を計算し、バイアスを加算して結果を生成します。[演算モード] としてストリーミング演算モードを指定した場合、dataOut 信号の値は、指定した制御信号によって異なります。出力信号のデータ型は、アキュムレータのデータ型と同じです。
データ型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| fixed point
startOut — 累積出力制御信号の開始
スカラー | ベクトル | 行列 | 配列 | バス
累積の開始を示す出力制御信号を生成する端子。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
validOut — 有効な出力の制御信号
スカラー | ベクトル | 行列 | 配列 | バス
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
endOut — 累積出力制御信号の終了
スカラー | ベクトル | 行列 | 配列 | バス
累積の終了を示す出力制御信号を生成する端子。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
countOut — カウント出力制御信号
スカラー | ベクトル | 行列 | 配列 | バス
累積サンプル数を示す出力制御信号を生成する端子。この信号の値は、1
から、[サンプル数] に指定した値まで増加します。validIn 信号が High である間、countOut はクロック サイクルごとに 1
ずつインクリメントされます。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Number of Samples]
に設定してから、[Count output port] を選択します。
データ型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| fixed point
パラメーター
演算モード — 入力の累積モード
'Vector'
(既定値) | 'Streaming - using Start and End Ports'
| 'Streaming - using Number of Samples'
[演算モード] を次のいずれかとして指定します。
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' |
バイアス — 入力のドット積に加算するオフセット
{'0.0'}
(既定値)
以下のようにバイアスを指定できます。
[ソース] を
Dialog
として。この場合は、[値] を指定します。[ソース] を
Input port
として。この設定では、バイアス信号をブロックに入力する外部入力端子c
が作成されます。
プログラムでの使用
ブロック パラメーター: initValueSetting |
型: 文字ベクトル |
値: 'Dialog' | 'Input port' |
既定の設定: 'Dialog' |
[ソース] を Dialog
として設定した場合、initValue2
設定を使用して初期値を指定できます。
ブロック パラメーター: initValue2 |
型: 文字ベクトル |
値: 0 以上の整数 |
既定の設定: '0.0' |
サンプル数 — 有効な累積出力信号のサンプル数
{'2'}
(既定値)
[サンプル数] を指定して、有効な累積出力 dataOut のサンプル数を含むフレームを指定できます。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Number of Samples]
に設定します。
プログラムでの使用
ブロック パラメーター: num_samples |
型: 文字ベクトル |
値: 0 以上の整数 |
既定の設定: '2' |
出力データ型 — ブロック出力のデータ型
Inherit: Inherit via back propagation
(既定値)
出力データ型を次のように設定します。
Inherit: Same as first input
など、データ型を継承するルール。single
やint16
など、組み込みデータ型。Simulink.NumericType
オブジェクトなど、データ型オブジェクトの名前。有効なデータ型として評価される式。例:
fixdt(1,16,0)
ストリーミング モードでは Inherit: Inherit via internal rule
はサポートされていません。[出力データ型] を設定する際に [データ型アシスタント] を使用できます。アシスタントを表示するには、[データ型アシスタントを表示] をクリックします。
プログラムでの使用
ブロック パラメーター: OutDataTypeStr |
型: 文字ベクトル |
既定の設定: {'Inherit: Inherit via internal rule'} |
このパラメーターに指定できる値を確認するには、ブロック固有のパラメーターを参照してください。
整数丸めモード — 固定小数点演算の丸めモード
Floor
(既定値) | Ceiling
| Convergent
| Nearest
| Round
| Simplest
| Zero
以下のいずれかとして丸めアクションを指定します。
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'} |
このパラメーターに指定できる値を確認するには、ブロック固有のパラメーターを参照してください。
Valid output port — validOut 出力端子の生成を制御
オフ (既定値) | オン
validOut 出力端子の生成を制御します。この端子は、dataOut が有効かどうかを示します。
- オフ
validOut 出力端子を表示しません。
- オン
validOut 出力端子を表示します。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Number of Samples]
または [Streaming - using Start and End Ports]
に設定します。
プログラムでの使用
ブロック パラメーター: validOut |
型: 文字ベクトル |
値: 'off' | 'on' |
既定の設定: 'off' |
End input and output ports — endIn 入力端子および endOut 出力端子の生成を制御
オフ (既定値) | オン
endIn 入力端子および endOut 出力端子の生成を制御します。これらの端子は、有効な累積出力を含むフレームの最後を示します。
- オフ
endIn 入力端子および endOut 出力端子を表示しません。
- オン
endIn 入力端子および endOut 出力端子を表示します。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports]
に設定します。
プログラムでの使用
ブロック パラメーター: endInandOut |
型: 文字ベクトル |
値: 'off' | 'on' |
既定の設定: 'off' |
Start output port — startOut 出力端子の生成を制御
オフ (既定値) | オン
startOut 出力端子の生成を制御します。この端子は、有効な累積出力を含むフレームの開始を示す startOut 信号を生成します。
- オフ
startOut 出力端子を表示しません。
- オン
startOut 出力端子を表示します。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Start and End Ports]
に設定します。
プログラムでの使用
ブロック パラメーター: startOut |
型: 文字ベクトル |
値: 'off' | 'on' |
既定の設定: 'off' |
Count output port — countOut 出力端子の生成を制御
オフ (既定値) | オン
countOut 出力端子の生成を制御します。この端子は、有効なサンプルを含むフレームを示すカウンターを生成します。
- オフ
countOut 出力端子を表示しません。
- オン
countOut 出力端子を表示します。
依存関係
この端子を有効にするには、[演算モード] を [Streaming - using Number of Samples]
に設定します。
プログラムでの使用
ブロック パラメーター: countOut |
型: 文字ベクトル |
値: 'off' | 'on' |
既定の設定: 'off' |
ヒント
Multiply-Accumulate ブロックでは次のことが可能です。
行列乗算演算を実行する。たとえば、次元が
N-by-M
およびM-by-P
の 2 つの行列入力がある場合、N-by-P
Multiply-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 コード生成
HDL Coder™ を使用して FPGA 設計および ASIC 設計のための VHDL、Verilog および SystemVerilog のコードを生成します。
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 コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)