Skip to content

Commit ade019d

Browse files
wip: doc
1 parent 0bd7083 commit ade019d

File tree

2 files changed

+138
-46
lines changed

2 files changed

+138
-46
lines changed

ADAT_SPEC.md

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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`

README.md

Lines changed: 27 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,68 +2,49 @@
22

33
[![Docs](https://img.shields.io/badge/Docs-GitHub%20Pages-2ea44f?logo=github)](https://akiyukiokayasu.github.io/adat_rx/)
44

5-
ADAT信号を受信し、PCM信号を出力するRTL。クロックはADAT信号から作る
6-
Verylによる実装。
5+
ADAT光入力をデコードして、24bit PCMを出力するVeryl RTL
6+
クロックは入力ADATから復元します(外部PLL不要)。
77

8-
## プロジェクト状況
8+
## できること
99

10-
### 現在のステータス
10+
- ADAT受信と8ch 24bit PCMデコード
11+
- 44.1kHz / 48kHz 系での動作
12+
- 96kHz / 88.2kHz 入力(S/MUX有効)の受信テスト済み
13+
- UserBitに基づくS/MUX有効検出(`o_smux_active`
1114

12-
- ✅ PCMデータの受信・デコード完了
13-
- ✅ S/MUX有効検出: UserBitによるS/MUX有効/無効の自動検出
14-
- ✅ 厳密比較テストパス(`veryl test`): ビットパーフェクトな伝送可能
15-
- ✅ 44.1kHz, 48kHz, 88.2kHz, 96kHzでテスト
15+
## 導入前に知るべきこと
1616

17-
## ADAT基本仕様
17+
- `o_frame_clk` はADATフレーム周期であり、再生サンプルレートそのものではありません。
18+
例: 通常モードでは `o_frame_clk` と実サンプルレートは一致しますが、S/MUX有効時は一致しません。
19+
- S/MUXの基本、モード(S/MUX2/S/MUX4)、制約は [`ADAT_SPEC.md` の「5. S/MUX」](ADAT_SPEC.md#smux) を参照
20+
- `S/MUX2`/`S/MUX4` のモード対応は [`ADAT_SPEC.md` の「5.1 モード対応」](ADAT_SPEC.md#smux-modes) を参照
21+
- S/MUX時の論理チャンネル割り当ては [`ADAT_SPEC.md` の「5.2 物理スロットと論理チャンネルの関係」](ADAT_SPEC.md#smux-channel-mapping) を参照
22+
- S/MUX判別の制約(UserBitのみではS/MUX2/4を判別不可)は [`ADAT_SPEC.md` の「6. 重要な制約」](ADAT_SPEC.md#smux-limitations) を参照
1823

19-
48kHzか44.1kHzが基本サンプルレートであり、8ch伝送できる。
24+
## I/O要点
2025

21-
### フレーム仕様
26+
- 入力: `i_clk`(推奨50MHz), `i_rst`, `i_adat`
27+
- 出力: `o_channels[8]`, `o_valid`, `o_locked`, `o_frame_clk`, `o_smux_active`
2228

23-
1フレームは256bitで構成される。
24-
[ADATフレーム構造の詳細](https://akiyukiokayasu.github.io/adat_rx/adat_rx.html#%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E4%BC%9D%E9%80%81%E9%A0%86%E3%81%A8%E3%83%93%E3%83%83%E3%83%88%E6%9C%89%E6%84%8F%E6%80%A7%E3%81%AE%E5%AE%9A%E7%BE%A9)
29+
## 開発者向け(任意)
2530

26-
### エンコード
31+
Verylには組み込みテスト実行機能があり、RTL変更時の回帰確認に使えます。
2732

28-
4B5B→NRZI
29-
30-
### S/MUX
31-
32-
チャンネル数を減らす代わりに基本サンプルレートより高い周波数を使うことができる。
33-
34-
- S/MUX2: 96kHz or 88.2kHz, 4ch
35-
- S/MUX4: 192kHz or 176.4kHz, 2ch
36-
37-
UserBitで判定できるのはS/MUXが有効かどうかまでで、S/MUX2かS/MUX4かの自動判別は原理的に不可能。
38-
外部から供給されたwordclockを用いて判別するか、エンドユーザーが明示的に切り替えるしかない。
39-
40-
### ADAT物理ビットレート
41-
42-
- 48kHz系: 12.288Mbps
43-
- 44.1kHz系: 11.2896Mbps
44-
45-
S/MUX2もしくはS/MUX4になっても物理ビットレートは変わらないことに注意。
46-
S/MUX2では1フレームあたり2サンプル分が格納される。
47-
48-
## クロック仕様
49-
50-
- システムクロック: 50MHz推奨
51-
- 1bitあたりのクロック:
52-
- 48kHz時: 約4.07クロック (50MHz / 12.288MHz)
53-
- 44.1kHz時: 約4.43クロック (50MHz / 11.2896MHz)
54-
- 1フレーム: 256bit
55-
56-
## Test
33+
### テスト実行
5734

5835
```sh
5936
veryl test
6037
```
6138

62-
### 波形出力付き
63-
64-
FSTファイルで出力
39+
### 波形確認
6540

6641
```sh
6742
veryl test --wave
6843
surfer src/tb_adat_rx.fst
6944
```
45+
46+
## ドキュメント
47+
48+
- API/設計ドキュメント: <https://akiyukiokayasu.github.io/adat_rx/>
49+
- ADAT基本仕様メモ(本リポジトリ): [`ADAT_SPEC.md`](ADAT_SPEC.md)
50+
- ADATフレーム構造の詳細: <https://akiyukiokayasu.github.io/adat_rx/adat_rx.html#%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E4%BC%9D%E9%80%81%E9%A0%86%E3%81%A8%E3%83%93%E3%83%83%E3%83%88%E6%9C%89%E6%84%8F%E6%80%A7%E3%81%AE%E5%AE%9A%E7%BE%A9>

0 commit comments

Comments
 (0)