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// 比例项:瞬时响应
309318double 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测试平台采用闭环集成设计,需要与采样器模块紧密协同
4503861 . ** 闭环架构** :CDR和Sampler构成相位反馈闭环,相位调整结果直接影响采样质量
4513872 . ** 场景驱动** :覆盖频率捕获、相位跟踪、抖动容限、锁定检测等关键测试场景
4523883 . ** 性能评估** :支持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# 运行全部场景(批量测试)
14501377for 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