PIC32MX220F032B (10) -- AC97 コーデックを接続する (7)

今回は、また別の AC97 コーデック (Analog Devices Inc. 製 AD1881) との接続を試しています。
AD1881 は AC97 コーデックとしては、かなり初期の製品で、ADC/DAC ともに 16 ビット分解能のものを 2 ch 内蔵するだけです。
その他の特長としては、

  1. スレーブ・コーデックとの「デイジーチェーン接続」
  2. 「SLOT16」モード
  3. Master Volume (レジスタ・インデクス 02h) は 64 レベルで -94.5 dB まで絞れる

などがあります。
簡単に説明すると、1. については、複数コーデックに対応する AC97 コントローラ側では各コーデックごとの SDATA_IN 出力を個別に受け入れる入力を複数持つのが AC97 規格の本来の姿です。
しかし、マイコンDSP を使って AC97 コントローラとして機能させる場合には、SDATA_IN 入力を 2 つ以上設けることが難しいことがあります。
そのような場合でも、スレーブ・コーデックの SDATA_IN 出力と マスター・コーデックの入力との間を「デイジーチェーン接続」(数珠つなぎ) して、内部的にマスター・コーデックの SDATA_IN 信号と合成してコントローラ側には 1 本の SDATA_IN 信号として出力する機能です。
この機能は、「A」サフィックス付きの AD1881A 以降のチップではサポートされなくなりました。
2. については、AC97 規格では、16 ビット TAG スロットひとつと、20 ビット・スロット 12 個とで合計 256 ビットのフレームを構成しています。
AD1881 では ADC/DAC ともに 16 ビット分解能なので 20 ビット・スロットの必要はなく、単純に 16 ビット・スロット 16 個で 256 ビット・フレームを構成するほうが、マイコンDSP などでコントローラを実現する場合に有利になります。
この 16 × 16 ビットで 1 フレームを構成するのが「SLOT16」モードで、当然 AC97 規格互換ではなくなります。
3. については、他の多くの AC97 コーデックでは、Master Volume の可変レベル数は AC97 規格で「必須」と定められている 32 レベルですが、AD1881 では「オプション」扱いの 64 レベルを実装しています。
各ステップ幅は 1.5 dB と決められているので、「必須」の 32 レベルでは、

0 dB 〜 -46.5 dB

のレンジとなるのに対して、AD1881 では

0 dB 〜 -94.5 dB

のレンジとなります。
AC97 コーデックの (スレレオ) ミキサー部分 (上半分) と、CD 入力部分の概念的な回路図 (下半分) を下に示します。

ミキサー部分の図で、緑色の太線で書いてある部分は「ステレオ信号」のパスであることを示しています。
ステレオ対応の外部入力は CD / VIDEO / AUX / LINE の 4 つです。
このうち、CD 入力を除く 3 組はシングル・エンド入力ですが、CD 入力だけは、上の図の下半分に示すように (制約のある) 差動入力となっています。
L/R の差動入力のひとつが共通の CD_GND 入力に接続されているので、純粋な差動ではありません。
通常の使用法では、 CD_L / CD_GND / CD_R 入力それぞれにコンデンサを介して AC 結合にして使います。
これは、接続ケーブルに乗る「コモンモード・ノイズ」を差動増幅で除去するためのものです。
本来の使用法では DC をカットしますが、コンデンサなしで直結すれば DC の増幅も可能です。
他の 3 組の外部入力は、暗黙の差動入力として内部リファレンス電圧を使用したシングル・エンド入力なので、DC の領域から使おうとすれば、外部回路の方が AC97 コーデックのリファレンス電圧を参照して動作する必要があります。
CD 入力では、外部から CD_GND 入力へ電圧を加えることができるので、(リファレンス電圧値と大きくは違わない) 外部回路のアナログ・コモン電圧を供給すれば、AC97 のリファレンス電圧とは独立になります。
(ステレオ) ミキサー部分では、L/R チャンネルのゲインの値は同じレジスタの違うビットに割り付けられているので、左右違うゲインを選ぶこともできます。
また、MONO_OUT 出力の入力としてステレオ・ミックス出力か、マイク入力かを選ぶことができ、マイク入力を選べば、ステレオ・ミキサー部とは独立の信号に対してゲインをコントロールすることができます。
結局、AC97 のミキサー部を利用して、合計 3 系統のディジタル PGA (Programmable Gain Amplifier) を実現することができます。
(フロント) PCM DAC に L/R ch で互いに 90° 位相の異なる 440 Hz の正弦波を発生させ信号源とし、マスター・ボリューム (レジスタ・インデクス 02h) を操作してバースト状の信号を出力した場合の波形写真を下に示します。

上のトレース (Ch.1) が R ch、下のトレース (Ch.2) が L ch です。
マスター・ボリュームのゲイン切り換えは左右ともに同じタイミングで行っていますが、出力波形を見ると、波形の途中の点でいきなり切り換えられることはなく、「ゼロクロス点」付近まで「待って」から切り換えられています。
そのため、L/R ch で出力波形のゲインが変化するタイミングが異なっています。
これは、モノ・ボリューム (レジスタ・インデクス 06h) でも同様です。
したがって、ゼロクロス点を持たない直流をマスター・ボリュームでコントロールできませんし、低い周波数の信号では、設定したゲインが実際に有効になるまでに時間がかかることになります。
つまり、時間応答が重要な応用に対しては、ミキサーの出力側のボリュームは使えないことになります。
これまで使った他の AC97 コーデックのうち、ALC650 はマスター・ボリュームのゲイン設定に何らかの LPF が入っていて、短い周期で設定を書き換えても、実際のゲインは急激に変化しないようになっています。
一方、ALC650 のモノ・ボリューム、STAC9708 のマスター/モノ・ボリュームは「瞬時」に変化します。
ミキサー入力側でのゲイン・コントロールとして、PCM DAC ボリューム (レジスタ・インデクス 18h) を操作してバースト状の信号を出力した場合の波形写真を下に示します。

こちらでは、ゲイン切り換えは「瞬時」に行われ、ゼロクロス点まで待つことなく、左右同時のタイミングで波形の途中で切り換わっています。
この PCM DAC ボリュームの操作で、1.5 dB ステップで -46.5 dB までゲインを下げた信号を PC のオーディオ入力でキャプチャし、wave ファイルとしたものを波形編集ソフトでエンベロープを表示させた画面を下に示します。

その wave ファイルをプログラムで読み込み RMS (Root Mean Square) 値を計算してゲインに換算したものをプロットした図を下に示します。

レベルの小さい部分ではノイズの影響もあって、少し「浮いた」形になっていますが、かなり良いリニアリティになっています。
同様の処理を、マスター・ボリューム (レジスタ・インデクス 02h) について行ったプロットを下に示します。

ゲインのレンジは -94.5 dB まであるはずですが、ノイズの影響などで -70 dB 程度までしか行きません。
リニアリティーもかなり悪くなっています。