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 ゲートでデータを反転させます。