PSoC5LP Prototyping Kit (15) --- DFB と Filter (7)

DFB (Digital Filter Block) の「ミニ DSP」の命令語は 32 ビット幅で構成されています。 
他のマイコンのような「演算命令」と「分岐命令」とには分かれておらず、プログラムの実行順序は「ステート・マシン」によって制御されています。
そのステート・マシンの動作に必要なテーブル類は、アセンブラがソース・プログラムの構造を解析して自動生成しますから、ユーザが気にする必要はありません。
命令語の 32 ビットのうち 31 ビットがデータパスの要素のコントロールに使われていて、

  • マルチプレクサ — 6 bit
  • データ RAM R/W — 2 bit
  • バス R/W — 1 bit
  • ALU — 5 bit
  • MAC — 2 bit
  • シフタ — 3 bit
  • ACU — 8 bit
  • ACURAM アドレス — 4 bit

という割り当てになっています。
このように、演算対象が多岐に渡るため、「×× 命令」というような分類はしにくく、その意味では、(総称的な)「 演算命令」がひとつあるだけという形になります。
命令語の残り 1 ビットは、eob (end of block) という名称で呼ばれていて、ステート・マシンのステート更新に関連しています。 このビットの 0/1 で、

  • (eob = 0) — 分岐を伴わない演算命令
  • (eob = 1) — 条件分岐を伴う演算命令

という 2 種類に分かれます、
(eob = 0) では、ステート更新は伴わず、単にプログラム・カウンタをインクリメントしながらプログラムをシーケンシャルに (ソース・プログラムに記述されている順序の通りに) 実行していきます。
(eob = 1) では、ステート・マシンがステート更新のための条件判断を行い、条件成立 / 不成立のそれぞれに対応したステートおよびプログラム・アドレスに分岐します。
アセンブラがステート・マシンを生成するという構成のため、ブログラムの記述方法に一定の制約があります。
それは、

  • ラベル
  • 0 個以上の (eob = 0) の命令
  • (eob = 1) の命令

という、ラベルに始まり (eob = 1) の命令で終わるプログラムの断片に対してアセンブラがひとつの「ステート」を割り当てるので、プログラム全体としては、これらのステートの集合体として構成されなければなりません。
例えば、(eob = 1) の命令が現れないうちに別のラベルが現れるようなプログラムは許されません。
ソース・プログラム中では eob ビットを直接指定する方法はなく、データパスのコントロールの記述のみの場合は (eob = 0)、「ジャンプ命令」のフィールドを追加すれば (eob = 1) となります。
例として、Filter コンポーネントでチャネル A に FIR フィルタを選択した場合に生成される「DSP プログラム」の、FIR タップ計算の部分のソースを下に示します。 

ChA_fir:
  acu(incr,incr) dmux(sra, srm) alu(setb) mac(macc) jmpl(eob,acubeq, ChA_firFinish)

プログラムの「1 行」が非常に長くて、表示上は 1 行におさまりきらず、折り返されて表示されています。
命令語としては 1 ワードであり、FIR 1 タップあたり 1 命令、つまり 1 BUS_CLK で計算できることになります。
acu()、dmux()、alu()、mac() の部分がデータパス要素に対する「命令」で、acu() 以外の部分を図示すると、

のようになります。 
マルチプレクサで選ばれる「経路」を青色の破線で示してあります。 この場合、MAC (Multiply and ACcumulate unit) の演算が中心なので、MUX2 で RAM 出力から MAC に入力されている部分のみ重要です。
jmpl() がジャンプ命令のフィールドで、これは「ループ命令」となっています。 最後の引数以外で示される条件が全て成立するまで、現在のステートの先頭のラベル (ChA_fir:) へループし、条件が成立したら最後の引数で示されるラベルへジャンプします。
条件の指定は eob と acubeq で、eob はジャンプ命令では常に成立し、acubeq は ACU B でポインタ・レジスタがモジュロ演算の最大値に達したことを検出しています。
条件成立時の飛び先の指定は「ChA_firFinish:」で、これは FIR 計算の「後処理」の部分です。
次回以降は、FIR / IIR 計算の実際の動作を見ていきます。