adat_rx
| Version | 0.3.0 |
|---|
Modules
| adat_rx | ADATレシーバ トップモジュール |
|---|---|
| adat_tx | ADAT TXトップモジュール |
Module Prototypes
Interfaces
Packages
| adat_pkg | ADAT共通パッケージ |
|---|
Modules
| adat_rx | ADATレシーバ トップモジュール |
|---|---|
| adat_tx | ADAT TXトップモジュール |
adat_rx
ADATレシーバ トップモジュール
ADAT光入力から8チャンネル24ビットPCMをデコードする。 クロックはADAT信号から自動復元される(外部PLLは不要)。
対応サンプルレート
- 48kHz: 8チャンネル
- 96kHz: 4チャンネル (S/MUX2)
- 192kHz: 2チャンネル (S/MUX4)
S/MUX時のチャンネルマッピング(利用側で実装)
本モジュールは o_channels[8] を物理スロットとして出力し、S/MUXの論理チャンネル再構成は行わない。
- S/MUX2 (96kHz / 88.2kHz, 4ch)
- Logical CH0 <=
o_channels[0]+o_channels[1] - Logical CH1 <=
o_channels[2]+o_channels[3] - Logical CH2 <=
o_channels[4]+o_channels[5] - Logical CH3 <=
o_channels[6]+o_channels[7]
- Logical CH0 <=
- S/MUX4 (192kHz / 176.4kHz, 2ch)
- Logical CH0 <=
o_channels[0]+o_channels[1]+o_channels[2]+o_channels[3] - Logical CH1 <=
o_channels[4]+o_channels[5]+o_channels[6]+o_channels[7]
- Logical CH0 <=
時間順は、各Logical CH内では添字の小さいスロットが先のサンプル。
ADATフレーム構造 (256 bits @ 48kHz = 20.83us)
5ビットニブル単位で構成。各ニブル: [4bit data][1bit separator=1]
シリアル伝送順とビット有意性の定義
- シリアル伝送順: フレーム先頭から順方向(
build_frame[255]→build_frame[0])。 - 5bitニブルの伝送順:
D23..D20のように data部は MSB-first。 - PCM 24bit語のビット有意性:
o_channels[x][23]がMSB、o_channels[x][0]がLSB。 - したがって nibble 列
D23..D20, D19..D16, ... D3..D0は23:20, 19:16, ... 3:0にそのまま対応する。
詳細構成(5ビットニブル単位)
| ビット | 内容 | 説明 |
|---|---|---|
| 0-10 | 0000000000 + 1 | SYNC: 10ビットの0(NRZIで無遷移) + separator=1 |
| 11-15 | U3-U0 + 1 | User nibble: User bits[3:0] + separator |
| 16-20 | D23-D20 + 1 | CH0 nibble0: audio[23:20] + separator |
| 21-25 | D19-D16 + 1 | CH0 nibble1: audio[19:16] + separator |
| 26-30 | D15-D12 + 1 | CH0 nibble2: audio[15:12] + separator |
| 31-35 | D11-D8 + 1 | CH0 nibble3: audio[11:8] + separator |
| 36-40 | D7-D4 + 1 | CH0 nibble4: audio[7:4] + separator |
| 41-45 | D3-D0 + 1 | CH0 nibble5: audio[3:0] + separator |
| 46-75 | ... | CH1 (上記と同じ6 nibbles) |
| ... | ... | CH2-CH7 (各30ビット) |
セパレーターの役割
- 各5ビットニブルの最後に「1」が配置される
- これによりNRZIエンコーディングで必ず遷移が発生
- 最大5ビット連続で無遷移になるのを防ぎ、同期を維持
使用例
inst adat: adat_rx (
i_clk : sys_clk_50mhz,
i_rst : reset,
i_adat : toslink_in,
o_channels: audio_out,
o_frame_clk: frame_clk,
);
タイミング
- 推奨クロック: 50MHz
- ADAT入力: TOSLINK光→電気変換済み信号
Ports
| i_clk | input | clock | システムクロック (50MHz推奨) |
|---|---|---|---|
| i_rst | input | reset | |
| i_adat | input | logic | ADAT入力 (光→電気変換済み) |
| o_frame_clk | output | logic | ADATフレーム周期のクロック出力(sample rateではない) 通常は44.1/48kHz。 warning: S/MUX有効時でも44.1kHz/48kHzが出力されることに注意 |
| o_smux_active | output | logic | UserBit2に基づいて検出されたS/MUX有効状態 (1: enabled, 0: disabled) warning: S/MUX2とS/MUX4の判別は原理的に不可能なので、あくまでS/MUXが有効or無効のみを示す |
| o_channels | output | logic<24> [8] | 8チャンネルPCMデータ出力(ADAT物理スロット) warning: S/MUX有効時の論理チャンネル再構成は利用側の実装が必要 |
| o_valid | output | logic | データ有効信号 |
| o_locked | output | logic | 同期ロック状態 |
adat_tx
ADAT TXトップモジュール
8ch 24bit PCMをADATフレームへ変換し、NRZI信号として出力する。 送信パイプラインは以下の3段で構成される。
tx_frame_builderi_frame_clk立ち上がりをトリガに256bit ADATフレームを構築
tx_bit_serializer- 256bitフレームをMSB-firstでシリアル化
ADAT_FAMILYに応じて44.1kHz系/48kHz系のビット周期を選択
tx_nrzi_encoder- シリアルビットをNRZIへ変換して
o_adatへ出力
- シリアルビットをNRZIへ変換して
Parameters
| CLK_FREQ | u32 | システムクロック周波数 [Hz] |
|---|---|---|
| ADAT_FAMILY | AdatFamily | ADATビットレートファミリー (1'b0=F44K1[44.1kHz系], 1'b1=F48K[48kHz系]) |
Ports
| i_clk | input | clock | システムクロック (50MHz) |
|---|---|---|---|
| i_rst | input | reset | |
| i_frame_clk | input | logic | 外部フレームクロック立ち上がりで新規フレーム送信開始 |
| i_channels | input | logic<24> [8] | 8ch 24bit PCM入力 |
| i_smux_active | input | logic | S/MUX有効フラグ入力 |
| o_adat | output | logic | ADAT NRZI出力 |
Module Prototypes
Interfaces
Packages
| adat_pkg | ADAT共通パッケージ |
|---|
adat_pkg
ADAT共通パッケージ
ADAT RX/TX間で共有する型定義と定数を提供する。