FPGA 版 FM 音源 (27) -- YMF262 インターフェース回路 (1)

久しぶりに YMF262 (OPL3) の挙動を観察しようと、以前に作成した SH-2A とのインターフェース回路 (→こちらの記事) を取り出してきたら、うまく動かなくなっていました。
SH-2A ベースボード上は YMF262 専用ではなく、AC97 コーデックなどの他の回路も載っており、原因追求に時間がかかるかも知れないので、別のマイコンでインターフェース回路を作り直すことにしました。
YMF262 出力サンプルを 48 kHz S/PDIF に乗せて送信するためには、

  • S/PDIF トランスミッタ
  • YMF262 用の安定な 13.824 MHz クロックと S/PDIF 用クロック (12.288 MHz など) の生成
  • 5 V 入出力の YMF262 との電圧インターフェース

が必要です。
SH-2A では内蔵 S/PDIF モジュールを利用し、13.824 MHz 用 PLL チップは外付け、CMOS バッファ・ゲートにより 3.3 V - 5 V インターフェースを実現していました。
作り直しバージョンでは、(CPU) クロック発生用 PLL 内蔵、IO 電圧 5 V の Nuvoton NUC120 マイコンを使って、上の 2 つの条件を満足させ、S/PDIF トランスミッタについてはチップを外付けしました。
基板の写真を下に示します。

中央の緑色の変換基板に載っているのが YMF262 で、右側の緑色の変換基板に載っているのが S/PDIF トランスミッタの CS8401A です。
左下の 14 ピン、16 ピンの DIP IC がそれぞれ 74HC86、74HC161 です。
クロック発生部のブロック・ダイアグラムを下に示します。
NUC120 チップのクロック・モジュールに対する設定です。

まず、外部水晶振動子をデフォルトの 12 MHz から 12.288 MHz に換装しています。
その水晶発振出力を S/PDIF トランスミッタにマスタークロックとして供給します。
内蔵 PLL により、

FOUT = FIN * NF / (NR * NO)
       = 12.288 [MHz] * 36 / (4 * 4)
       = 27.648 [MHz]

を発生させ、これをシステム・クロックとして使っています。
これを、クロック外部出力用分周器で 1/2 の周波数とした、

FCLKO = FOUT / ND
        = 27.648 [MHz] / 2
        = 13.824 [MHz]

を YMF262 へ供給します。
CS8401A は古い DVD 再生ボードから外してきたもので、マイコンとのインターフェースがパラレルで、少し配線の手間がかかります。
YMF262 は外付け DAC の YMF512 と組み合わせて使うようになっており、その出力フォーマットは、

  • 1 ch 当たり 18 シリアル・クロック幅の中に LSB ファーストで 16 ビット・データが出力される
  • 符号の形式はオフセット・バイナリ、つまり、2 の補数の MSB を反転したもの

となっています。
最近の S/PDIF トランスミッタは、通常の DAC のように MSB ファーストのデータにしか対応しておらず、一方、CS8401A は古いチップですが、LSB ファーストに対応しています。
インターフェース回路全体を公開しても「誰得」という感じなので、YMF262 出力データの MSB を反転して 2 の補数に変換する回路のみを下に示します。

タイミング・チャートを下に示します。

SMPAC と SMPBD は出力データの b8 〜 b15 の間だけ「H」になる信号です。
これを HC161 の Load 信号として使い、SMPAC/SMPBD が「H」の期間のみ HC161 のカウント値とビット番号を一致させます。
HC161 の Ripple Carry Output 信号はカウント値「15」をデコードして作られているので、これを「MSB」を表すタイミングとして使い、EXOR ゲートでデータを反転させます。