时钟如何将手动逻辑转化为自动计算?
Source: Dev.to
我们如何进行加法
要了解计算机的工作原理,首先让我们看看如何对一组数字进行相加,例如 [24, 34, 77]。
- 将前两个数字相加:
24 + 34 = 58. - 将中间结果(58)存储在内存中或写下来。
- 将最后一个数字加到中间结果上:
58 + 77 = 135.
在此过程中,我们使用大脑作为“内存”来保存数字 58。
设计一个简单电路
电路组件
- 8‑bit 开关 – 我们为什么需要它?
- 加法器 – 执行加法。
- 锁存器(内存) – 保存中间结果。
使用电路的加法序列
| 步骤 | 锁存器(内存) | 输入 | 加法器计算 | 操作 |
|---|---|---|---|---|
| 开始 | 0 | 24 | 0 + 24 = 24 | 通过按下开关(闭合电路)将 24 存入锁存器。 |
| 下一步 | 24 | 34 | 24 + 34 = 58 | 将 58 存入锁存器。 |
| 下一步 | 58 | 77 | 58 + 77 = 135 | 将 135 存入锁存器。 |
理论上这看起来很完美,但实际电路并不会这样工作。
问题:反馈回路错误
电流传播极快。当你按下手动开关时,只要手指保持在按钮上,门就会保持打开状态。即使是一次极短的按压(例如 0.1 秒),CPU 也会将其视为持续数千纳秒的“高”信号。
由于闩锁输出被反馈到加法器,形成了 反馈回路:
| 时间 | 情况 | 结果 |
|---|---|---|
| 0 s | 按下按钮。 | 0 (memory) + 24 (input) = 24. |
| 0.1 s(仍在按压) | 锁存器检测到高电平信号,再次加上相同的 24。 | 24 + 24 = 48. |
| 0.2 s | 重复。 | 48 + 24 = 72. |
| … | … | … |
在你甚至来不及抬起手指之前,电路已经把同一个数字 加了数百次,产生了一个巨大的、错误的数值。这就是 反馈回路错误。
根本原因: 电路保持“打开”状态的时间过长。我们需要它在每次点击时 仅打开一次,不受按钮按住时长的影响。
理解按钮按压(情景)
| 按键次数 | 按住时间 | 释放时间 |
|---|---|---|
| 1 | 1 s | 2 s |
| 2 | 3 s | 1 s |
| 3 | 0.5 s | — |
如果绘制波形,如下所示:
- 高电平(上)——按钮被按下。
- 低电平(下)——按钮未被按下。
信号的四个阶段
- 上升沿 – 按钮被按下的瞬间 (0 → 1)。
- 高电平 – 按钮保持按下的持续时间。
- 下降沿 – 按钮被释放的瞬间 (1 → 0)。
- 低电平 – 按钮未被按下的持续时间。
上升沿和下降沿在每次按压中只出现一次,无论按钮保持多长时间。如果我们让电路仅对上升沿作出响应,就能实现每次点击恰好一次的加法。
锁存器 vs. 触发器
| Feature | Latch (Level‑Triggered) | Flip‑Flop (Edge‑Triggered) |
|---|---|---|
| Activation | 在整个高电平期间保持激活 | 仅在上升沿触发 |
| Control | 难以控制(持续) | 精确的单脉冲操作 |
解决方案: 将锁存器替换为 Flip‑Flop,并使用按钮的 CLK(时钟) 引脚驱动它。
解决方案:边缘触发
重新设计电路
- 用 Flip‑Flop 替换 latch。
- 将加法器的输出 直接连接到 Flip‑Flop 的数据输入。
- 将按钮 连接到 Flip‑Flop 的 CLK 引脚。
操作顺序
| 步骤 | Flip‑Flop 状态 | 输入 | 加法器计算 | 操作 |
|---|---|---|---|---|
| Start | 0 | 24 | 0 + 24 = 24 | 在上升沿,Flip‑Flop 捕获 24 并忽略按压的其余部分。 |
| Next | 24 | 34 | 24 + 34 = 58 | 在下一个上升沿捕获 58。 |
| Next | 58 | 77 | 58 + 77 = 135 | 在下一个上升沿捕获 135。 |
一些 CPU 电路(例如计数器)是由 flip‑flop 构成的。
使用时钟信号实现自动化
时钟周期概览
| 周期 | 阶段 | 描述 |
|---|---|---|
| 1 | 加法器阶段 | 上升沿 – 输入送入加法器。 高电平 – 加法器执行加法。 下降沿 – 加法器完成计算(传播延迟)。 低电平 – 电路等待,使结果稳定。 |
| 2 | 捕获阶段 | 上升沿 – 触发器锁存加法器的结果,系统进入下一个数字。 高/下降/低电平 – 为下一次加法做准备。 |
大脑:控制单元
在真实的 CPU 中,控制单元 像指挥家一样工作。它使用内部计数器来跟踪时钟周期,并精确指示计算机的每个部件 何时发送数据 和 何时保存数据。
为什么加法器不是边沿触发的
与锁存器或触发器不同,加法器 没有时钟引脚。它 不会等待 某个信号来开始加法;它始终是“打开”状态。只要任意输入发生变化,输出(和)就会立即开始变化。
延迟 —— 对于加法器唯一需要考虑的时序因素是它的 传播延迟(propagation delay),即在输入变化后新和变得稳定所需的时间。正是这种延迟导致我们需要使用独立的时钟阶段(加法器 → 捕获)来确保可靠的工作。
传播延迟与时钟速度
输出并非“瞬间”完成,是因为 传播延迟——电流在加法器内部所有晶体管之间传播所需的物理时间。
我们必须确保时钟速度不要太快,否则触发器可能会在加法器完成计算之前就尝试存储结果!
添加数字 [24, 34, 77]
计算机将工作划分为 cycles(周期)。每个周期都遵循时钟的“心跳”。
| Cycle | Phase | What Happens |
|---|---|---|
| 1 – The Work | Rising edge | flip‑flop 从 0 开始。系统将 0 和第一个输入 (24) 推入 adder。 |
| High / Falling / Low levels | adder 执行加法。系统在 Low level 期间等待,以确保传播延迟结束,结果 (24) 稳定。 | |
| 2 – The Save | Rising edge | flip‑flop 捕获来自 adder 的 24。control unit 随后选择下一个数字 (34) 进行下一步。 |
| High / Falling / Low levels | 什么也不做(数据仅被存储)。 | |
| 3 – The Work | Rising edge | flip‑flop(此时保持 24)和新输入 (34) 被送入 adder。 |
| High / Falling / Low levels | adder 完成加法运算。到 Low level 结束时,结果 58 已准备好。 | |
| 4 – The Save | Rising edge | flip‑flop 捕获 58。control unit 选择最后一个数字 (77)。 |
| 5 – The Final Work | Rising edge | flip‑flop 将 58 与输入 77 送入 adder。 |
| High / Falling / Low levels | adder 完成计算。 | |
| 6 – The Final Result | Rising edge | flip‑flop 捕获最终总和:135。 |
控制自动化
在这些周期结束时,加法器已经完全完成。这就是 受控自动化:每一步都有自己在时钟波形上的特定“时刻”,因此各操作永不冲突或相互干扰。
时钟的主要任务是 同步。
- 时钟频率必须根据系统中最慢的电路 来选择。在我们的例子中,加法器是最复杂的部分。
- 如果时钟设置得太快,flip‑flop 可能会在加法器完成工作之前就尝试捕获数据。
- 时钟的低电平 必须足够长,以覆盖加法器的 propagation delay,从而保证每一次捕获的结果都是 100 % 准确的。
受控自动化(代码仓库)
上述描述概述了代码仓库中使用的时序和同步策略。