FPGA 版 FM 音源 (46) -- YMF297 (OPN3/OPL3) 測定 (11) -- EG クロック・プリスケーラ (1)

OPL3 の EG では、AR/DR/RR で指定するレートが 13 の場合に fs クロックごとに EG アキュムレータの値が変化するようになり、レートが 12 を含んでそれ以下になる場合には、EG アキュムレータを更新するクロックが fs を分周したもの (プリスケールされたもの) になります。 (キーレート・スケーリングによる Rof = 0 の場合)
レート = 12 では 2個ずつ EG の同じ値が繰り返され、レート = 11 では同じ値 4 回の繰り返し、... と続き、レート = 1 では 4096 回の繰り返しとなります。
アタック/ディケイのみをサポートする EG を Verilog で 書いた以前の記事 (→こちら) では、アタック → ディケイの遷移の度に fs プリスケーラをリセット (に相当する処理を) していましたが、OPL3 の実チップを測定すると、プリスケーラは「フリーラン」で動いているらしいことが分かりました。
下に AR = 9 (fs/16 クロック)、DR = 9 (fs/16 クロック) での、アタック → ディケイのトランジェント部分を波形編集ソフトで表示したものを示します。

左右中央付近で 4100 の罫線に近い EG 出力値は正確には 4094 で、EG 出力の 0 dB に相当し、アタック・カーブのピーク部分です。
垂直の黄色い点線 (カーソル) はアタック → ディケイの切り替わり部分と推定されるタイミングです。
AR = DR = 9 なので、A → D と切り替わってもプリスケーラの設定は同じで、当然、「位相」が乱れることもなく 16 個ずつ同じ値を繰り返しています。
次は AR = 9 (fs/16 クロック)、DR = 10 (fs/8 クロック) の場合です。
DR = 10 では同じ値 8 個の繰り返しとなりますが、A → D 切り替え直後だけは 4 個の繰り返しとなっています。
次は AR = 9 (fs/16 クロック)、DR = 11 (fs/4 クロック) の場合です。

DR = 11 では同じ値 4 個の繰り返しとなりますが、A → D 切り替え直後だけは 2 個の繰り返しとなっています。
次は AR = 9 (fs/16 クロック)、DR = 12 (fs/2 クロック) の場合です。

DR = 12 では同じ値 2 個の繰り返しとなりますが、A → D 切り替え直後も含めて 2 個の繰り返しとなっています。
次は AR = 9 (fs/16 クロック)、DR = 13 (fs クロック) の場合です。

DR = 13 では fs ごとに変化する形となりますが、A → D 切り替え直後だけは 2 個の繰り返しとなっています。
これは A → D 切り替えのオーバーヘッド分が「余計」な 1 サンプルとして見えているものと思われます。
以上の例は AR <= DR、つまり、アタックのクロックの方が「遅い」場合です。
EG クロック・プリスケーラはフリーランと思われるので、アタック・カーブの変化タイミングは fs クロックを 16 分周したクロックの有効エッジのタイミングに限られます。
それはディケイ・カーブの変化タイミングより「制約」が大きいので、キーオン・タイミングにかかわらず、上で示したような EG 出力となります。
AR >= DR、つまり、アタックのクロックの方が「速い」場合を下に示します。
AR = 13 (fs クロック)、DR = 9 (fs/16 クロック) でキーオン間隔を奇数に選び、キーオン・タイミングが 16 種の位相に渡る場合を重ねてプロットしています。

波形編集ソフトでは表示しにくいので、キャプチャした wave ファイルを読み出して数値データのファイルとして書き出し、gnuplot で表示しています。
アタック側は「制約」なくアタック・カーブを任意の fs タイミングで開始できるのに対し、ディケイ・カーブはフリーランの fs/16 のタイミングでしか変化できないため、A → D 切り替え直後の繰り返しは 1 〜 16 に渡って変化しています。
以上の結果から推測される fs プリスケーラのタイミング・チャートを 4 ビット分だけ下に示します。

初段の FF を除き、前段のクロックの立下りでトグルするリプル・カウンタ出力の、立ち上がりを有効エッジとして利用する形になっています。
たとえば、Q4 → Q3 の切り替えでは、4 ビットカウンタのカウント値を 16 進数で表現して、

  7↑89ABCDEF01234567↑89AB↑CDEF0123↑456789AB↑C

となります。 ここで、「↑」は出力されるクロックの有効エッジを示すものとします。
上の例では、EG 値の繰り返し回数が

  ・16・4・8・8・...

となり、実チップの実測値と一致します。
FPGACPLD では、逆極性のクロックやリプル・カウンタは実現しにくいので、実際には全ての FF のクロックは fs とし、上の図で EN1 〜 EN4 で示したような「クロック・イネーブル」信号を作成して利用することになります。