PSoC5LP Prototyping Kit (14) --- DFB と Filter (6)

DFB ハードウェアにはグローバル入力信号が 2 本、グローバル出力信号が 2 本、DMA リクエスト出力 2 本、インタラプト出力 1 本の、合計 7 本の入出力信号がありますが、Filter コンポーネントでは、DMA 出力 2 本、インタラプト出力 1 本の、計 3 本の設定しかできません。
残りの 4 本の内のいずれかについて設定が必要な場合は「DFB コンポーネント」を使用します。
回路図上に配置した DFB コンポーネントをダブル・クリックして開くカスタマイザ (設定用ダイアログ) の最初の画面 (Configure タブ) で、上記の 7 本の設定ができます。
ハードウェアに関する設定は「Configure」タブの画面だけで、次の「Code」タブを選択すると下のような画面になります。

これは、DFB で実行する「DSP プログラム」を作成するソース・コード・エディタ / アセンブラ / シミュレータをまとめたものです。
左上のペインがエディタのウィンドウ、右上のペインが入力サンプル・データ列を入力するウィンドウ、下のペインが出力ウィンドウです。
ワンタッチでフィルタ・プログラムのひな型を作ってくれるような便利機能は用意されていません。
真っ白なエディタ・ウィンドウに、「スクラッチ」から DSP プログラムを書き下ろすのは至難の業ですから、エディタ・ウィンドウは真っ白なまま、ウィンドウを閉じる他はありません。
そのため、既存の DSP プログラムを利用し、必要な修正を施して使用する形になります。
幸いなことに、Filter コンポーネントでフィルタを設計すると、その DSP プログラムが「dfb.v2」という名前で、プロジェクト・ファイル (.cyprj) の置かれているフォルダに作成されます。
これは「消し忘れ」ではなく、フィルタ・プログラムを後で検討する目的で意図的に残してあるのだと思われます。
このファイルをコード・エディタに読み込んでエディット / アセンブル / シミュレートすることができます。
チャネル A / B 両方ともイネーブルして、両方とも FIR フィルタに設定した場合の DSP プログラムの構成は下のようになっています。

initialize:
  全体の初期化
channel_A:
  チャネル A 入力があれば ChA_init: へジャンプ
channel_B:
  チャネル B 入力があれば ChB_init: へジャンプ
restart:
  channel_A: へジャンプ

ChA_init:
  チャネル A FIR フィルタ計算の前準備
  ステージング・レジスタ A から入力データ読み込み
  ChA_fir: へジャンプ

ChA_firFinish:
  チャネル A FIR フィルタ計算の後処理
 出力データをホールディング・レジスタ A に書き込み
  channel_B: へジャンプ

ChB_fir:
  FIR タップ 1 本分の計算を指定タップ数だけ繰り返す
  指定タップ数に達したら ChA_firFinish: へジャンプ

ChB_init:
  チャネル B FIR フィルタ計算の前準備
  ステージング・レジスタ B から入力データ読み込み
  ChB_fir: へジャンプ

ChB_firFinish:
  チャネル B FIR フィルタ計算の後処理
 出力データをホールディング・レジスタ B に書き込み
  channel_A: へジャンプ

ChB_fir:
  FIR タップ 1 本分の計算を指定タップ数だけ繰り返す
  指定タップ数に達したら ChB_firFinish: へジャンプ

FIR フィルタでは (IIR フィルタでも)、DFB の RAM A 側を入力サンプル・データ、RAM B 側を FIR フィルタ・タップ係数のためのメモリとして使っています。
FIR フィルタのタップ数を A / B それぞれ NA / NB とすると、

  • RAM のアドレス 0 から (NA - 1) をフィルタ・チャネル A 側、
  • RAM のアドレス NA から (NA + NB - 1) をフィルタ・チャネル B 側

が使用しています。
入力データをチェックして、データがあれば対応する処理プログラムに分岐している部分のプログラムはそのまま使えますし、前準備/後処理の部分は必要な変更を施す程度で済みます。
上の例で言えば、ChA_fir: と ChB_fir: の部分を、目的のアプリケーションで必要な処理に全面的に書き換えることになります。