SH-2A 基板 (8)

SPDIF モジュールとシリアルサウンドインターフェース (SSIF) モジュールは同じオーディオ・クロックからタイミングを作り出すので、それぞれのサンプリング周波数が一致するように設定しておけば、周波数および位相の関係は一定値を保ち、誤差が蓄積していくようなことはありません。
それを利用して、これまでのプログラムでは、SPDIF の出力サンプリング・レートの割り込みで、SPDIF モジュールへの出力とあわせ、SSIF モジュールへの出力も行って来ました。
しかし、これでは、たとえ SPDIF 出力を利用しない場合でもオーディオ・クロックは 512 fs に限られてしまい不便なため、割り込みは SSIF モジュールの FIFO エンプティ割り込みを使うように変更しました。
「OVS_RATIO」(OVerSampling RATIO の意) という定数を、たとえば、512 fs の場合には

  #define OVS_RATIO 512

のように定義します。
この値が、64, 128, 192, 256, 384, 512, 768 の場合には SSIF モジュールのレジスタの設定が適切に行われるようにしてあります。
また、この値が 512 の場合に限り、SPDIF モジュールを動作させることにしました。
CPU クロックを最高速で動作させるため、デフォルトのクロック・モード 1 では FRQCR に 0x104 を設定していますが、その部分を現在のクロック・モードを読み出して、自動的にそれに対応した設定をするように変更しました。
その機能を利用し、4 種類のクロック・モードで動作させてデモ曲演奏時 (同時発音数 3 の曲データ) の CPU 負荷率を測定した表を下に示します。

クロック
動作
モード
CPU
負荷率
EXTAL 内部
クロック
(Iφ)
バス
クロック
(Bφ)
周辺
クロック
(Pφ)
0 57 % 11.2 MHz 134.4 MHz 44.8 MHz 22.4 MHz
1 53 % - 144 MHz 48 MHz 24 MHz
2 52 % 18 MHz 144 MHz 72 MHz 36 MHz
3 58 % - 128 MHz 64 MHz 32 MHz

条件としては、出力サンプリング周波数 44.1 kHz (オーディオ・クロック周波数 22.5792 MHz)、音源としての波形発生のサンプリング周波数も 44.1 kHz (サンプリング・レート変換なし)、同時発音数 11 です。
やはり、実際の演奏データの同時発音数が多い場合にノイズが乗る傾向があったので、(能力としての) 同時発音数は 16 から 11 に下げてあります。
また、モード 2 の場合の水晶振動子はスペック通りの 18 MHz ですが、モード 0 の場合には、手持ちの公称 11 MHz のセラロックを使っています。 実際の発振周波数は約 11.2 MHz でした。
周辺クロック (Pφ) で動作するタイマ (MTU) で周辺クロックを 1/1000 に分周して出力し、周波数を測って、実際にモードが切り替わっているかどうかを判断しています。
上の表の CPU 負荷率を見ると、ほぼ CPU クロック (内部クロック) に逆比例していることが分かります。
リセット関係のプログラムを除き、大部分のプログラム領域とデータ領域はキャッシュが効く大容量内蔵 RAM に位置しています。
大容量内蔵 RAM のアクセス時間バスクロック周波数に依存しています。 モード 1 とモード 2 では 48 MHz と 72 MHz と大きな差がありますが、CPU 負荷率では 1 % の差しかありません。
これは、プログラムの実行時間のほとんどをオペレータの演算に費やしており、そのプログラムサイズは小さいのでキャッシュメモリ内におさまり、キャッシュの効果によりバススピードの影響が少なくなっているものと考えられます。
上の結果を見る限り、わざわざ 18 MHz の水晶振動子を接続してクロック・モード 2 で動作させなくても、この応用に関しては、デフォルトのモード 1 で十分であると言えます。