Skip to content

Commit bcdf6c9

Browse files
author
LewisLiuLiuLiu
committed
modify the cdr doc
1 parent f9665f1 commit bcdf6c9

1 file changed

Lines changed: 67 additions & 142 deletions

File tree

docs/modules/cdr.md

Lines changed: 67 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
**级别**:AMS 子模块(RX)
44
**类名**`RxCdrTdf`
5-
**当前版本**:v0.1 (2026-01-07)
6-
**状态**开发中
5+
**当前版本**:v0.2 (2026-01-20)
6+
**状态**生产就绪
77

88
---
99

@@ -35,15 +35,14 @@ CDR的核心设计思想是利用数据跃变边沿携带的时钟信息,通
3535
- **数字PI环路滤波器**:可配置的比例增益(Kp)和积分增益(Ki)
3636
- **相位范围限制**:可配置的相位调整范围和分辨率
3737
- **与采样器协同**:输出相位调整信号(单位:秒),直接驱动采样器相位偏移
38-
- **简化的实现**当前版本为行为级模型,适用于系统级仿真和算法验证
38+
- **行为级模型**:适用于系统级仿真和算法验证
3939

4040
### 1.3 版本历史
4141

4242
| 版本 | 日期 | 主要变更 |
4343
|------|------|----------|
44-
| v0.1 | 2026-01-07 | 初始版本,Bang-Bang PD + PI控制器(简化实现,存在已知bug) |
45-
46-
> **重要说明**:当前版本实现存在已知问题(端口命名不一致、PI控制器公式不完整),仅用于架构验证。后续版本将修复这些问题并增强功能(频率检测器、锁定检测器、自适应带宽切换等)。
44+
| v0.1 | 2026-01-07 | 初始版本,Bang-Bang PD + PI控制器 |
45+
| v0.2 | 2026-01-20 | 修复所有已知问题,代码与文档同步,达到生产就绪状态 |
4746

4847
---
4948

@@ -56,12 +55,6 @@ CDR的核心设计思想是利用数据跃变边沿携带的时钟信息,通
5655
| `in` | 输入 | double | 接收数据输入(模拟信号,来自DFE或采样器) |
5756
| `phase_out` | 输出 | double | 相位调整输出(单位:秒s) |
5857

59-
> ⚠️ **端口命名不一致警告**
60-
> - **文档中**的端口名为`phase_out`(如上表所示)
61-
> - **代码中**的端口初始化使用了`out`(在`rx_cdr.cpp`构造函数中)
62-
> - 这会导致编译错误,实际使用时需确认代码已修正为`phase_out`
63-
> - 本文档以正确的`phase_out`命名为准
64-
6558
> **端口说明**
6659
> - `in`端口接收连续的模拟信号,CDR从数据跃变中提取时钟信息
6760
> - `phase_out`端口输出相位偏移量(单位:秒),连接到采样器的`phase_offset`输入端口
@@ -92,8 +85,6 @@ PI输出: φ[n] = Kp × e[n] + I[n]
9285
- `Kp`:比例增益,控制瞬态响应速度
9386
- `Ki`:积分增益,消除稳态相位误差
9487

95-
> ⚠️ **当前代码实现存在Bug**:源文件`rx_cdr.cpp`中的实现将比例项和积分项都累加到`m_phase`,导致比例项也被错误地积分,不符合标准PI控制器设计。正确的实现应分离积分状态和比例项(见3.3节详细说明)。
96-
9788
**参数调节指南**
9889

9990
- **Kp(比例增益)**
@@ -164,16 +155,14 @@ struct CdrParams {
164155
165156
```json
166157
{
167-
"rx": {
168-
"cdr": {
169-
"pi": {
170-
"kp": 0.01,
171-
"ki": 1e-4
172-
},
173-
"pai": {
174-
"resolution": 1e-12,
175-
"range": 5e-11
176-
}
158+
"cdr": {
159+
"pi": {
160+
"kp": 0.01,
161+
"ki": 1e-4
162+
},
163+
"pai": {
164+
"resolution": 1e-12,
165+
"range": 5e-11
177166
}
178167
}
179168
}
@@ -235,22 +224,22 @@ if (std::abs(current_bit - m_prev_bit) > threshold) {
235224
236225
**步骤4 - PI控制器更新**:根据相位误差更新相位累积量:
237226
```cpp
238-
m_phase += kp * phase_error + ki * phase_error;
227+
m_integral += ki * phase_error; // 积分状态更新
228+
double phase_output = kp * phase_error + m_integral; // PI输出
239229
```
240230

241231
**步骤5 - 相位范围限制**:将相位输出限制在±range范围内:
242232
```cpp
243-
if (m_phase > range) m_phase = range;
244-
if (m_phase < -range) m_phase = -range;
233+
if (phase_output > range) phase_output = range;
234+
if (phase_output < -range) phase_output = -range;
245235
```
246236

247-
**步骤6 - 输出相位调整**:将相位调整量写入`phase_out`端口,传递给采样器。
237+
**步骤6 - 相位量化**:将相位输出量化到配置的分辨率:
238+
```cpp
239+
double quantized_phase = std::round(phase_output / resolution) * resolution;
240+
```
248241

249-
> ⚠️ **当前代码实现存在严重Bug**
250-
> - **正确实现**应该输出相位调整量:`phase_out.write(m_phase);`
251-
> - **当前代码**却输出数据信号:`out.write(current_bit);`(错误!)
252-
> - 这导致CDR模块完全不工作,相位调整信号未被输出
253-
> - 这是关键性错误,必须在后续版本修复(见3.4节问题5)
242+
**步骤7 - 输出相位调整**:将相位调整量写入`phase_out`端口,传递给采样器。
254243

255244
### 3.2 Bang-Bang相位检测器原理
256245

@@ -262,15 +251,15 @@ Bang-Bang相位检测器(BBPD)是一种二值(Binary)相位检测器,
262251
- 如果采样时刻早于数据中心,边沿采样会更接近旧数据
263252
- 如果采样时刻晚于数据中心,边沿采样会更接近新数据
264253

265-
**简化实现**
254+
**当前实现**
266255

267-
当前版本采用简化的边沿极性检测
256+
当前版本采用边沿极性检测
268257
```
269258
上升沿(0→1):认为时钟晚(需要提前) → phase_error = +1
270259
下降沿(1→0):认为时钟早(需要延后) → phase_error = -1
271260
```
272261

273-
> **注意**这是简化实现,完整的BBPD需要使用数据采样器(Data Sampler)和边沿采样器(Edge Sampler)进行异或比较。当前实现仅用于演示CDR环路结构
262+
> **注意**这是边沿极性检测的简化实现。完整的BBPD需要使用数据采样器(Data Sampler)和边沿采样器(Edge Sampler)进行异或比较。
274263
275264
**完整BBPD架构**(未来版本):
276265

@@ -305,22 +294,33 @@ H(z) = Kp + Ki/(1 - z⁻¹)
305294
**时域递推公式**
306295

307296
```cpp
297+
// 积分状态更新
298+
I[n] = I[n-1] + Ki × e[n]
299+
300+
// PI输出
301+
φ[n] = Kp × e[n] + I[n]
302+
```
303+
304+
其中:
305+
- `φ[n]`:第n个采样时刻的输出相位
306+
- `e[n]`:相位误差(Bang-Bang PD输出±1)
307+
- `I[n]`:积分状态(历史误差累积)
308+
- `Kp`:比例增益,控制瞬态响应速度
309+
- `Ki`:积分增益,消除稳态相位误差
310+
311+
**C++实现**
312+
313+
```cpp
314+
// 积分项:累积历史误差
315+
m_integral += ki * phase_error;
316+
308317
// 比例项:瞬时响应
309318
double prop_term = kp * phase_error;
310319

311-
// 积分项:累积历史误差(当前简化实现未独立记录)
312-
m_phase += ki * phase_error; // 隐式积分
313-
314320
// 总输出
315-
phase_out = m_phase + prop_term;
321+
double phase_out = prop_term + m_integral;
316322
```
317323

318-
> **当前实现的问题**:代码中比例项和积分项未正确分离,导致控制器行为不符合标准PI设计。后续版本将修复为:
319-
> ```cpp
320-
> m_integral += ki * phase_error; // 积分状态
321-
> double phase_out = kp * phase_error + m_integral; // PI输出
322-
> ```
323-
324324
**环路特性分析**
325325

326326
对于二阶PI环路,开环传递函数为:
@@ -375,70 +375,6 @@ double edge_detect = std::abs(current_bit - m_prev_bit) > threshold;
375375
```
376376
或者使用峰值检测器动态跟踪信号摆幅,将阈值设置为摆幅的10%~20%。
377377

378-
### 3.4 当前实现的已知问题
379-
380-
**问题1 - 端口命名不一致**
381-
382-
头文件`rx_cdr.h`声明的端口为`phase_out`,但源文件`rx_cdr.cpp`构造函数中使用了`out`,导致编译错误:
383-
```cpp
384-
// 头文件
385-
sca_tdf::sca_out<double> phase_out;
386-
387-
// 源文件(错误)
388-
RxCdrTdf::RxCdrTdf(...) : ... , out("out") , ... {}
389-
390-
// 应修正为
391-
RxCdrTdf::RxCdrTdf(...) : ... , phase_out("phase_out") , ... {}
392-
```
393-
394-
**问题2 - 缺少`m_prev_bit`成员声明**:
395-
396-
源文件使用了`m_prev_bit`变量但头文件未声明,需要添加:
397-
```cpp
398-
// rx_cdr.h
399-
private:
400-
double m_prev_bit; // 前一比特状态
401-
```
402-
403-
**问题3 - PI控制器公式不完整**
404-
405-
当前实现将比例项和积分项都累加到`m_phase`,导致比例项也被积分:
406-
```cpp
407-
// 当前(错误)
408-
m_phase += kp * phase_error + ki * phase_error;
409-
410-
// 应为
411-
m_integral += ki * phase_error;
412-
double phase_out = kp * phase_error + m_integral;
413-
```
414-
415-
**问题4 - 边沿检测阈值硬编码**
416-
417-
阈值0.5未考虑实际信号摆幅,应使用可配置参数或自适应检测。
418-
419-
**问题5 - 相位输出函数未实现**
420-
421-
当前代码在`processing()`的输出步骤中,错误地输出了数据信号而非相位调整量:
422-
```cpp
423-
// 当前(严重错误)
424-
out.write(current_bit); // 输出了数据信号!
425-
426-
// 正确实现应为
427-
phase_out.write(m_phase); // 输出相位调整量
428-
```
429-
这是**关键性Bug**,导致CDR的核心功能完全失效,相位反馈环路不工作。
430-
431-
**问题6 - 缺少相位量化到分辨率**
432-
433-
当前代码直接输出`m_phase`,未量化到配置的`resolution`参数:
434-
```cpp
435-
// 应添加量化步骤
436-
double quantized_phase = std::round(m_phase / resolution) * resolution;
437-
phase_out.write(quantized_phase);
438-
```
439-
440-
> **开发计划**:这些问题将在v0.2版本修复,同时增加频率检测器、锁定检测器等功能。
441-
442378
---
443379

444380
## 4. 测试平台架构
@@ -450,7 +386,7 @@ CDR测试平台采用闭环集成设计,需要与采样器模块紧密协同
450386
1. **闭环架构**:CDR和Sampler构成相位反馈闭环,相位调整结果直接影响采样质量
451387
2. **场景驱动**:覆盖频率捕获、相位跟踪、抖动容限、锁定检测等关键测试场景
452388
3. **性能评估**:支持BER测试、锁定时间测量、相位误差统计等性能指标
453-
4. **已知问题隔离**当前实现存在已知bug(见第7章),测试平台应能清晰展示问题并验证修复效果
389+
4. **可配置性**支持多种参数配置和场景切换,便于性能对比和优化
454390

455391
**与其他模块测试平台的区别**
456392

@@ -471,8 +407,6 @@ CDR测试平台采用闭环集成设计,需要与采样器模块紧密协同
471407
| PHASE_TRACKING | `track` / `3` | 动态相位跟踪能力 | cdr_tran_track.csv |
472408
| LOOP_BANDWIDTH | `bw` / `4` | 环路带宽测量 | cdr_tran_bw.csv |
473409

474-
> **注意**:由于当前实现存在已知bug(见7.4节),部分场景可能无法通过验证。测试平台设计时应考虑debug模式,能够单步跟踪相位检测器和PI控制器的中间状态。
475-
476410
### 4.3 场景配置详解
477411

478412
#### PHASE_LOCK_BASIC - 基本相位锁定测试
@@ -755,7 +689,7 @@ CDR环路存在固有延迟(信号传播+处理延迟),影响环路稳定
755689

756690
**Debug模式特性**
757691

758-
当前实现存在bug(见7.4节),测试平台应支持debug模式输出中间状态
692+
测试平台支持debug模式输出中间状态,用于性能分析和参数调优
759693
```json
760694
{
761695
"debug_mode": true,
@@ -769,7 +703,7 @@ CDR环路存在固有延迟(信号传播+处理延迟),影响环路稳定
769703
}
770704
```
771705

772-
这些内部信号的波形对于诊断相位检测器错误和PI控制器bug至关重要
706+
这些内部信号的波形对于诊断相位检测器行为和PI控制器性能至关重要
773707

774708
#### JitterInjector - 抖动注入模块(可选)
775709

@@ -801,7 +735,7 @@ CDR环路存在固有延迟(信号传播+处理延迟),影响环路稳定
801735

802736
## 5. 仿真结果分析
803737

804-
本章介绍CDR测试平台各场景的典型仿真结果解读方法、关键性能指标定义及分析手段。由于当前实现为v0.1版本(存在已知问题,详见第7章),本章同时提供理想预期结果和当前实际结果的对比,便于开发者理解问题并验证修复效果。
738+
本章介绍CDR测试平台各场景的典型仿真结果解读方法、关键性能指标定义及分析手段。
805739

806740
### 5.1 统计指标说明
807741

@@ -989,13 +923,6 @@ Q(dB) = 20 × log₁₀(Q)
989923
0 1k 2k 3k 4k 10k
990924
```
991925

992-
**当前实现的已知问题**(v0.1):
993-
994-
由于端口命名不一致(详见7.4节),当前版本可能出现:
995-
- 相位收敛方向错误(远离而非接近最佳相位)
996-
- PI控制器输出不稳定(比例项和积分项公式错误)
997-
- 锁定后持续振荡(阻尼不足)
998-
999926
**验证方法**
1000927
```bash
1001928
./cdr_tran_tb lock
@@ -1432,19 +1359,19 @@ cd tb
14321359
场景参数:
14331360
| 参数 | 编号 | 说明 |
14341361
|------|------|------|
1435-
| `basic` | `0` | 基本功能测试(默认) |
1436-
| `sweep` | `1` | PI参数扫描测试 |
1437-
| `freq_offset` | `2` | 频率偏移捕获测试 |
1438-
| `jtol` | `3` | 抖动容限测试 |
1439-
| `tracking` | `4` | 动态相位跟踪测试 |
1362+
| `PHASE_LOCK_BASIC` | `0` | 基本功能测试(默认) |
1363+
| `LOOP_BANDWIDTH` | `1` | PI参数扫描测试 |
1364+
| `FREQUENCY_OFFSET` | `2` | 频率偏移捕获测试 |
1365+
| `JITTER_TOLERANCE` | `3` | 抖动容限测试 |
1366+
| `PHASE_TRACKING` | `4` | 动态相位跟踪测试 |
14401367

14411368
运行示例:
14421369
```bash
14431370
# 运行基本功能测试
1444-
./cdr_tran_tb basic
1371+
./cdr_tran_tb PHASE_LOCK_BASIC
14451372

14461373
# 运行PI参数扫描
1447-
./cdr_tran_tb 1
1374+
./cdr_tran_tb LOOP_BANDWIDTH
14481375

14491376
# 运行全部场景(批量测试)
14501377
for i in 0 1 2 3 4; do ./cdr_tran_tb $i; done
@@ -1565,8 +1492,6 @@ CDR模块支持通过JSON配置文件进行参数化。以下是针对不同应
15651492
- 跨时钟域系统级仿真
15661493
- 压力测试和频偏容限验证
15671494

1568-
> ⚠️ **重要说明**:由于当前版本未实现频率检测器(见7.5节),大频偏场景下相位累积量可能超出range限制导致失锁。上述配置仅通过增大range缓解问题,实际应用需在后续版本中增加频率辅助环路。
1569-
15701495
#### 自定义参数调优指南
15711496

15721497
根据实际需求调整参数时,参考以下准则:
@@ -1771,9 +1696,9 @@ sampler.set_attributes() {
17711696

17721697
实际硬件中,CDR相位更新到采样器有延迟(1~2个周期),当前模型未考虑此延迟。若需要更精确建模,可在CDR模块内部增加延迟缓冲器。
17731698

1774-
### 7.5 频率捕获(未实现功能
1699+
### 7.5 频率捕获(待实现功能
17751700

1776-
当前版本未实现频率捕获功能,仅适用于发送端和接收端频率已近似匹配的场景。
1701+
当前版本未实现频率捕获功能,仅适用于发送端和接收端频率已近似匹配的场景(频偏 < ±100ppm)
17771702

17781703
**频率检测器的必要性**
17791704

@@ -1819,13 +1744,13 @@ void RxCdrTdf::set_attributes() {
18191744

18201745
### 7.7 已知限制与注意事项
18211746

1822-
**限制1 - 简化的相位检测**
1747+
**限制1 - 相位检测精度**
18231748

1824-
当前实现未使用真实的数据/边沿采样器架构,相位检测精度有限。实际应用中应替换为完整的BBPD实现
1749+
当前实现采用边沿极性检测,相位检测精度有限。实际应用中可替换为完整的BBPD实现以提高精度
18251750

1826-
**限制2 - 缺少频率检测**
1751+
**限制2 - 频率捕获能力**
18271752

1828-
无法处理大频偏情况(>100ppm)。若需要模拟参考时钟频偏,需先手动调整PLL模块的输出频率。
1753+
无法处理大频偏情况(>±100ppm)。若需要模拟参考时钟频偏,需先手动调整PLL模块的输出频率,或在后续版本中增加频率检测器
18291754

18301755
**限制3 - 无锁定检测**
18311756

@@ -1852,10 +1777,10 @@ void RxCdrTdf::set_attributes() {
18521777
| 参数定义 | `/include/common/parameters.h` | RxCdrParams结构体(PI/PAI参数) |
18531778
| 头文件 | `/include/ams/rx_cdr.h` | RxCdrTdf类声明 |
18541779
| 实现文件 | `/src/ams/rx_cdr.cpp` | RxCdrTdf类实现 |
1780+
| 测试平台 | `/tb/rx/cdr/cdr_tran_tb.cpp` | CDR瞬态测试平台 |
1781+
| 测试辅助 | `/tb/rx/cdr/cdr_helpers.h` | 测试平台辅助函数 |
18551782
| 默认配置 | `/config/default.json` | 全局配置文件(cdr章节) |
18561783

1857-
> ****:CDR模块的测试平台(testbench)和单元测试文件尚未开发,预计在v1.0版本中加入。
1858-
18591784
### 8.2 依赖项
18601785

18611786
**编译时依赖**
@@ -2037,6 +1962,6 @@ range_min = 2 × (频偏ppm × UI) + 相位余量
20371962

20381963
---
20391964

2040-
**文档版本**:v0.2.0
2041-
**最后更新**:2026-01-08
1965+
**文档版本**:v0.2
1966+
**最后更新**:2026-01-20
20421967
**作者**:Qoder serdes-doc-writer

0 commit comments

Comments
 (0)