1. 时序基础概念:时钟周期、上升沿、下降沿、建立时间、保持时间

做嵌入式这么多年,我见过太多工程师在低速总线上栽跟头。你可能会想,低速嘛,时序要求又不高,随便搞搞就行。嗯,我以前也这么想,直到有一次I2C通信死活不稳定,查了三天才发现是建立时间差了那么几纳秒。

说白了,时序就是数字电路的「交通规则」。信号什么时候出发、什么时候到达、什么时候采样,都得按规矩来。今天我们就从最基础的五个概念说起。

1.1 时钟周期

时钟周期,就是时钟信号重复一次的时间间隔。比如50MHz的时钟,周期就是20ns。这个很好理解,对吧?

但我要提醒你一点:时钟周期不是你想设多少就能跑多少的。它受限于整个路径上的延迟总和。我在一个项目中遇到过,明明芯片手册说能跑100MHz,结果实际板子上只能跑到80MHz,就是因为PCB走线太长,信号传输时间超了。

核心公式:

T_clk ≥ T_clk2q + T_logic + T_setup + T_skew

其中T_clk2q是触发器输出延迟,T_logic是组合逻辑延迟,T_setup是建立时间,T_skew是时钟偏斜。

1.2 上升沿与下降沿

上升沿,就是信号从低电平跳变到高电平的那个瞬间。下降沿则相反。大多数同步电路都在上升沿采样数据,但也有用下降沿的,比如DDR内存就用双沿。

你可能会问:为什么非要用边沿?直接用高电平或低电平不行吗?

其实早期确实有电平触发的电路,但问题在于:电平持续的时间太长,容易受到噪声干扰。而边沿只是一个瞬间,抗干扰能力强得多。我调试SPI总线时,就遇到过因为上升沿太缓导致采样错误的案例——信号从0到1花了将近10ns,结果接收端根本分不清边沿在哪。

实战技巧:

用示波器看时钟信号时,重点关注上升时间。如果上升时间超过周期的10%,就要小心了。比如20ns的时钟,上升时间超过2ns就可能出问题。

1.3 建立时间

建立时间,是指数据在时钟有效沿之前必须保持稳定的最短时间。为什么要有这个要求?因为触发器内部需要时间把数据「锁存」住。

我曾经调试过一个UART通信问题,波特率设得不高,但就是偶尔丢字节。用逻辑分析仪抓了波形才发现,数据在时钟上升沿前只稳定了1ns,而芯片要求的建立时间是5ns。说白了,数据还没「站稳」就被采样了,结果可想而知。

避坑指南:

我曾经在I2C总线上加了一个长走线,结果建立时间不够了。后来加了一个RC延迟电路才解决。记住:走线越长,建立时间越紧张

1.4 保持时间

保持时间,是指数据在时钟有效沿之后必须保持稳定的最短时间。这个和建立时间是对称的——采样完成后,数据不能马上变,得让触发器内部完成锁存。

保持时间的问题往往更隐蔽。因为建立时间不够,你还能看到数据错误;但保持时间不够,可能只是偶尔出错,很难复现。我调试一个SPI Flash驱动时,读数据偶尔出错,查了整整两天,最后发现是FPGA输出的数据在时钟下降沿后只保持了0.5ns,而Flash要求至少1ns。

参数 含义 典型值(低速总线) 常见问题
建立时间 时钟沿前数据需稳定 5-20ns 走线过长、负载过重
保持时间 时钟沿后数据需稳定 0-10ns 时钟偏斜、信号反射

1.5 建立时间与保持时间的关系

这两个参数其实是一对矛盾。你想想看:

  • 建立时间要求数据提前到,所以希望路径延迟小
  • 保持时间要求数据别走太快,所以希望路径延迟大

这就麻烦了。你优化了建立时间,可能就破坏了保持时间。反过来也一样。

我个人的习惯是:先保证建立时间,再检查保持时间。因为建立时间出问题,数据直接错;保持时间出问题,往往还能靠工艺余量扛过去。当然,这只是经验之谈,严格的项目两个都得算。

时序检查的两个基本不等式:

建立时间检查:T_data_arrival + T_setup ≤ T_clock_arrival + T_period

保持时间检查:T_data_arrival ≥ T_clock_arrival + T_hold

1.6 实际测量中的注意事项

纸上谈兵容易,真到示波器上测时序,你会发现一堆坑:

  1. 探头电容会影响信号——普通探头10pF的电容,对高速信号就是个大负载
  2. 地线要短——地线太长会引入噪声,我见过有人用10cm的地线夹,测出来的波形全是毛刺
  3. 触发要设对——测建立时间要用数据触发,测保持时间要用时钟触发

我的测量流程:

1. 先用示波器的光标测量时钟周期,确认频率准确

2. 放大到能看到上升沿,测量上升时间

3. 同时显示时钟和数据,测量建立时间和保持时间

4. 多测几个周期,取最差情况

好了,这就是时序的五个基础概念。你可能会觉得简单,但说实话,我见过太多工程师在这些基础概念上翻车。下次我们聊I2C总线的具体时序测量,到时候这些概念都会用上。

记住一句话:时序不是算出来的,是测出来的。仿真再完美,不上示波器看波形,你永远不知道实际板子上发生了什么。