Veryl registryAkiyukiOkayasu/gndless-adat-veryl · gndless_adatSource ↗

Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

AdatRx

ADATレシーバ トップモジュール

ADAT光入力から8チャンネル24ビットPCMをデコードする。 クロックはADAT信号から自動復元される(外部PLLは不要)。

実機確認状況

システムクロック50MHzの構成で実機動作を確認済み。 50MHz以外のシステムクロックでは実機確認していない。

対応サンプルレート

  • 48kHz: 8チャンネル
  • 96kHz: 4チャンネル (S/MUX2)

S/MUXの検出とS/MUX4の扱い

S/MUX2 (88.2/96kHz) はUserBit2 (送信順で2番目のuser bit) によってのみ検出できる。 S/MUX4 (176.4/192kHz) はuser bitフラグを持たない (全user bitが0、RME ADI-8 DS マニュアル “No S/MUX4 Flag” 参照)。ADATストリームのタイミングからも判別できないため、 S/MUX4の受信にはユーザー側のクロック/レート設定が必要であり、本モジュール単体では S/MUX4をS/MUX2として誤検出・誤デコードする可能性がある。S/MUX4機器を接続する場合は 利用側でモードを明示制御すること。

S/MUX時のチャンネルマッピング(別moduleまたは利用側で実装)

本モジュールは channels[0..7] を物理スロットとして出力し、S/MUXの論理チャンネル再構成は行わない。 channelsgndless_fixedpoint::FixedPointValue::<gndless_fixedpoint::Q1_23>境界で、raw値はchannels[i].rawから得る。 S/MUX2受信では、出力を Smux2Unpackerへ直接接続して4chの高速sample列へ戻す。 Smux2Packerは送信側で4ch sample列を8物理スロットへ並べるmoduleであり、受信後の再構成には使用しない。

  • S/MUX2 (96kHz / 88.2kHz, 4ch)
    • Logical CH0 <= channels[0] + channels[1]
    • Logical CH1 <= channels[2] + channels[3]
    • Logical CH2 <= channels[4] + channels[5]
    • Logical CH3 <= channels[6] + channels[7] 時間順は、各Logical CH内では添字の小さいスロットが先のサンプル。

ADAT論理フレーム概要

以下はNRZI復号後の論理ビット列であり、物理入力 adat の電気的波形ではない。 伝送位置0が内部ベクタ frame[255]、伝送位置255が frame[0] に対応する。

伝送順 →
+-----------+----------+-------------+-----+-------------+
| SYNC      | User     | CH0         | ... | CH7         |
| 10bit+sep | 4bit+sep | 6*(4bit+sep)|     | 6*(4bit+sep)|
+-----------+----------+-------------+-----+-------------+
    11bit       5bit        30bit             30bit

User bitはU3からU0、各channelの24bit PCMはD23からD0のMSB-firstで伝送される。 4bitごとにseparator=1が続き、NRZI信号に同期用の遷移を作る。 channels[0..7] は物理スロットであり、S/MUXの論理channel再構成はSmux2Unpackerなどの別moduleまたは利用側の回路で行う。

伝送位置と内部ベクタ添字を含む詳細図はpackage READMEを参照。

公開出力の概念タイミング

次図は縮尺なし。省略区間には複数フレームを含み得る。 channels のatomic commitごとに frame_valid がシステムクロック1周期だけHighになる。 frame_validはraw commit pulseであり、下流はframe_valid && lockedを受理条件にする。 locked は完全フレーム周期が安定した後にHighになる。 frame_clk はADATフレーム周期を示し、S/MUX時の論理sample rateではない。

Examples

inst audio: gndless_fixedpoint::FixedPointValue::<gndless_fixedpoint::Q1_23> [8];
inst adat: AdatRx (
    clk        : sys_clk_50mhz,
    rst        : reset,
    adat       : toslink_in,
    channels   : audio,
    frame_clk  : frame_clk,
    smux_active: smux_active,
    frame_valid: frame_valid,
    locked     : locked,
);

タイミング

  • 推奨クロック: 50MHz
  • ADAT入力: TOSLINK光→電気変換済み信号

Ports


clk input clock システムクロック (50MHz推奨)
rst input reset リセット
adat input logic ADAT入力 (光→電気変換済み)
frame_clk output logic システムクロック (50MHz推奨) リセット ADAT入力 (光→電気変換済み) ADATフレーム周期のクロック出力(sample rateではない)。 通常は44.1/48kHz。 warning: S/MUX有効時でも44.1kHz/48kHzが出力されることに注意。
smux_active output bbool UserBit2 (送信順で2番目のuser bit) に基づくS/MUX2状態 (1: enabled, 0: disabled)。 S/MUX2 (88.2/96kHz) のときだけ1になる。S/MUX4 (176.4/192kHz) はuser bitが全0のため このフラグでは検出できず、ユーザー側のクロック/レート設定が必要 (RME ADI-8 DS マニュアル "No S/MUX4 Flag" 参照)。
channels modport gndless_fixedpoint __FixedPointValue__gndless_fixedpoint_Q1_23 output_port [8] 8チャンネルPCMデータ出力(ADAT物理スロット)。 注意: S/MUX有効時の論理チャンネル再構成は利用側の実装が必要
frame_valid output logic 完全フレームcommitパルス
locked output bbool 同期ロック状態