给电路一个共同节拍
复习
- ALU 状态标志:ALU 用零、负数、进位和溢出标志记录结果特征
- 运算器总装:把运算部件组装成一个能算加减乘除的运算器
- 让电路记住一个比特:用交叉耦合的反馈做出能保存一个比特的锁存器
TL;DR
- 时钟是一根周期性地在 0 和 1 之间变化的信号线
- 全机用共同边沿约定何时交接数据
- 时序图把多根信号的变化画在同一条时间轴上
- 数据必须在采样边沿附近保持稳定
正文
想象几十个人一起搬箱子。有人还没把箱子放稳,或者刚放稳,但还没有用胶带封口或者贴面单,下一个人就已经伸手拿走了。
电路也一样。运算需要传播时间,存储需要明确的写入时刻。要是“什么时候算”“什么时候存”都自己决定,也不和别人协商,数据就会完全乱套(毕竟如果我还没算完就拿走了,结果不对也不能怪我)。
所以,我们打算给整台机器约定一个共同的节奏,就像军训时候的口令那样:滴答,准备;滴答,交接。
这个节奏就是 时钟(clock)。
一根反复跳变的线
┌───┐ ┌───┐ ┌───┐
CLK ──┘ └───┘ └───┘ └──
↑ ↑ ↑
上升沿 上升沿 上升沿
从 0 跳到 1 的瞬间叫 上升沿,从 1 跳到 0 叫 下降沿。接下来,我们要造一种只在上升沿收下新数据的存储部件,让它们按同一个时刻交接数据。上一章的锁存器还做不到这一点;这正是我们引入时钟后要解决的问题。
一高一低走完一轮,叫一个 时钟周期;每秒完成多少个周期,叫作 频率,单位是赫兹(Hz)。
频率可不能无限提高。组合逻辑需要时间让结果传播并稳定下来;下一次边沿来得太早,存储部件就可能收下一个还没算完的值。
所以,时钟周期必须长到足以让数据走完最慢的那条计算路径,并在下一次采样前稳定下来。 频率越高,周期越短,但不能快到让下一次交接赶在计算完成之前。
思考题 1
如果一段组合逻辑要 8 ns 才能稳定,时钟周期却只有 5 ns,会有什么风险?
把先后画出来
把信号变成二维波形,让横轴表示时间,纵轴每一行画一根信号,可以得到一张新的图:时序图(timing diagram)。
CLK ┌───────┐ ┌───────┐ ┌───────┐
────────┘ └───────┘ └───────┘ └
D ──────────────────┐ ┌──────────────
└───────────────┘
Q ──────────────────────────┐ ┌──────
└───────────────┘
↑ ↑ ↑
每根信号的高线表示 1,低线表示 0,竖直变化表示信号发生跳变。多行波形共用一条时间轴,所以能直接比较变化的先后。图中 D 在两次采样之间改变,Q 则等到下一次上升沿过后才跟着改变。
读图先找边沿
假设存储部件只在上升沿读取 D。读图时,依次检查每个上升沿:
- 找到上升沿
- 看 D 在边沿前后是否稳定,以及它的值是多少
- Q 经过一小段传播时间后更新为这个值,并保持到下一次采样
D 在两个边沿之间即使变化多次,也不会立刻改写 Q。
用上面的图做例子:第 1 次上升沿到来时,D 稳定为 1,Q 原本也是 1,所以看起来没有变化。随后 D 在两个边沿之间变成 0,Q 仍保持 1。第 2 次上升沿到来时,D 已经稳定为 0,Q 过一小段时间才变成 0。再往后,D 在两沿之间变回 1,直到第 3 次上升沿过后,Q 才变回 1。
这里有一个边界:D 不能恰好在采样边沿附近跳变。它需要在边沿 之前 稳定一小段时间,这叫 建立时间;在边沿 之后 继续稳定一小段时间,这叫 保持时间。如果 D 在这段窗口里变化,存储部件就不一定能可靠地判定该收下 0 还是 1,Q 也不能保证按图中的方式更新。
Q 记住的是采样边沿附近保持稳定的 D,而不是边沿到来时碰巧正在变化的 D。 因此,前面的波形特意把 D 的两次跳变放在相邻上升沿之间,并给采样边沿留出距离。
思考题 2
为什么 D 可以在两个采样边沿之间改变,却不能恰好在采样边沿附近改变?
时钟和读图方法都有了。下一章,我们把“一段时间内开门”的锁存器,正式改成“只在边沿拍照”的触发器。
思考题 3
为什么存储部件选“边沿”来更新,而不是盯着高电平或低电平的整段时间?这样能避开什么麻烦?
小结
知识点
- 时钟周期、频率、上升沿与下降沿
- 时钟让全机按共同节拍交接数据
- 时序图用共同时间轴展示多根信号
- 数据必须在采样边沿附近保持稳定
参考资料
- Wikipedia(zh):时钟信号:同步电路使用的周期信号
- Wikipedia(zh):时序图:用时间轴描述信号变化
思考题答案(仅供参考)
思考题 1
下一次采样发生时,结果可能仍在传播和变化,存储部件会收下一个错误或不稳定的值。所以时钟周期必须给最慢的那条数据通路留出足够时间,频率也因此不能无限提高。
思考题 2
两个边沿之间,存储部件没有接收新数据,D 改变也不会立刻改写 Q。但到了采样边沿,存储部件必须辨认 D 的值;如果 D 正好在这附近跳变,就可能分不清该收下哪个值。时钟给出了统一的交接时刻,还要让计算路径足够快,使 D 在这个时刻前后保持稳定。
思考题 3
如果在一整段高电平或低电平期间都允许写入,D 在这段时间里的变化也可能一路传到 Q,后面的电路就难以判断何时才能放心读取。改为只在约定的边沿接收数据,交接时刻便清楚了;但 D 仍须满足边沿前后的建立时间和保持时间,不能把边沿误当成允许输入同时跳变的“魔法瞬间”。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪