FPGA 版 FM 音源 (70) -- FPGA 版 EG (14)

今回はスロット・パラメタ・レジスタ・アレイのホスト・インターフェース部についてです。
各スロットの発音パラメタは、継続的に該当タイム・スロットで「タイムリー」に供給される必要があります。
その一方で、ホスト側からのアクセスについてはなるべく制約が少なく、任意のタイミングでできることが望まれます。
「ランダム・ロジック」で実現すれば、最も自由度が高くなりますが、大量にロジック・エレメントを消費してしまうので、Cyclone デバイスが内蔵している M4K RAM メモリ・ブロックを「デュアル・ポート・モード」で使用することにしました。
RAM 自体のスピードは速いので、細かい制御をすれば「シングル・ポート・モード」でも実現はできますが、制御が簡単になるデュアル・ポート・モードの方を選択しました。

OPL3 の主要な発音パラメタのレジスタ・アドレス割り付けの図を左に示します。
OPL3 (YMF262) は基本的に「OPLII (YM3812) × 2 + 拡張部分」といった構成なので、左のレジスタ・アレイが 2 セット存在しています。 (「アレイ 0」 と「アレイ 1」)
ただし、アドレス BDh の「リズム・レジスタ」はアレイ 0 側にしか存在しません。
また、オリジナルの OPL3 (YMF262) では、出力チャネルは Ch A/B/C/D の 4 つ存在していますが、後継の OPL3-SA3 (YMF715) の FM 音源部分では、Ch L/R の 2 チャネルに削減されており、左の図でもそれに従っています。

アドレス 20h 〜 95h と E0h 〜 F5h までの領域は、スロット (オペレータ) に関するパラメタのレジスタです。
たとえば、AM/VIB/EGT/KSR/MULT のパラメタ・レジスタの領域であるアドレス 20h 〜 35h には、下の図の上側のように各スロットのレジスタが配置されています。

ここで、スロット番号は「0」オリジンで数えるものとします。 「枠」の中に書いてあるのがスロット番号で、枠の下に書いてあるのがレジスタ・アドレスです。

  • 8 バイトの領域の中に
  • (前詰めで) 6 スロット分のレジスタが割り付けてあり、
  • 2 バイトの「空き」をはさんで、
  • 次の 8 バイト境界の中に次の 6 スロット分のレジスタが前詰めで配置され、...

という形で 18 スロット分のパラメタ・レジスタが割り付けてあります。
他のスロット・パラメタ・レジスタについても、同様の配置となっています。
アドレス A0h 〜 B8h、C0h 〜 C8h のレジスタは (発音) チャネルのパラメタ・レジスタで、「FNUM(L)」のアドレス A0h 〜 B8h を例にとると、上の図の下側のように各チャネルのレジスタが配置されています。
これは、何の変哲もなく、単純に 9 チャネル分のレジスタが連続して割リ付けられています。
今回、スロット対応の回路ができているのは EG 部分だけなので、一挙に全レジスタにまでは手を広げず、EG 関連のアドレス 20h 〜 95h までの部分のみをインプリメントしてみます。
ひとつのスロットに関しては、2xh、4xh、6xh、8xh の 4 つの 8 ビット・レジスタの、合計 32 ビットのデータを読み出す必要があります。
これを、デュアル・ポート・メモリの読み出し側のビット幅を 32 ビットとして、リード・アクセス 1 回で全て読み出せるようにします。
各ビットの配置を下に示します。 32 ビット分を並べるスペースがないので、16 ビット幅 2 段で表示してあります。

スロット番号順に読み出しアドレスをインクリメントしながら読み出すことにより、スロット番号によるデータのマルチプレクスの機能も同時に実現します。
読み出し側を単純にするために、書き込み側で「アドレス変換」を行います。 その様子を下に示します。

(2017 年 2 月 17 日追記: 当初、図/説明で「Slot No.」/「スロット番号」と表記していたのを「Slot Adrs」/「スロット・アドレス」と改めました。)

まず、レジスタ・アドレスの b8 に相当する「アレイ番号」はそのまま b8 に位置させます。
そして、アドレス下位 8 ビットが 20h 〜 9Fh となる場合のみ「チップ・セレクト」されたものとして書き込みを有効にします。
レジスタ種別を示す b6 〜 b5 とスロット・アドレスを示す b4 〜 b0 とを「ローテート」して、同一スロット・アドレスに属するパラメタが同じ 32 ビット・ワードの中に位置するようにします。
このようにして書き込んだデータを 32 ビット単位で読み出すと 2 つ前の図のようになります。
Cyclone デバイスの M4K メモリは容量 4 K ビットで、8 ビット × 512 ワードの構成で使えるので、(容量を半分使っていませんが) M4K ブロックひとつにおさまります。