STM32H7 - FMAC
フィルタ数値演算アクセラレータ

1.0版

こんにちは、STM32H7 FMACブロックのプレゼンテーションへようこそ。
自律的にバックグラウンドで信号処理フィルタリングタスクを実行するために使用されるこのブロックの主な特徴について説明しま
す。

1

概要
• The Filter Math ACcelerator (FMAC)ユニット

コントロール&シーケンス• 乗算/アキュムレータ(MAC)ユニットとサーキュラ･バッファを使ったデジタル･フィルタを搭載(入出力)

バッファベースアドレスptrs
バッファサイズレジスタ

DMA_req2

リードポインタ• 乗算アキュムレータ(MAC)ユニット

ライトポインタ

INT_req• 16x16ビット乗算

x1、x2オフセットポインタ
yオフセットポインタ• 加算と減算が可能な24+2ビット･アキュムレータ

Addr

AHB

ローカル･メモリ
X1
バッファ

X2
バッファ

x1 16b

MAC

x2

Y
バッファ

16b

y

16b

アプリケーション側の利点• 固定小数点• 有限および無限の衝動応答フィルタの両方を実装• 256x16ビットローカル･メモリ

FMACユニットは固定小数点乗算器とアキュムレータ（MAC）を中心に構築されています。
MACユニットは、内部の256x16ビットRAMから2つの固定小数
点16ビットオペランドを受け取り、このメモリに結果を書き戻します。

ローカルメモリ内の入力値のアドレスは、ポインタをセットし使用します。
これらのポインタは、内部ハードウェアによってロード、インクリメ
ント、デクリメント、またはリセットできます。
ソフトウェアはそれらに直接アクセスしません。
このユニットは、頻繁にある、または長時間のフィルタリング操作
をCPUからオフロードできるようにし、プロセッサを他のタスクに解放します。

2

機能

3• 有限インパルス応答(FIR)と無限インパルス応答(IIR)フィルタの両方を実現可能• ターゲット･アプリケーション• モータ制御、オーディオ、デジタル電源、照明、アナログ･センシング(ヘルス、フィットネス、
ロボティクス、….)• CPUのオフロード• バックグラウンドで信号のフィルタリング･タスクを自律的に実行• CPUのMIPSを他のタスクへ開放するため、CPUの処理を最小限に• 主な目的• フィルタの種類、順番、Coeffはプログラミング可能

フィルタ機能FIRとIIRはFMACによって実現することができます。
これらのフィルタを必要とする一般的なアプリケーションは、モータ制御、オーディオ、電源、照明、アナログセンシングです。
FMACは、バックグラウンドの信号のフィルタリングタスクを自律的に実行し、CPUからオフロードし、その結果 他のタスクへ
CPUのMIPSを解放します。
FMACユニットを使用すると、ユーザーはフィルタタイプ、フィルタの順序、Coeff係数をプログラミングできます。

3シングルMACアーキテクチャ

4• 積の合計は、各出力サンプルに対するN+M+1乗算累積(MAC)演算となる• コストを節約するために、1つのMACを繰り返し使用
y[n]
Input
samplebufferx[n]y[n-1]

x[n-1]

y[n-2]

x[n-2]

y[n-3]<<

x[n-N]
countx coeffs

sel

Acc

Outputsamplebuffery[n-M]𝑦𝑛 =𝑏 𝑘 𝑥 𝑛−𝑘 +𝑎[𝑗]𝑦 𝑛 − 𝑗

count

b[0]

a[1]

b[1]

a[2]

b[2]

a[3]

b[N]

a[M]

y coeffs

この図は、MACユニットのアーキテクチャの詳細を示しています。
Xは、フィルタリングする元サンプルを含む入力サンプルバッファです。
Bは、Xサンプルに適用されるフィルタのCoeffの配列です。
XとBのサイズは同じです。：N+1エントリ。
Yは、フィルタリングの結果を含む出力サンプルバッファです。
Aは、Yサンプルに適用されるフィルタの係数の配列です。
YとAのサイズは同じです。：M+1エントリ。
y[n]=（N + 1）+ Mを取得するMAC操作の数：•累積ベクトルXとベクトルBを乗算するN + 1 MAC。
•累積ベクトルY [n-1：n-M]とベクトルAを乗算するM個のMAC

4

データフォーマット

5• FMACの入力と出力は、固定小数点符号付き整数q1.15フォーマットを使用。
• q1.15フォーマットでは、数値は1つの符号ビットと15個の小数ビット(2進数)で表す• したがって、数値範囲は-1(0x8000)から1 -2＾15 (0x7FFF)

q1.15フォーマット

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

s

c14

c13

c12

c11

c10

c9

c8

c7

c6

c5

c4

c3

c2

c1

c0

Fractional_number= (−1) ∑𝑐• 32ビット浮動小数点数は、ソフトウェアの乗算とキャストによって固定小数点に変換可能(Cortex®-M7 FPUを使用):• value_q15 = (int16_t)(value_f32*0x8000); /* f32 to q1.15 –8サイクル必要 */• value_f32 = (float)value_q15/(float)0x8000; /* q1.15 to f32 –10サイクル必要 */FMACの入出力は、固定小数点符号付き整数q1.15形式を使用します。
q1.15形式では、数値範囲は1（0x8000）～1-2^15（0x7FFF）です。
72ビットの単精度浮動小数点数は、Cortex-M7 FPUで実行される専用の変換命令によってq1.15形式との間で変換できます5

データフォーマット

6

Binary
point
b15

Input
(q1.15)

入力(q1.15)

b0

S
Multiply

入力(q1.15)

b15

Coeff
(q1.15)

Product(q2.30)

乗算

b0Multiplication of two q1.15 values in range 0x8000 to 0x7FFF (-1.0 to
0.99997) results in q2.30 product in range 0xC0008000 to 0x40000000(-0.99997 to +1.0)

S

b31

S

b0

I
Accumulate

アキュムレートSum(q4.22)

b25

S

b0

I

I

8 x LSB’s truncatedI

3 x MSB’s truncated

ゲイン前の出力(q1.15)
ゲイン後の出力(q1.15)

Output(q1.15)b15

b0

Binarypoint

Gain of 2n implies truncationof n MSB’s and 7-n LSB’s

gain = 20

S

Output(q1.15)b15

b0

gain = 27

S
Binarypoint

この図は、FMACによって内部的に使用されるさまざまな形式の詳細を示しています。
乗算器の出力（q2.30フォーマット）はq2.22に切り捨てられ、アラインメントされたLSBに追加されます。
アキュムレータには26ビットがあり、そのうち22ビットは小数で、4ビットは整数/符号（q4.22）です。
余分な整数ビットにより、アキュムレータは-8（0x4000000）～+8（0x3FFFFFF）の範囲の部分的な累積合計をサポートできます。
これは、連続する正または負の係数が多数ある場合に発生する可能性があります。
すべての周波数でフィルタゲインが1未満の場合、アキュムレータ値は常に範囲+/- 1に戻ります。
部分的な合計がアキュムレータの数値範囲を超える場合（ラップ）、ス
ティッキフラグが設定されてデバッグを支援します。
それでも、その後の追加でラッピングが取り消される場合でも、正しい結果が得られます。
アキュムレータの出力にプログラム可能なゲインを適用できます。
6dBのステップで0dBから42dBまで。
これは、IIRフィルタの実装に必要です。

6

データバッファ7• フィルタ数値演算アクセラレータ･ユニットは、ベクトルに対して算術演算を実行• データ・バッファ(2つの入力、1つの出力)のメモリ内に最大3つの領域を定義プログラム可能なベースアドレス・ポインタおよび関連するサイズ・レジスタによって定義される
内蔵SRAMX1BUFCFG[X1_BASE]X1BUFCFG[X1_BUF_SIZE]

X1バッファ

X2BUFCFG[X2_BASE]X2BUFCFG[X2_BUF_SIZE]

X2バッファYBUFCFG[Y_BASE]YBUFCFG[Y_BUF_SIZE]Yバッファ

FMACユニットは、16ビットの固定小数点スカラー値の配列であるベクトルに対して算術演算を実行します。
これらのベクトルはローカルSRAMに割り当てられます。
ソフトウェアは、X1BUFCFG、X2BUFCFG、およびYBUFCFGレジスタを介してX1およびX2オペランドバッファとY出力バッファを構成します。
すべてのバッファが内部メモリアドレスの範囲（0x00〜0xFF）に収まる場
合、ベースメモリは内部メモリのどこでも選択できます。
バッファのベースアドレスとサイズをプログラムする必要があります。
X1、X2、およびYバッファは重複する場合があることに注意してください。
これらのバッファは、CPUマッピングでは表示されません。

7

入力バッファの初期化

8• CPU(またはDMAコントローラー)は、初期化関数を使用して各バッファの内容を初期化し、書込みデータ･レジスタに書き込む• 操作の前にベクトルの要素をロード、フィルタとロード･フィルタのCoeffを初期化するために使用

Xバッファコントロール
&
シーケンス

ポインタの
書き込み

データの
書き込み

WDATAレジスタ

フィルタ操作を開始する前に、CPUまたはDMAコントローラは、初期化関数を使用してWDATAレジスタに書き込むことにより、入力バッファの内容を初期化します。
入力バッファの内容は、フィルタリングされるデータまたはフィルタのcoeffのいずれかです。
データは、書き込みポインタによって示されるターゲットバッファ内の場所に転送されます。
新しい書き込みのたびに、書き込みポインタがインクリメントされます。
書き込みポインタは、割り当てられたバッファスペースの最後に到達すると、ベースアドレスに戻ります。

8

サーキュラ･バッファ
サーキュラ･バッファ
オペレーション

X1バッファ

X2バッファ

Y バッファ

オプション

N/A

オプション

9

• CPUまたはDMAアクティビティを調整するため、ウォーターマーク･レベルの設定可能
X1バッファ

Yバッファ
空き領域

エントリの読み取り

ソフトウェア/DMA
によって書かれた
エントリ

バッファサイズ

ソフトウェア/DMAで読み取るエントリ

バッファサイズ

空き領域

エントリの読み取り

バッファー内の空きスペースの数が< 2FULL_WM

バッファフル
フラグ

FALSE

TRUE

バッファ内の未読の値の数が< 2EMPTY_WM

バッファエンプティ
フラグ

FALSE

FALSE

TRUE

FALSE

t

割り込み要求
DMA要求

割り込み要求DMA要求

t

割り込み要求
DMA要求

割り込み要求DMA要求

X1バッファに関して、バッファ内の空きスペースの数がFMAC_X1BUFCFGレ
ジスタのFULL_WMフィールドにプログラムされたウォーターマークのしきい値よりも少ない場合、バッファはフルとしてフラグが立てられます。
フルフラグが設定されていない限り、割り込みまたはDMA要求が有効になっている場合、バッファの追加データを要求するために それらが生成されます。
このウォーターマークにより、オーバーフローの危険なしに、1回の割り込みで複数のデータを転送できます。
それでも、オーバーフローが発生した場合、OVFLエラーフラグが設定され、書き込みデータは無視されます。
オーバーフローが発生しても、書き込みポインタは増加しません。
Yバッファについては、バッファ内の未読データの数がFMAC_YBUFCFGレジ
スタのEMPTY_WMフィールドにプログラムされたウォーターマークのしきい値よりも少ない場合、バッファは空としてフラグが付けられます。
空のフラグが設定されていない限り、割り込みまたはDMA要求が生成され、有効になっている場合バッファからの読み取りを要求します。
ウォーターマークにより、アンダーフローの危険なしに、1つの割り込みで複数のデータを転送できます。
それでも、アンダーフローが発生すると、UNFLエラーフラグが設定されます。
この場合、読み取りポインタはインクリメントされず、読み取り操作は読み取り
ポインタアドレスのメモリの内容を返します。

9

入力バッファ10• X1およびX2バッファは、MACへの入力用のデータを格納するために使用される• コントロール･ユニット内のポインタは、各値の読み取りアドレス・オフセット(バッファ・ベース・アドレ
スに対する相対)を生成• ポインタは、現在の関数に従ってハードウェアによって管理される
コントロール&
シーケンス

内蔵SRAM

X1読み取りポインタ

X1バッファ
MAC

X1読み取りポインタ

X2バッファ

各乗算は、X1バッファから値を受け取り、そしてX2バッファから値を受け取り、それらを乗算します。
コントロールユニット内のポインタは、各値の読み取りアドレスオフセット（バッファベースアドレスに相対する）を生成します。
ポインタは、現在の関数に従ってハードウェアによって管理されます。

10

入力データX1バッファ• フィルタは、出力サンプルy[n]を計算するためにN+1サンプル(入力セット)のセットを使用

x1バッファ

X1_BASE

使用可能なバッファ・スペースx1[n-N]…
x1[n-1]x1[n]X1_BUF_SIZE

11y[n] の計算に使用される値• 計算が完了すると、次のサンプル(x1[n+1])が入力セットに追加
最も新しいサンプル(x1[n-N])が削除され、バッファ内の領域が解放される…

x1[n+1]
次の値は既に読み込まれているy[n+1] を計算するため

x1[n+4]
ポインタの書き込み使用可能なバッファ・スペース• 入力データ・レジスタに到着した新しいサンプ
ルは、書込みポインタのバッファに書込まれる• これは常に、入力セット内の最新のサンプルx[n]の後の最初の使用可能なスペースを示す

この図は、X1バッファ操作を説明しています。
書き込みポインタがバッファの最後に到達すると、先頭に戻ります。
バッファ内の使用可能なスペースが転送サイズより小さい場合、入力バッ
ファのフルフラグがアクティブになります。
入力セットの最上部であるx [n]が書き込みポインタに等しい場合（つまり、利用可能な新しいサンプルがない場合）、新しいサンプルが利用可能になるまでフィルタは停止します。
プロセッサ、またはDMAコントローラは、必要に応じて新しいサンプル
x[n+1]がバッファスペースで利用できるようにする必要があります。
そうでない場合、バッファには空のフラグが付けられ、新しいサンプルが追加されるまでユニットの実行が停止します。
X1バッファではアンダーフロー状態は通知されません。

11

入力データX1バッファ
X1_BASEx1バッファ
ポインタの書き込み

使用可能なバッファ・スペース…
x1[n-1]x1[n]x1[n+1]• X1バッファはサーキュラ･バッファとして使用可能• このバッファの事前読込みは、デジタル･フィルタではオプション

x1[n-N]…

X1_BUF_SIZE

12y[n]の計算に使用される値• プリロードは、ベクトル演算の場合には役に立つ次の値は既に読み込まれているy[n+1]を計算するため

x1[n+4]

X1バッファは、サーキュラバッファとして使用できます。
スペースが利用可能になると、新しいデータが入力バッファに継続的に転送されます。
書き込みポインタは、図に示すように、バッファ内の最後の16ビットエントリに到達すると自動的に折り返されます。
操作の開始時に入力サンプルがバッファに書き込まれていない場合は空としてフラグが付けられ、操作を開始するのに十分になるまでCPUまたはDMAをトリガして新しいサンプルをロードするため、デジタルフィルタの場
合、このバッファのプリロードはオプションです。
それにもかかわらず、プリロードはベクトル演算の場合に役立ちます。つまり、入力データはすでにシステムメモリで利用可能であり、サーキュラ演
算は必要ありません。

12

入力データX2バッファ

13• X2バッファはベクトル･モード(サーキュラ･モードではない)でのみ使用でき、バッファの内容が1つの操作から次の操作に変更されない場合を除き、プリロードする必要がある• フィルタ関数の場合、X2バッファを使用してフィルタのCoeffを格納

X2バッファは、Coeffを格納するために使用されます。
これは通常、FMACの初期化時に１回ロードされます。
したがって、それはサーキュラアドレッシングモードをサポートしていません。

13

入力バッファX1オペレーション

14• N=8および4サンプルDMA転送を使用したフィルタ図
1

ポインタの
書き込み

x[n-7]
x[n-6]
x[n-5]
x[n-4]
x[n-3]
x[n-2]
x[n-1]
x[n]x[n+1]
x[n+2]
x[n+3]
x[n+4]

8サンプルx[n-7]~x[n]を使用してフィルタ処理
 次の4つのサンプルは既に読み込まれている 4つのバッファ位置が利用可能 フルフラグが設定されていない

2

ポインタの
書き込み

x[n-7]
x[n-6]
x[n-5]
x[n-4]
x[n-3]
x[n-2]
x[n-1]
x[n]x[n+1]
x[n+2]
x[n+3]

n←n+1
フィルタは現在の出力サンプルを終了し、最も古いサンプルは不要になるためバッファ
内の次のサンプルを使用して領域を解放

3

4
ポインタの書
き込み

ポインタの
書き込み

x[n-7]
x[n-6]
x[n-5]
x[n-4]
x[n-3]
x[n-2]
x[n-1]
x[n]x[n+1]
x[n+2]

n←n+1
フィルタは現在の出力サンプルを終了し、最も古いサンプルは不要になるためバッファ
内の次のサンプルを使用して領域を解放

x[n-7]
x[n-6]
x[n-5]
x[n-4]
x[n-3]
x[n-2]
x[n-1]
x[n]x[n+1]
x[n+2]
x[n+3]
x[n+4]
x[n+5]
バッファに書き込まれた4つの新しいサンプル
 4ずつインクリメントされた書き込み
ポインタ 書込みポインタが末尾に達すると、先頭に折り返される

この図は、入力バッファの動作をまとめたものです。
ステップ1の間、フィルタはx[n-7]からx[n]までy[n]を計算し、次の4つのサンプルを読み込みます。
ステップ2の間にy[n]が計算されるようになると、サンプルx[n-7]が削除されます。次に、nがインクリメントされます。フィルタは、
y[n]をx[n-7]からx[n]に計算します。新しいサンプルは読み込まれません。
ステップ3の間にy[n]が計算されるようになると、サンプルx[n-7]が削除されます。次に、nがインクリメントされます。フィルタは、
y[n]をx[n-7]からx[n]に計算します。新しいサンプルは読み込まれません。
ステップ4の間にy[n]が計算されるようになると、サンプルx[n-7]が削除されます。次に、nがインクリメントされます。フィルタは、
y[n]をx[n-7]からx[n]に計算します。4つの新しいサンプルが読み込まれます。バッファの上のアドレスに達したので、バッファの先頭に折り返しが発生します。

14

出力サンプル･バッファYバッファY_BASE

使用可能なバッファ・スペース

Output data reg…

Y_BUF_SIZE…

y[n-M]• Y(出力)バッファは、アキュムレータの出力を格納するために使用• 新しい各出力値は、プロセッサまたはDMAコントロー
ラによって読み取られるまでバッファに格納

y[n-M-4]y[n-M-2]
y[n-M-1]15

これらのサンプルはまだ読んでいないこれらのサンプルはy[n]の
計算に使用

y[n]
Next sample

使用可能なバッファ・スペース• フィルタは、出力サンプルy[n]を計算するためにM
出力サンプル(出力セット)のセットを使用• 計算が完了すると、新しいサンプル(y[n])がセットに追加され、最も新しいサンプル(y[n-M])がセットから削除される• 新しいサンプルは書込みポインタのバッファに書き込まれる• これは常に、セット内の最新のサンプルy[n-1]の後の最初の空き領域を示す• Yバッファは、サーキュラ･バッファとしても動作

この図は、Yバッファの動作を説明します。
書き込みポインターがバッファの末尾に達すると、先頭に折り返されます。
リードポインタは、データが出力レジスタに対応し、最も古い未読
み取りサンプルを指示します。
サンプルが読み取られ、出力セットの一部ではない場合、スペー
スは空になります。
書き込みポインタが読み取りポインターまたは出力セット内の最も最新でないサンプル(y[n-M])と等しい場合、フィルタは停止し、出力バッファのフルフラグが設定されます。

15

出力バッファ･オペレーション

16• M=7および4サンプルDMA転送を使用したIIRフィルタ
1
ポインタの
読み取り

ポインタの
書き込み

y[n-12]y[n-11]y[n-10]y[n-9]
y[n-8]
y[n-7]
y[n-6]
y[n-5]
y[n-4]
y[n-3]
y[n-2]
y[n-1]
y[n]

2

ポインタの
読み取り

ポインタの
書き込み

7サンプルy[n-7]~y[n-1]を使用たフィルタ 書き込みポインタで書かれた次のサンプル
 バッファ内の11個の未読サンプル(読み取
りポインタはy[n-11])y[n-8]
y[n-7]
y[n-6]
y[n-5]
y[n-4]
y[n-3]
y[n-2]
y[n-1]y[n]n ← n+1
新しい出力サンプルが出力セットに追加され、ポインタがインクリメント
 4つのサンプルはバッファから読み取り、ポインタを4ずつインクリメントして4つのスペースをすべて解放

3

ポインタの
読み取り

ポインタの
書き込み

y[n-7]
y[n-6]
y[n-5]
y[n-4]
y[n-3]
y[n-2]
y[n-1]y[n]4つのサンプルはバッファから読み取られ、ポインタを4ずつインクリメント
 読み取りポインタは出力セット内のサン
プルを指すため、y[n-7]までのバッファ位
置のみが使用可能

この図は、出力バッファの動作をまとめたものです。
ステップ1の間、フィルタはy[n-7]からy[n-1]までy[n]を計算します。
11個のサンプルが未読です。
ステップ2の間にnがインクリメントされると、フィルタはy[n-7]から
y[n-1]までy[n]を計算します。ソフトウェアまたはDMAは4つのサンプルを読み取り、読み取りポインタは最も古いサンプルに移動します。
ステップ3の間にnがインクリメントされると、フィルタはy[n-7]から
y[n-1]までy[n]を計算します。ソフトウェアまたはDMAは4つのサンプルを再度読み取り、読み取りポインタは最も古いサンプルに移動します。ただし、サンプルy[n-7]~y[n-5]は現在の計算で使用されるため、割り当て解除されません。

16

汎用デジタル･フィルタ

17

有限インパルス応答(FIR)フィルタ、ダイレクトフォーム1ストラクチャ
b [0 ]FIRx [n]• 有限インパルス応答(FIR)デジタルフィルタは、入力サンプリン
グ･データストリームx[n]と係数b[k]のセットとの間の畳み込み

2R
y[ n]

Z -1

b [1 ]

𝑦 𝑛 =2x[n -1]
Z -1

b [2 ]

x[n -2]Z -1

𝑏 𝑘 𝑥 𝑛−𝑘b [3 ]

バッファ

利用

パラメータ

X1

サンプリングされた
データ

P

ベクトルBの長さ

X2フィルタCoeff

Q

未使用

Y

出力値

R

出力に適用されるゲイン

説明

FIR関数は、フィルタ係数を含む長さN+1のベクトルBと、サンプリングされたデータを含む無期限の長さのベクトルXの畳み込みを実行します。
FMACでFIRを実装するには、バッファを次のように使用します。
•X1バッファにはベクトルXの要素が含まれます。長さN+1+dのサーキュラバッファである。
•X2バッファにはベクトルBの要素が含まれます。長さN+1の固定バッファである。
•Yバッファには出力値ynが含まれます。長さdのサーキュラバッ
ファである。
ここでパラメータは次のとおりです。
•パラメータPには、CoeffベクトルBの長さN+1が範囲[2:127]で含まれます。
•パラメータRには、アキュムレータ出力に適用されるゲインが含まれます。Yバッファに出力される値は2Rで乗算され、Rは範囲内にある[0:7]•パラメータQは使用されません。
この機能は、FMAC_PARAM・レジスタ内のSTARTビットがソフト
ウェアによってリセットされると完了します。
17

汎用デジタル･フィルタ

18

有限インパルス応答(FIR)フィルタ、ダイレクトフォーム1ストラクチャ• メモリサイズ要求• N CoeffとN個の入力サンプルを計算• 各入力サンプルはN回使用• スループットを最適化するには、入力バッファ･サイズをN + にする必要がある• これにより計算に使用されていない間に1つのDMA要求でサンプルを読み込むことが可能• 出力バッファ･サイズは、DMA転送サイズと一致するようにする必要がある• 合計メモリサイズ要求:2(N + ) ＜ 256

FIRでは、1つの出力サンプルを計算するためにN CoeffとN個の入力サンプルが必要です。
スループットを最適化するには、フィルタが現在のセットで作業している間、次のサンプルを読み込むために、入力バッファサイズ
をNより大きくする必要があります。
たとえば、4ビートDMA転送を使用する場合、εは4に設定する必要があります。
また、出力バッファーのサイズをεに設定して、結果のサンプルを
一意のAHBバーストトランザクションで転送する必要があります。

18

汎用デジタル･フィルタ

19

無限インパルス応答(IIR)フィルタ、ダイレクトフォーム1ストラクチャ
b[0]

FIR

IIR

2R

x[n]

y[n]
Z -1

b[1]

a[1]

x[n-1]• 無限インパルス応答(IIR)フィルタは、FIR出力y[n]と2番目の係数セットa[j]の間のFIRと2番目の畳み込みの組合せ

Z -1
y[n-1]

Z -1

b[2]

a[2]

x[n-2]

Z -1

𝑦 𝑛 =2𝑏 𝑘 𝑥 𝑛−𝑘 +𝑎[𝑗]𝑦 𝑛 − 𝑗y[n-2]

Z -1

b[3]

a[3]

Z -1

バッファ

利用

X1

サンプリングされたデータ

X2連結されたCoeffベクトルBとA (b0, b1, ..., bN, a1,, ..., aM)

Y

出力値

パラメータ

説明

P

ベクトルBの長さ

Q

ベクトルAの長さ

R

出力に適用されるゲイン

IIRフィルタ出力ベクトルYは、長さN+1のCoeffベクトルBと無期限長のベク
トルXの畳み込みに加えて、2番目のCoeffベクトルAの遅延出力ベクトル
Y‘の畳み込みに加えて、長さMの結合です。
FMACでIIRを実装するには、バッファを次のように使用します。
•X1バッファにはベクトルXの要素が含まれます。長さN+1+dのサーキュラ
バッファである。
•X2バッファには、CoeffベクトルBとAを連結した要素が含まれます(b0、b1、b2...、bN、a1、a2、...、aM)。長さM+N+1の固定バッファである。
•Yバッファには出力値ynが含まれます。長さM+dのサーキュラバッファである。

パラメータは次のとおりです。
•パラメータPには、CoeffベクトルBの長さN + 1の範囲[2:64]が含まれます。
•パラメータQには、CoeffベクトルAの長さMが範囲[1:63]で含まれます。
•パラメータRには、アキュムレータ出力に適用されるゲインが含まれます。
Yバッファーに出力される値は2Rで乗算され、Rは[0:7]の範囲になります。
この機能は、FMAC_PARAM・レジスター内のSTARTビットがソフトウェア
によってリセットされると完了します。

19

汎用デジタル･フィルタ20

無限インパルス応答(IIR)フィルタ、ダイレクトフォーム1ストラクチャ• メモリサイズ要求• NフィードフォワードCoeffとMフィードバックCoeff(M ~ N)
• N個の入力サンプルとM出力サンプルで1つの出力サンプルを計算• DMA転送サイズ
• 合計メモリサイズ要求：2(N + M + ) < 256

FIRにはNフィードフォワードCoeffとMフィードバックCoeffが必要
で、MはNより小さくなります。
入力バッファサイズはN + ε、εはDMAバースト内のデータ数である必要があります。
出力バッファサイズはM+εである必要があります。

20

スループット21• Nタップフィルタには、出力サンプルごとにN乗算と加算が必要• 1サイクルあたり1回の乗算+加算を想定すると、最大スループット = サンプルあたりのNサイクル• 実際には、1つの乗算は、メモリからの2つのフェッチを必要とする(Coeff+サンプル)• メモリは単一ポートであるため、MACオペレーションごとに2つのサイクルが必要• したがって:• 最大サンプル･レート, Fs < Hclk÷(2N)• 最大フィルタ･サイズ, N < Hclk÷(2Fs)

FMACモジュールのクロックリファレンスは、AHBクロックHCLKです。
HCLKの最大周波数は、CPUの最大周波数の半分です。
FIRなどのNタップフィルタでは、出力サンプルごとにNの乗算と加算が必要で、それぞれMACが2クロックサイクルを必要とし、2つのメモリ値を読み取ります。
その結果、最大サンプルレートはHclk/(2*N)になります。
NはHclk周波数よりも低く、最大サンプルレート周波数の2倍で割った値にする必要があります。
STM32H7のHclk周波数が275MHzであると仮定すると、以下が得られます。
• Fs = 2Msps での最大フィルタサイズは N < 68タップです• N = 127タップの最大サンプルレートは Fs ＜ 1.08MHzです。

21フロー･コントロール

22

ソースドリブン･フロー･コントロール• サンプルのソース(A/Dコンバータ、I2C、...)は、サンプル･データレートを定義

ソース･ペリフェラル(A/Dコンバータ, I2C,
…)

DMA
転送

DMA
転送
FMAC

シンク
(メモリまたはペリフェラル)リード

DMAリクエストDMA

DMAリクエスト

DMA

フローコントロールは、ソース、シンク、またはフィルタドリブンにすることができます。
このスライドでは、ソースドリブンフローコントロールシーケンスについて説明します。
サンプルのソース(A/Dコンバータ、I2C、...)は、サンプルデータ
レートを定義します。
ソースは、フィルタ入力バッファにデータを転送するDMA(またはCPU)にリクエストします。
フィルタは、ソースサンプルレートの2N倍よりも速いクロックレー
トで動作します。
入力バッファーが空の場合(次のサンプルは使用できない)、フィルタは停止し、新しいデータが来るまで待機します。
出力バッファーが空でない場合(1つ以上のサンプルが使用可能)、
出力チャネルDMAリクエスト(または割り込み)が生成されます。
DMA(またはCPU)は、出力サンプルをメモリまたはD/Aコンバー
タやPWMなどの別のペリフェラルに転送します。

22フロー･コントロール

23

フィルタ･ドリブン･フロー･コントロール• フィルタ･クロック･レートによってスループットが決定

ソース(メモリまたはペリフェラル)

DMA
転送

DMA
転送
FMAC
ライト

DMA

シンク
(メモリまたはペリフェラル)リード

DMAリクエスト

DMA

このスライドでは、フィルタドリブンフローコントロールシーケンスについて説明します。
フィルタクロックレートによってスループットが決まります。
入力バッファーがいっぱいでないと、入力チャネルDMAリクエス
ト(または割り込み)が生成されます。
DMA(またはCPU)は、メモリまたは別のペリフェラルから入力
バッファにデータを転送します。
入力バッファでデータが使用可能である限り、フィルタは新しい出力サンプルを生成します。
出力バッファが空でない場合は、出力チャネルDMAリクエスト(または割り込み)が生成されます。
DMA(またはCPU)は、出力バッファからメモリまたは別のペリフェラルにデータを転送します。

23フロー･コントロール

24

シンク･ドリブン･フロー･コントロール• サンプルの送信先(D/Aコンバータ、I2C、...)が、サンプル･データレートを定義

メモリまたはペリフェラル

DMA
転送

DMA
転送
FMAC

シンク･ペリフェラル(D/Aコンバータ,I2C,
…)

ライト

DMA

DMAリクエストDMA

DMAリクエスト

このスライドでは、シンクドリブンフローコントロールシーケンスについて説明します。
サンプルの送信先(D/Aコンバータ、I2C、...)は、サンプルデータ
レートを定義します。
送信先は、フィルタ出力からデータを転送するようにDMA(またはCPU)を要求します。
フィルタは、送信先のサンプルレートの2N倍よりも速いクロック
レートで動作します。
出力バッファがいっぱいになると、フィルタは停止します。
入力バッファがいっぱいでない場合は、入力チャネルDMAリクエ
スト(または割り込み)が生成されます。
DMA(またはCPU)は、メモリまたは別のペリフェラルから入力
バッファにサンプルを転送します。

24フロー･コントロール

25

概要• 入力バッファが空ではなく、出力バッファがいっぱいでない場合、フィルタが動作• 入力バッファのフル条件と出力バッファの空の条件は、それぞれの入力フラグと出力フラグを設定• 入力バッファのフルフラグが非アクティブの場合に入力チャネルDMAリクエストを生成するようにフィルタを構成• 出力バッファの空フラグが非アクティブの場合に出力チャネルDMAリクエストを生成するようにフィル
タを構成出来る• フィルタは、いずれかのフラグが非アクティブの場合に割込みリクエストを生成することも可能• フィルタクロック周波数は、選択したフローコントロール･スキームに従って選択する必要がある

入力バッファが空ではなく、出力バッファがいっぱいでない場合、
FMACはフィルタ・アルゴリズムを実行します。
使用可能なスペースの数がX1バッファの場合、X1FULLというフラグがFULL_WMしきい値より少ない場合は、X1FULLというフラグが設定されます。
このフラグがX1バッファを埋めるために設定されていない場合は、
DMAリクエストを生成できます。
未読データの数がEMPTY_WMしきい値より少ない場合は、
YEMPTYというフラグが設定されます。
DMAリクエストは、このフラグがYバッファを空にするために設定されていない場合に生成できます。
バッファの管理は、いずれかのフラグが非アクティブなときにアサートできる割り込みリクエストに依存するソフトウェアによっても実行できます。
フィルタクロック周波数は、選択したフローコントロールスキームに従って選択する必要があります。

25

低電力モード
モード

26

説明

RUN

有効

SLEEP

有効
• ペリフェラルの割込みにより、デバイスがSLEEPモードを終了

低電力RUN

有効低電力SLEEP

有効• ペリフェラルの割込みにより、デバイスが低電力SLEEPモードを終了

STOP /STOP 1
STOP 2
STANDBY

使用不可

SHUTDOWN

FMACユニットは、RUN、低電力RUN、SLEEP、低電力SLEEP
モードで有効です。
他の低電力モードでは使用できません。

26

関連情報

27

• 必要に応じて、この周辺機器にリンクされているこれらのトレーニングを参照してください。
• DMA – ダイレクトメモリアクセスコントローラ• Interrupts – 割込み• 必要に応じて、この周辺機器にリンクされているこれらのトレー
ニングを参照してください。
DMA – ダイレクトメモリアクセスコントローラ
Interrupts – 割込み27