FPGA 版 FM 音源 (31) -- YM2151 (OPM) インターフェース回路 (1)

Nuvoton NUC120 基板上に YM2151 (OPM) のインターフェース回路を作りました。
YM2151 チップは手持ちの MSX 用 FM 音源モジュール YAMAHA SFG-01 の基板から外してきたものです。
YM2151 自身および周辺の回路の IC の「デート・コード」を見ると 1984 年製造のようで、30 年前のものです。
写真を下に示します。
YMF262 (OPL3) と YM2151 (OPM) とは、ピン配置に共通する部分も多いのですが、決定的に電源/GND ピンの配置が異なっているので、YM2151 用に新たに IC ソケットを増設し、YMF262 とは排他的に使うことにしました。

上の写真で、空いている 24 ピンのソケットには元々 YMF262 が実装されていたもので、その下にある 24 ピンの IC が YM2151 です。
YM2151 の本来の使用法では、マスタークロック (φM) に 3.58 MHz あるいは 4 MHz を供給し、それを 2 分周した φ1 出力を外部 DAC (YM3012) のシリアル・クロックとして使うようになっています。
そのフレーム・フォーマットは 32 クロック/フレーム (16 クロック/ワード) で、φ1 の周波数は出力サンプリング周波数の 32 倍 (32 fs) ということになります。
48 kHz S/PDIF にデータを乗せるためには、その 64 倍のクロックをマスタークロック (φM) として供給してやれば良く、その周波数は

64 × 48 [kHz] = 3.072 [MHz]

となります。
この周波数は、すでに水晶振動子を換装ずみの NUC120 ボードの 12.288 MHz クロックを 4 分周することで簡単に得ることができます。
YM2151 の DAC 出力データは、指数部 3 ビット、仮数部 10 ビットの浮動小数点フォーマット (LSB ファースト) になっており、通常の DACS/PDIF で必要とされる 2 の補数 16 ビット・リニア・データ (MSB ファースト) ではありません。
このフォーマット変換のために、いったん NUC120 の I2S 入力から読み込み、ソフトでフォーマット変換し、I2S 出力から再度出力しています。
スペック上は仮数部 10 ビットですが、その下位側 3 ビットも変化しているので、指数部 3 ビット、仮数部 13 ビットとして扱っています。
NUC120 の I2S モジュールで扱うために、正規の LRCK 信号が必要となるため、LRCK 発生用の JK-FF (74HC113)を追加しています。
回路図を下に示します。
レジスタ・アクセスのためのデータ・バスやコントロール信号の配線については省略しています。

74HC161 まわりの回路は、YMF262 の場合に DAC データの MSB を反転させるためのもので、YM2151 の場合には「動作させない」ようにしています。
YM2151 には、MPU からのレジスタ・アクセスで設定できる CT1、CT2 信号があり、デフォルト値は「L」なので、これを 74HC161 の Ripple Carry Output のコントロールに使っています。
LRCK の発生に 74HC113 を使っているのは、回路上、ネガティブ・エッジ・トリガの FF が必要だったからです。
JK-FF をフリーランの T-FF として使っているので、YM2151 の L/R 出力と、S/PDIF の L/R とが一致する確率は 50 % となります。
L/R を確実に対応させるには、遅延用のゲートを挿入した上で、YM2151 の SH1、SH2 信号をそれぞれ J、K 入力に接続する必要があります。
SH1 と SH2 とを EXOR したものを FF のクロックとして使っているので、SH1/SH2 と J/K とを直結すると、セットアップ・タイム、ホールド・タイムが確保できません。
(2014 年 4 月 26 日追記:タイミング・チャートを追加しました。)
タイミング・チャートを下に示します。

データは 16 ビット/ワード構成で LSB ファースト、最終 3 ビットが「指数部」となっています。
YM2151/YM3012 のスペック上は残りの 13 ビット中の先頭 3 ビットは未定義、その次の 10 ビットがオフセット・バイナリの「仮数部」ということになっていますが、未定義の 3 ビット部分にもデータ・ビットが入っている様子があったので、合わせて仮数部 13 ビットとして扱っています。
DAC である YM3012 では仮数部 10 ビット精度のサポートに限られるということだけで、YM2151 側は 13 ビット幅フルに出力しているのかも知れません。