2. 基本概念:时钟信号、数据信号、建立时间和保持时间
做时序分析也好,测眼图也罢,有四个概念你绕不开——时钟、数据、建立时间、保持时间。说白了,整个数字系统的节奏就靠它们撑着。我带过的不少新人,上来就盯着仿真波形看,却说不清这几个东西到底在干什么。今天咱们把底子打扎实。
2.1 时钟信号——系统的脉搏
时钟信号就是数字系统的“心跳”。没有它,寄存器就不知道该什么时候动作。我习惯把时钟想象成学校里的铃声——铃响了,大家该干嘛干嘛;没响,都原地待着。
时钟的主要参数有频率、占空比、抖动和Skew。其中抖动和Skew我们后面会专门讲,这里先记住时钟的本质:它是一个周期性的方波,用来统一定义时序的基准。
| 参数 | 说明 | 常见影响 |
|---|---|---|
| 频率 | 每秒多少个周期 | 决定系统速度上限 |
| 占空比 | 高电平时间占周期的比例 | 通常50%,DDR等需要对称 |
| 抖动 | 时钟边沿的短期随机偏移 | 降低时序裕量,影响误码率 |
| Skew | 时钟到达不同点的相位差 | 破坏建立/保持时间关系 |
2.2 数据信号——需要传递的信息
数据信号就是我们要传输的0和1。但光有0和1还不够,得和时钟对齐才能被正确采样。数据信号有两个关键特征:有效窗口(data valid window)和转换时间(transition time)。
有效窗口,指的是数据稳定的那段区间。转换时间则是信号从0到1或1到0的渐变过程。你想想看,如果数据的边沿正好落在时钟采样点上,那采集结果可能就是不确定的,逻辑就可能出错。
数据与时钟的关系
- 源同步:数据和时钟一起传送,比如DDR的DQ和DQS。
- 公共时钟:系统所有器件共用同一个时钟源,比如普通并行总线。
- 嵌入式时钟:时钟信息内嵌在数据中,比如SerDes中的8B/10B编码。
记得我早年调一块背板,用公共时钟走两米长的走线,结果接收端数据老是乱跳。后来发现时钟到达每个板卡的时间差太大了——这就是时钟Skew在捣鬼。
2.3 建立时间和保持时间——触发器的死线
建立时间(setup time)和保持时间(hold time)是触发器的固有特性,厂家在数据手册里会给。你可以把它们看作触发器的两个“规矩”: 建立时间:数据必须在时钟有效沿到来前稳定下来的最短时间。 保持时间:数据必须在时钟有效沿到来后继续保持的最短时间。
违反任何一个,输出就可能进入亚稳态——既不是0也不是1,甚至振荡。我自己就在一块FPGA板上踩过这个坑:复位释放时序没算好,导致全局复位后部分寄存器卡在中间态,整板功能时好时坏。
T_clk + T_skew + T_data > T_hold → 保持时间约束
T_clk + T_skew < T_setup + T_period - T_data → 建立时间约束
其中T_data是组合逻辑延迟,T_clk是时钟周期,T_skew是时钟歪斜(接收端相对发送端)。
2.4 时序裕量——多留点余量总是好的
裕量(slack)就是你实际时序参数与边界之间的差值。正裕量说明满足约束,负裕量说明违反。但我不建议卡着零裕量做设计——温度一变、电压一抖,零裕量就可能变成负。
我在项目中一般会留至少10%的裕量。曾经有个PCIe Gen3的通道,仿真显示建立时间裕量只有5ps,我坚持改版优化走线,最终量产良率从85%提升到97%。你说这5ps值不值?
2.5 知识框架图
下面这张图把今天讲的核心关系串了一下。时钟、数据、建立时间和保持时间不是孤立的——它们围绕触发器形成了一个闭环约束。
2.6 速查小贴士
| 场景 | 我通常会怎么做 |
|---|---|
| 建立时间违反 | 减小组合逻辑级数、增加时钟周期、插入流水线 |
| 保持时间违反 | 增加数据延迟路径、减小时钟Skew、加缓冲器 |
| 时钟抖动过大 | 检查电源噪声、更换PLL、增加去耦电容 |
| 数据不满足眼图模板 | 调整预加重、均衡、走线阻抗 |