PSoC5LP Prototyping Kit (17) --- DFB と Filter (9)

DFB (Digital Filter Block) の「ミニ DSP」エンジンの命令語では ACU (Address Calculation Unit) に対しては、32 ビットのうち、

  • ACU A へのコマンド — 4 bit
  • ACU B へのコマンド — 4 bit
  • ACURAM のアドレス指定 — 4 bit

の、計 12 ビットが割り当てられています。
ACU はそれぞれ 128 ワードあるデータ RAM A / B に対して、それぞれ専用のユニットになっており、読み書きの対象となるデータ RAM アドレスを生成する機能を持っています。
ただし、ACURAM A / B に対するアドレス指定ビットは両者に共通で、ACURAM A / B が「串刺し」にされた状態でアクセスされます。
ACU で生成されるアドレス出力には 2 つのタイプがあり、ひとつは、ACURAM を使った「間接アドレシング」によるランダム・アクセスです。
ACURAM は A / B それぞれ (7 ビット × 16 エントリ) の構成になっています。 7 ビット幅の出力なので 128 ワードのデータ RAM の全てのアドレスを指定可能であり、ランダム・アクセス可能です。
DSP 命令中のアドレス・フィールドの幅は 4 ビット、つまり 16 個のアドレスしか指定できませんが、このフィールドを ACURAM のアドレスとして与えて、16 エントリの中から 1 エントリを選ぶ間接アドレシング方式になっています。
つまり、あらかじめ必要なデータ RAM の「絶対アドレス」を ACURAM に登録しておけば、即時に 16 エントリの中から 1 エントリを選んでランダム・アクセスすることができます。 プログラムの実行時に ACURAM の内容を書き換えることも可能なので、ACURAM を「データ RAM アドレス定数の配列」あるいは「データ RAM アドレス変数の配列」として使うことができます。
Filter コンポーネントで生成される FIR フィルタ・プログラムでは、実際に ACURAM 書き換えを実行しています。
前述のように、この配列のエントリの選択に使う 4 ビット・インデクスは ACURAM A / B 共通に与えられるので、同じインデクスに対する配列のデータが読み出され、 A / B それぞれ 7 ビットのデータの合計 14 ビットが串刺しで出力されます。
1 命令で ACURAM A / B それぞれ別のエントリのデータを同時に操作することはできません。 そうしたい場合には 2 つの命令に分けて、片方で A の操作、もう片方で B の操作を行います。
ACU で扱う、もうひとつのアドレス出力タイプは、7 ビット幅の「データ RAM アドレス・ポインタ・レジスタ」による「シーケンシャル」なアドレス指定です。
7 ビット・レジスタなのでデータ RAM の 128 アドレスすべてに渡って指定可能ですが、ポインタ・レジスタの値の変更は基本的にはインクリメント/デクリメントすることで行います。
もちろん、ACURAM に格納されている「絶対アドレス」を読み出してポインタ・レジスタを初期化することも可能です。
ポインタ・レジスタ経由でのデータ RAM アクセス方法では、下の 4 つのレジスタを使用します。

  • REG — ポインタ・レジスタ本体
  • FREG — 「addf」、「subf」コマンドの場合に使われるインクリメント/デクリメント量を保持するレジスタ。 ±1 については FREG の値に関わらず「incr」、「decr」コマンドで常に使用可能。
  • MREG — モジュロ演算での最大値を設定するレジスタ。modulo (N) に対して (N-1) を設定する。デフォルトは「127」
  • LREG — モジュロ演算での最大値を超えてインクリメントした場合にロードされる「最小値」の設定。デフォルトは「0」

モジュロ演算モードはデフォルトでは ON になっていますが、コマンドで OFF に設定することもできます。
モジュロ演算モードでは、REG の値が MREG と等しくなった後、さらにインクリメントしようとすると、ラップアラウンドされて、LREG の値に置き換えられます。
逆に、REG の値が LREG と等しくなった後、さらにデクリメントしようとすると、ラップアラウンドされて、MREG の値に置き換えられます。
デフォルトでは MREG = 127、LREG = 0 の設定になっているので、これはつまり modulo (128) の設定であり、実質的にモジュロ演算の効果がない状態になっています。
REG の値が LREG 以上 MREG 以下の範囲におさまっている状態からば、いくらインクリメント/デクリメントしても LREG .. MREG の範囲からハミ出すことはありません。
これを利用して、Filter コンポーネントで生成されるプログラムでは、IIR バイクアッド・フィルタのように特にモジュロ演算モードが必要でなくても、そのフィルタ・チャネルに割り当てられているデータ RAM アドレスの範囲を LREG / MREG に設定して、他のチャネル用のデータ RAM アドレスに誤ってアクセスすることを防止しています。
FIR フィルタ・プログラムでは、入力サンプル・データの格納場所および計算開始アドレスを変化させるのにモジュロ演算モードを活用しています。
ステートマシンでの条件分岐の「条件」のひとつに ACU で REG にラップアラウンドが生じる可能性を検出するものがあります。 ACU A / B それぞれに対して acuaeq / acubeq という名称が付けられています。
これらは、REG の値が MREG に等しいか、あるいは LREG に等しい場合に「真」となります。
REG をインクリメント方向で使っている場合には、REG の値が MREG に等しくなった時点で acuaeq/acubeq が立ち、次のインクリメントでラップアラウンドが生じることを示します。
REG をデクリメント方向で使っている場合には、REG の値が LREG に等しくなった時点で acuaeq/acubeq が立ち、次のデクリメントでラップアラウンドが生じることを示します。
FIR フィルタ・プログラムでは、タップ係数メモリ・ポインタの REG B が MREG B に等しくなるのを acubeq で検出して、たたみ込み計算ループの終了条件としています。