# 4.2. 时钟：计算机中的时间模型

到目前为止，不管我们是讨论组合电路还是时序电路，都没有考虑时间的因素，我们认为输入信号改变之后，输出信号的变化是完全实时的。而在现实中，所有的事情都会有延迟，一来电路组件的多个输入信号不可能达到“理论上”的同时输入，总会存在一个时间差，而且一个电路组件的输入信号通常是其它组件的输出信号，这会导致输入信号到达的时间差更加不可控；二来电路组件在进行“计算”时总是需要花费时间，“计算”的本质就是电子信号从电路的输入引脚传达到输出引脚的过程，所以电路越复杂，所需要的时间也就越多。所以对于任意的电路组件，当提供了输入信号之后总是要“等一会儿”，然后输出引脚上的信号才会变成正确的结果，这个等待的过程叫着同步。

如何确定同步时长，是芯片设计的重要考虑因素！

芯片就是一块集成了数以亿万个基础逻辑门的复杂电路，这些基础逻辑门像搭积木一样构成了最终的产品，此处我们将其看着一个黑盒，当提供不同组合的输入时，电子信号通过不同的路径最终形成输出结果，这里的输出结果可能是输出引脚上的信号，也可能是对内部状态的某种修改，不同路径代表着不同的计算，我们将这个过程看着是芯片执行了一条指令。不同指令的用时是不一样的，为了保证每条指令都正常执行，我们需要使用**耗时最长的指令所需要的时间**作为整个芯片的同步时长。

假设芯片的同步时长为 t, 也就是说系统在运行过程中，需要一种触发机制，在 0, t, 2t, 3t, … 等时刻触发芯片执行下一条指令。这种时刻的划分方式被称为时钟，而同步时长 t 被称为时钟周期。可见时钟周期的频率就是系统执行指令的频率，因此在设计时钟周期时，一方面要让其足够长，能够无差错地同步系统；另一方面也需要其尽量短，以便提升系统的运行速度。当前的主流 PC 处理器的时钟频率已经达到了数 GHz 级别，也就是说每秒钟 CPU 能够执行几十亿条指令。

&#x20;模拟时钟信号的电子元件叫着振荡器（Oscillator），振荡器周期性地在 0, 1 这两种状态之间变换，完整的一次变换就等价于一个时钟周期。下图的脉冲信号是时钟周期的一个可视化效果：

![Clock](https://4257267501-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdQXCtxb9g6w1DURwQ9%2F-MdWKlKNQdKW9dQ6SVSt%2F-MdWMhK-kFm4omPBsQ_Z%2Fclock.png?alt=media\&token=22e77a99-73a8-4f93-822a-ccbb791ac147)

可见现实世界中连续的时间，在计算机系统中被划分成了一个个等长的单位，变成了一个离散的概念。在这种时间模型下，整个系统的状态都是与时钟周期挂钩的，对系统状态的任何改变都要在下一个时钟周期才完全生效，而在同一个时钟周期内，系统的状态变化被看着是一个不可分割的原子行为。

在计算机系统中，统一的时钟信号会接入到所有的芯片中，以确保整个系统在相同的节奏下工作。

> 我们此处默认了一个情况，即我们的设计采用的是[同步电路](https://en.wikipedia.org/wiki/Synchronous_circuit)而不是基于事件的[异步电路](https://en.wikipedia.org/wiki/Asynchronous_circuit)。
>
> 在将多个电路组件组合起来时，同步电路需要等待自己上游电路的输出结果，因此需要通过时钟来进行同步；而异步电路是基于事件通知的，不需要时钟。同步电路设计起来更简单，异步电路更加复杂，因此现在的芯片设计都是基于同步电路进行的。
