|
| 1 | +# ADAT基本仕様メモ |
| 2 | + |
| 3 | +このドキュメントは、ADAT(Alesis Digital Audio Tape optical interface)の受信実装で必要になる基礎仕様を、実装寄りに整理したものです。 |
| 4 | + |
| 5 | +## 1. ADATの基本 |
| 6 | + |
| 7 | +- 物理層はTOSLINK光(本IPへの入力は光電変換後のデジタル信号 `i_adat`) |
| 8 | +- 1フレームあたり8スロット(8ch相当)を送る |
| 9 | +- 各スロットは24bitオーディオ語を運ぶ |
| 10 | +- ライン符号化はNRZI |
| 11 | + |
| 12 | +## 2. フレーム構造(通常ADAT) |
| 13 | + |
| 14 | +この実装では1フレームを **256bit** として扱います。 |
| 15 | + |
| 16 | +- SYNC部: 11bit(`0000000000 + separator(1)`) |
| 17 | +- User部: 5bit(`U3..U0 + separator(1)`) |
| 18 | +- Audio部: 8ch × 30bit = 240bit |
| 19 | + |
| 20 | +合計: `11 + 5 + 240 = 256bit` |
| 21 | + |
| 22 | +### 2.1 5bitニブル構造 |
| 23 | + |
| 24 | +オーディオデータは5bitニブルで送られます。 |
| 25 | + |
| 26 | +- 1ニブル = `[4bit data][1bit separator=1]` |
| 27 | +- 24bit語は6ニブルで表現(`24 / 4 = 6`) |
| 28 | +- 1chあたり `6 × 5 = 30bit` |
| 29 | + |
| 30 | +### 2.2 ビット順序 |
| 31 | + |
| 32 | +本プロジェクトでの定義: |
| 33 | + |
| 34 | +- シリアル伝送順: フレーム先頭から `build_frame[255] -> build_frame[0]` |
| 35 | +- nibble内のdata部: MSB-first(例: `D23..D20`) |
| 36 | +- PCMの有意性: `o_channels[x][23]` がMSB、`o_channels[x][0]` がLSB |
| 37 | + |
| 38 | +つまり、`D23..D20, D19..D16, ..., D3..D0` がそのまま `23:20, 19:16, ..., 3:0` に対応します。 |
| 39 | + |
| 40 | +### 2.3 separator bitの意味 |
| 41 | + |
| 42 | +各5bitニブル末尾の `separator=1` は、NRZI上で定期的に遷移を作る役割があります。 |
| 43 | + |
| 44 | +- 連続無遷移区間が長くなりすぎるのを抑える |
| 45 | +- 受信側のタイミング復元・同期維持を助ける |
| 46 | + |
| 47 | +## 3. フレーム周期とサンプルレート |
| 48 | + |
| 49 | +ADATの「フレーム周期」はベースレート(44.1k/48k系)で進みます。 |
| 50 | + |
| 51 | +- 48k系: フレーム周期は約 `20.83us`(= `1 / 48,000`) |
| 52 | +- 44.1k系: フレーム周期は約 `22.68us`(= `1 / 44,100`) |
| 53 | + |
| 54 | +このIPの `o_frame_clk` はフレーム周期クロックです。 |
| 55 | + |
| 56 | +- 通常モード: `o_frame_clk` と実サンプルレートは一致 |
| 57 | +- S/MUX有効時: 実サンプルレートは `o_frame_clk` の2倍または4倍 |
| 58 | + |
| 59 | +## 4. User bits |
| 60 | + |
| 61 | +フレーム先頭付近に4bitのUser nibble(`U3..U0`)があります。 |
| 62 | + |
| 63 | +本IPではこのうち User Bit 2(実装上は `i_user_bits[1]`)をS/MUX有効判定に使います。 |
| 64 | + |
| 65 | +- `0`: S/MUX無効 |
| 66 | +- `1`: S/MUX有効 |
| 67 | + |
| 68 | +<a id="smux"></a> |
| 69 | +## 5. S/MUX(Sample Multiplexing) |
| 70 | + |
| 71 | +高サンプルレートをADATフレームに載せるために、1つの論理チャンネルを複数の物理スロットに分割して運ぶ方式です。 |
| 72 | + |
| 73 | +<a id="smux-modes"></a> |
| 74 | +### 5.1 モード対応 |
| 75 | + |
| 76 | +- 通常ADAT(S/MUX無効): 48k/44.1k, 8ch |
| 77 | +- S/MUX2: 96k/88.2k, 4ch |
| 78 | +- S/MUX4: 192k/176.4k, 2ch |
| 79 | + |
| 80 | +<a id="smux-channel-mapping"></a> |
| 81 | +### 5.2 物理スロットと論理チャンネルの関係 |
| 82 | + |
| 83 | +本IPの `o_channels[8]` は常に「ADATの物理スロット順」で出力されます(`[0] -> [1] -> ... -> [7]`)。 |
| 84 | + |
| 85 | +論理チャンネル再構成は利用側で実装します。 |
| 86 | + |
| 87 | +- S/MUX2 |
| 88 | + - Logical CH0 <= `o_channels[0] + o_channels[1]` |
| 89 | + - Logical CH1 <= `o_channels[2] + o_channels[3]` |
| 90 | + - Logical CH2 <= `o_channels[4] + o_channels[5]` |
| 91 | + - Logical CH3 <= `o_channels[6] + o_channels[7]` |
| 92 | +- S/MUX4 |
| 93 | + - Logical CH0 <= `o_channels[0] + o_channels[1] + o_channels[2] + o_channels[3]` |
| 94 | + - Logical CH1 <= `o_channels[4] + o_channels[5] + o_channels[6] + o_channels[7]` |
| 95 | + |
| 96 | +時間順は、各Logical CH内で添字の小さいスロットが先のサンプルです。 |
| 97 | + |
| 98 | +<a id="smux-limitations"></a> |
| 99 | +## 6. 重要な制約(実装時の注意) |
| 100 | + |
| 101 | +- User bitsだけで分かるのは「S/MUX有効/無効」まで |
| 102 | +- **S/MUX2 と S/MUX4 はUser bitsのみでは判別不能** |
| 103 | +- 判別には外部WordClock、上位設定、または別系統のメタ情報が必要 |
| 104 | +- 本IPはS/MUX時の論理チャンネル再配置を行わない |
| 105 | + |
| 106 | +## 7. 本リポジトリ実装との対応 |
| 107 | + |
| 108 | +- フレーム/ビット構造: `src/adat_rx.veryl` |
| 109 | +- S/MUX有効検出(User Bit 2): `src/output_interface.veryl` |
| 110 | +- 同期/フレーム時間追跡: `src/timing_tracker.veryl` |
| 111 | +- 5bitニブルから24bit復元: `src/bit_decoder.veryl`, `src/frame_parser.veryl` |
0 commit comments