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

gndless_adat

ADAT optical receive, transmit, and S/MUX2 cores for Veryl.

Version 0.4.0
Repository https://github.com/AkiyukiOkayasu/gndless-adat-veryl
License MIT OR Apache-2.0

Modules

AdatRx ADATレシーバ トップモジュール
AdatTx ADAT TXトップモジュール
Smux2Packer 4chの高速サンプルをS/MUX2の8物理スロットへ並べ替える
Smux2Unpacker S/MUX2の8物理スロットを4chの高速サンプルへ戻す

Packages

Types ADAT公開型

Modules


AdatRx ADATレシーバ トップモジュール
AdatTx ADAT TXトップモジュール
Smux2Packer 4chの高速サンプルをS/MUX2の8物理スロットへ並べ替える
Smux2Unpacker S/MUX2の8物理スロットを4chの高速サンプルへ戻す

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 同期ロック状態

AdatTx

ADAT TXトップモジュール

8ch 24bit PCMをADATフレームへ変換し、NRZI信号として出力 channelsgndless_fixedpoint::FixedPointValue::<gndless_fixedpoint::Q1_23>境界で、raw値はchannels[i].rawから得る。 AdatRxchannels出力とは同じformatのため、Smux2Unpackerと同様に利用側でQ1.23 interfaceを共有できる。

実機確認状況

実機動作は未確認。現時点ではNative testと、RTL内部で接続したAdatTxAdatRx loopback testだけを確認している。 外部ADAT機器との相互接続、光送信回路を含む電気的条件、実機上のタイミングは未検証。

送信パイプラインは以下の2段で構成される。

  1. frame_serializer
    • frame_clk立ち上がりをトリガに256bit ADATフレームを構築して単一のshift registerへ保持し、MSB-firstでシリアル化
    • ADAT_FAMILYに応じて44.1kHz系/48kHz系のビット周期を選択
  2. nrzi_encoder
    • シリアルビットをNRZIへ変換してadatへ出力

公開インターフェースの概念タイミング

次図は縮尺なし。frame_clkの立ち上がりでchannelsを取り込み、256bitのNRZI送信が完了するとframe_doneをシステムクロック1周期だけHighにする。 adatの遷移パターンはPCM値によって変わる。

Parameters


CLK_FREQ u32 システムクロック周波数 [Hz]
ADAT_FAMILY AdatFamily ADATビットレートファミリー (44.1kHz系 or 48kHz系)

Ports


clk input clock
rst input reset
frame_clk input logic 外部フレームクロック立ち上がりで新規フレーム送信開始
channels modport gndless_fixedpoint __FixedPointValue__gndless_fixedpoint_Q1_23 input_port [8] 外部フレームクロック立ち上がりで新規フレーム送信開始
smux_active input bbool S/MUX有効フラグ入力
adat output logic ADAT NRZI出力
frame_done output logic 256bitフレーム送信完了パルス

Smux2Packer

4chの高速サンプルをS/MUX2の8物理スロットへ並べ替える

sample_validを96kHz側のサンプル受理パルス、frame_validを48kHz側のADATフレーム受理パルスとして使う。 2つの入力サンプルを1フレームにまとめ、各チャンネルの先行サンプルを偶数スロット、後続サンプルを奇数スロットへ配置する。 sampleschannelsgndless_fixedpoint::FixedPointValue::<gndless_fixedpoint::Q1_23>境界であり、 AdatTxchannels入力へ直接接続できる。

次図では、ABが時間順に連続する4ch sample setを表す。 sample_validを受理した2回目の立ち上がり後にchannelsを更新し、frame_validをシステムクロック1周期だけHighにする。

Ports


clk input clock
rst input reset
sample_valid input logic 高速サンプル受理パルス
samples modport gndless_fixedpoint __FixedPointValue__gndless_fixedpoint_Q1_23 input_port [4] 高速サンプル受理パルス
channels modport gndless_fixedpoint __FixedPointValue__gndless_fixedpoint_Q1_23 output_port [8]
frame_valid output logic フレーム更新パルス

Smux2Unpacker

S/MUX2の8物理スロットを4chの高速サンプルへ戻す

1つのADATフレームを受けたサイクルで先行サンプルを出力し、次のシステムクロックで後続サンプルを出力する。 したがって、frame_valid 1回に対して sample_valid は2クロック連続でHighになる。 frame_validは、後続サンプルの出力が終わるまで再度アサートしないこと。 channelssamplesgndless_fixedpoint::FixedPointValue::<gndless_fixedpoint::Q1_23>境界であり、 AdatRxchannels出力へ直接接続できる。

Ports


clk input clock
rst input reset
channels modport gndless_fixedpoint __FixedPointValue__gndless_fixedpoint_Q1_23 input_port [8]
frame_valid input logic
samples modport gndless_fixedpoint __FixedPointValue__gndless_fixedpoint_Q1_23 output_port [4]
sample_valid output logic

Module Prototypes


Interfaces


Packages


Types ADAT公開型

Types

ADAT公開型

ADAT RX/TX間で共有する型定義の提供