3.4 计数器、时钟与时序
第 3.3 节介绍了在时钟边沿改变的存储部件。不断重复的边沿会形成一串离散时刻,系统可以在这些时刻前进。计数器能把这种前进过程直接显示出来。
时钟提供重复的定时事件
时钟在 0 和 1 之间交替变化。描述时钟时常用三个术语:
| 术语 | 含义 |
|---|---|
| 周期 | 完成一次完整循环所需的时间 |
| 频率 | 每秒完成的周期数,单位是赫兹 |
| 占空比 | 一个周期内保持高电平的时间比例 |
频率与周期互为倒数:
例如,1 MHz 时钟每秒完成一百万个周期,所以周期是 1 μs。时钟并不会让所有操作瞬间完成,电路仍然需要时间传播并稳定信号。
计数器按顺序推进状态
计数器(counter)是一种带有特定下一状态逻辑的寄存器。普通 3 位向上计数器会依次经过:
模数(modulus)是循环中不同状态的数量。普通 3 位二进制计数器是模 8,因为 。十进制计数器是模 10:它从 0 数到 9 后返回 0,即使四个存储位还能表示 10 到 15。
使能输入可以让计数器保持而不是前进。向下计数器则按相反方向经过状态序列。
计数器输出位可以分频
在二进制向上计数器中:
- Q0 每计数一次就改变;
- Q1 每计数两次才改变;
- Q2 每计数四次才改变。
因此越高位的翻转频率越低,每一位都是前一位的一半。计数器除了计数物体,也可以用于分频和产生定时事件。
实验 1——设计并追踪计数循环
选择模数、方向和使能,逐个发出脉冲,观察计数值与 Q3…Q0 怎样变化、暂停和回绕。
检查理解
存储器件要求数据在边沿附近稳定
触发器无法用无限快的速度采样变化中的输入。有效时钟边沿附近有两个约束,共同定义一段受保护的时间:
- 建立时间(setup time): 在边沿到来前,D 至少要提前稳定这么久;
- 保持时间(hold time): 边沿到来后,D 至少还要继续稳定这么久。
假设建立时间为 10 ns,保持时间为 5 ns。有效边沿发生在时间 0,那么 D 在 −10 ns 到 +5 ns 之间都不能改变。
在受保护区间内改变 D,就发生了时序违例(timing violation)。触发器可能进入亚稳态(metastability),也就是内部状态需要异常长的时间才能确定。正确的工程结论不是“它一定采到旧值”,也不是“它一定采到新值”,而是采样结果和恢复时间都无法保证。
实验 2——把数据变化放到采样边沿附近
拖动数据变化时刻,让它穿过建立区、时钟边沿和保持区。分别构造安全情况和两类违例,波形与诊断会同步更新。
检查理解
传播延迟限制时钟速度
源寄存器发出新值后,组合逻辑需要时间完成计算;下一边沿到来前,目标寄存器还需要满足建立时间。一个简化的安全周期条件是:
真实设计还要考虑时钟不确定性等裕量。这里最重要的是因果关系:缩短时钟周期不会让逻辑本身更快稳定。如果下一边沿来得太早,目标寄存器可能采到尚未完成的结果。
第 3 章总结
| 概念 | 为处理器提供什么 |
|---|---|
| 逻辑门与真值表 | 可穷举验证的小型布尔变换 |
| 译码器 | 一个被选中的目标 |
| 多路选择器 | 一个被选中的数据来源 |
| ALU | 被选择的算术或逻辑结果 |
| 锁存器与触发器 | 一位状态 |
| 寄存器 | 协同变化的多位状态 |
| 计数器与时钟 | 有顺序的状态推进 |
| 建立时间与保持时间 | 可靠采样所需的条件 |
第 4 章会用这些部件理解 8086 的整体组织:寄存器保存状态,ALU 变换状态,控制逻辑选择数据路径,总线接口单元获取指令和数据。