gndless_adat
ADAT optical receive, transmit, and S/MUX2 cores for Veryl.
| Version | 0.1.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)
- 192kHz: 2チャンネル (S/MUX4)
S/MUX時のチャンネルマッピング(別moduleまたは利用側で実装)
本モジュールは channels[0..7] を物理スロットとして出力し、S/MUXの論理チャンネル再構成は行わない。
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 CH0 <=
- S/MUX4 (192kHz / 176.4kHz, 2ch)
- Logical CH0 <=
channels[0]+channels[1]+channels[2]+channels[3] - Logical CH1 <=
channels[4]+channels[5]+channels[6]+channels[7]
- Logical CH0 <=
時間順は、各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 の更新時に valid がシステムクロック1周期だけHighになる。
locked は有効なフレームを連続受信した後にHighになる。
frame_clk はADATフレーム周期を示し、S/MUX時の論理sample rateではない。
Examples
inst adat: AdatRx (
clk : sys_clk_50mhz,
rst : reset,
adat : toslink_in,
channels : audio,
frame_clk : frame_clk,
smux_active: smux_active,
valid : 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に基づいて検出されたS/MUX有効状態 (1: enabled, 0: disabled)。 注意: S/MUX2とS/MUX4の判別は原理的に不可能なので、あくまでS/MUXが有効か無効かだけを示す。 |
| channels | output | logic<24> [8] | 8チャンネルPCMデータ出力(ADAT物理スロット)。 注意: S/MUX有効時の論理チャンネル再構成は利用側の実装が必要 |
| valid | output | logic | データ有効信号 |
| locked | output | bbool | 同期ロック状態 |
AdatTx
ADAT TXトップモジュール
8ch 24bit PCMをADATフレームへ変換し、NRZI信号として出力
実機確認状況
実機動作は未確認。現時点ではNative testと、RTL内部で接続したAdatTx→AdatRx loopback testだけを確認している。
外部ADAT機器との相互接続、光送信回路を含む電気的条件、実機上のタイミングは未検証。
送信パイプラインは以下の3段で構成される。
frame_builderframe_clk立ち上がりをトリガに256bit ADATフレームを構築
bit_serializer- 256bitフレームをMSB-firstでシリアル化
ADAT_FAMILYに応じて44.1kHz系/48kHz系のビット周期を選択
nrzi_encoder- シリアルビットをNRZIへ変換して
adatへ出力
- シリアルビットをNRZIへ変換して
公開インターフェースの概念タイミング
次図は縮尺なし。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 | システムクロック (50MHz) |
|---|---|---|---|
| rst | input | reset | リセット |
| frame_clk | input | logic | 外部フレームクロック立ち上がりで新規フレーム送信開始 |
| channels | input | logic<24> [8] | 8ch 24bit PCM入力 |
| 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フレームにまとめ、各チャンネルの先行サンプルを偶数スロット、後続サンプルを奇数スロットへ配置する。
次図では、AとBが時間順に連続する4ch sample setを表す。
sample_validを受理した2回目の立ち上がり後にchannelsを更新し、frame_validをシステムクロック1周期だけHighにする。
Parameters
| SAMPLE_WIDTH | u32 | サンプルのビット幅 |
|---|
Ports
| clk | input | clock | システムクロック | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| rst | input | reset | リセット | ||||||||
| sample_valid | input | logic | 高速サンプル受理パルス | ||||||||
| samples | input | logic| 4チャンネルの高速サンプル
|
channels |
output |
logic | S/MUX物理スロット列
|
frame_valid |
output |
logic |
フレーム更新パルス
|
|
Smux2Unpacker
S/MUX2の8物理スロットを4chの高速サンプルへ戻す
1つのADATフレームを受けたサイクルで先行サンプルを出力し、次のシステムクロックで後続サンプルを出力する。
したがって、frame_valid 1回に対して sample_valid は2クロック連続でHighになる。
frame_validは、後続サンプルの出力が終わるまで再度アサートしないこと。
Parameters
| SAMPLE_WIDTH | u32 | サンプルのビット幅 |
|---|
Ports
| clk | input | clock | システムクロック | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| rst | input | reset | リセット | ||||||||||||
| channels | input | logic| S/MUX物理スロット列
|
frame_valid |
input |
logic |
フレーム受理パルス
|
samples |
output |
logic | 4チャンネルの高速サンプル
|
sample_valid |
output |
logic |
高速サンプル有効パルス
|
|
Module Prototypes
Interfaces
Packages
| Types | ADAT公開型 |
|---|
Types
ADAT公開型
ADAT RX/TX間で共有する型定義の提供