当未使用 RAM 和存储时,CPU 中的晶体管是否刚刚处于上次工作时的状态?
0 1177
1
该提问暂无详细描述
收藏
2021-01-23 19:00 更新 我爱喝牛奶G •  2074
共 1 个回答
高赞 时间
0

晶体管本身不保持状态。

为了这个答案,我将重点介绍MOS晶体管,因为它们与现代数字逻辑最相关。我还将尽力使描述保持抽象,以免使细节过于混乱。


MOS晶体管基础

MOS晶体管在此具有三个感兴趣的端子,而第四个则没有那么有趣:

  • 门。栅极根据其相对于源极的电压来控制晶体管是否允许电流在源极和漏极之间流动。
  • 源极和漏极。当栅极电压允许在它们之间形成通道时,这是电流可以在其间流动的两个端子。如上所述,它们不是对称。
  • 基极。这是晶体管周围的大部分,与晶体管的通道绝缘。这通常与源相关。

Wikipedia的图对此进行了说明。

main-qimg-f9cad0765cfa6ff2cac0442ae5977283

栅极和晶体管其余部分之间的粉红色层是绝缘体。


晶体管作为(大多数)无记忆开关

首先,你可以将MOS晶体管视为压控开关。栅极和源极之间是否存在电压差控制着开关是断开还是闭合。

晶体管不像机械开关。例如,当我扔一个电灯开关时,它会保持在我放置的最后位置(除非它出现故障)。它主动存储1位状态。main-qimg-1edebf96ca2ee897dc176f774b2f329c

另一方面,晶体管不能完全那样工作。

首先,晶体管是一个不完善的开关。当开关“闭合”时,电流导通,但是它流经的通道的电阻为非零。当开关“断开”时,通过通道的电阻很高,但不像理想开关那样是无限的。后一种特性将导致泄漏:少量电流流经断开的开关。

MOS晶体管的栅极以及通向它的导线的作用就像一个小电容器。电容器可以存储电荷,因此MOS晶体管的栅极似乎是存储数据的候选对象。

如果你有理想的电容器和理想的开关,则可以在电容器上存储一点,如下所示:

  • 合上开关,将电容器连接到外部电压源。
  • 将电容器充电至特定电压。
  • 打开开关,将电容器与电路的其余部分隔离。

理想电容器将无限期保留静电荷(并因此保留电压),并有效地存储1位信息。

如果该理想电容器是理想晶体管的栅极,那么你存储的电荷电压将打开或关闭该晶体管的开关。这就像移动电灯开关上的手柄一样。通过尝试在源极和漏极之间运行电流,我可以看到晶体管的开关是断开还是闭合。这使我能够在不干扰门上保持的电荷的情况下查看是否已设置该位,就像我可以看到在不物理触摸电灯开关本身的情况下是否照亮了房间一样。

但是,真正的晶体管并非如此。栅极与晶体管的其余部分绝缘,但是绝缘并不是理想的。通往栅极的导线周围的硅块也不是理想的绝缘体。并且,将信号馈送到门本身的电路将泄漏。你无法完全隔离门。

因此,你可以如上所述在门上沉积(或除去)电荷,并且该电荷将在此处停留一会儿。但是,随着时间的流逝,沉积在晶体管栅极上的任何静电荷都会流失。

顺便说一下,这也是为什么需要刷新动态RAM的原因,因为它使用了密切相关的技术。


反馈:静态存储的关键

设计中的任何静态存储元素都包含反馈,以确保保留存储值。最简单的静态存储元件是一对交叉耦合的逆变器:

main-qimg-fc53561bc2c111eef06a5422f51f9247

D锁存器由交叉耦合的逆变器制成。

在上图中,X是一个“弱”的逆变器,这意味着它具有足够的驱动强度来提供反馈来保持一个值,但又不是那么多,因此你无法通过闭合标为的晶体管的开关来用新值覆盖它。 C以上。

只要该电路保持通电状态,它将保持最后存入其上的值。

那么,这对通电的CPU中的晶体管意味着什么呢?

某些晶体管用于设计中的存储元件,例如锁存器和寄存器。两者之间的区别是一阶的:锁存器不与时钟相关,而寄存器与时钟相关。你可以从一对锁存器构建一个寄存器。


寄存器:重载周期

我刚刚给的寄存器的描述可能和你的想法不一样。

你在CPU指令集指南中看到的命名寄存器是体系结构寄存器,它们是CPU程序员模型的一部分。在x86 CPU,他们去了名字,如BPEAXRSIZMM2等等,这取决于你查看的CPU。

模型很重要。程序员的模型提供了一定程度的抽象。CPU提供一个视图,其中包含命名的寄存器,这些寄存器在特定的情况下似乎在特定时间(或至少以特定顺序)更新。

底层的实现可以构建其喜欢的架构视图。例如,你可以像8008一样从DRAM中构建CPU体系结构寄存器文件。

出于本文的目的,我将专注于我之前给出的下层定义,而不是CPU的体系结构寄存器。


静态与动态存储

锁存器和寄存器提供静态存储。他们保持当前状态,直到有理由改变或失去权力为止。这些构成了设计顺序逻辑电路的核心。仅当其控制信号告诉它们时,它们才会更改状态。

动态存储元素略有不同。电路可以将值临时存储在总线和晶体管栅极的电容中。如上所述,这些电荷最终会消失。但是,它们可以停留足够长的时间才能有用。

我已经提到了8008的基于DRAM的体系结构寄存器文件。这是一个明显的例子。但是,这也是一种异常。更常见的是,处理器设计严重依赖于动态逻辑电路,动态逻辑直接建立在动态存储上。

一种经典的通用方法将计算分为两个阶段:预充电和评估。顾名思义,该电路通过在输出线及其连接的栅极上沉积电荷来工作。在评估阶段,其中一些消耗被“评估”为0,即耗尽。

这不是在电路中采用动态存储的唯一方法。

举一个简单的例子,考虑一下上面包含的D锁存器。如果卸下标有X的逆变器,则现在有了一个动态锁存器。只要存储的电荷不降低,它将保持该值。

main-qimg-0b494b58c8392399475369415a67d16d

举一个更复杂的例子:我最近对波纹计数器进行了逆向工程,发现它使用两个小型存储节点来实现边沿触发的T型触发器。

main-qimg-8a04386d66b5560edcebf599ed2d5fc1

(来源:这是我自己的工作,是对AY-3–8914的照片进行反向工程的结果。)

标记为“动态锁存器”的晶体管T21和T22的栅极存储输出位的先前值足够长的时间,以实现边沿触发的触发。晶体管T23和T26在较简单的电路中起着标有“ C”的晶体管的作用。

芯片I从这些级联的级联12或16中提取了此电路,以形成12位和16位纹波计数器。


最低时钟速度

动态逻辑是许多设计能够以最低时钟速度运行的原因。如前所述,动态逻辑所依赖的电荷会流失,因此必须在电荷降级过多之前迅速“使用”它们。

低于最小时钟速度的下一步已关闭。你可以关闭动态逻辑块的电源。要在以后使用它,你需要重新上电,并且可能要经过短暂的重置阶段才能使逻辑进入一致状态。现代CPU定期执行此操作,以节省一些较大的饥饿电路的功率。(例如:现代x86中的向量单位。)

一些处理器,特别是针对低功耗应用的处理器,使用完全静态的设计风格。它们可以一直走到死路,仍然可以可靠地运行。每个存储元素都是静态存储元素。你可以仅通过停止时钟来节省这些模块的功率。

你还可以使用一些动态元素来构建一个基本静态的设计。这些将需要将动态元素限制在设计的特定区域。例如,如果允许在阶段1开始时停止两阶段时钟,则可以避免仅在阶段2中使用动态元素。

而且,当然,无论设计是静态的还是动态的,在断开电源时,随着电容放电,所有逻辑都会失去其状态。


剩余的晶体管

其余晶体管参与逻辑功能。它们基于逻辑输入进行切换,并且不直接存储值。

连接到静态存储元件的静态逻辑门本身将具有静态输出值,直到它们的输入改变为止。

动态逻辑门取决于所施加的任何电荷的状态,这些电荷(如果最近未刷新)退化的程度以及时钟的当前状态。

静态输入为你提供静态输出。更改输入或包含消耗电荷的输入可能会更改输出。


设计风格:速度与功率

CMOS器件以两种不同的方式消耗功率:泄漏和开关。如前所述,晶体管形成不完善的开关,这些开关会泄漏。这种泄漏可能很严重,但对于我回答的这一部分并没有真正发挥作用。

另一个组件就是开关电源。动态功率。每次将值从1切换为0时,都会向地面发送许多电荷。同样,在门开关切换时,会有很短的时间,其中涉及的开关部分打开/部分关闭,并且你拥有从电源到地面的直流电。

因此,设计的动态功率与晶体管切换的频率有关,也称为设计的活动因子。每个时钟有多少百分比的信号会改变值?

针对低功率应用的设计通常会在总线和其他高电容信号线上尽可能保持静态值。例如,通常在L1和L2缓存之间有一组大型总线。当设计不主动在这些总线上移动数据时,总线可以保留通过它发送的最后一个值。

有时,这很容易做到。但是,在其他情况下,使总线保持静态的其他逻辑项将为设计的关键路径添加逻辑。设计越注重速度,你将拥有更多潜在的关键路径。因此,以性能为导向的设计可能不像专注于低功耗的设计那样保持静态的信号那么多。

不仅如此:面向性能的设计还可以推测性地执行更多操作。高速缓存控制器可能会在我们不知道是否存在高速缓存命中之前抢先读取其数据RAM。对于集合关联缓存,它可能会并行读取集合的所有方式,然后才知道缓存中的哪种方式实际保存了数据。更具侵略性的设计可能在甚至不知道是否存在有效的加载指令或地址有效之前就开始读取内存。

与仅读取必要内容的保守方法相比,所有这些操作都可切换更多电路。在保守的设计中,所有这些总线和存储器输出将保持先前的值,直到需要执行所需的访问为止。


架构观

就像我上面说的,我想专注于实际的硬件设计,而不是架构视图。但是,让我们简要介绍一下架构视图。

一般来说,体系结构的CPU寄存器文件的工作方式与其他存储器类似:每个元素都保存着存放在此的最后一个值。如果我将42写入寄存器EDI ,则值42停留在该位置(至少从程序员的角度来看),直到我在此处写入其他内容为止。或者,对于某些CPU寄存器(标志,指令指针)而言,CPU在其中写入其他内容。

但是当你打开它时里面有什么?内容可能是任意/随机的,至少对于通用寄存器而言。大多数控制寄存器采用定义明确的复位值,以便CPU在复位后便以特定方式运行。早期复位代码通常会在处理器启动过程中清除其余CPU寄存器的内容,以使CPU保持一致,干净的状态。

一些CPU在体系结构上定义了用于启用和禁用CPU硬件的重要部分的软件机制。这些硬件块可以包括架构寄存器。例如,某些ARM CPU将浮点和向量单元及其寄存器文件放置在结构上独立的电源域中。你可以通过指令序列关闭该设备的电源。重新打开电源后,如果内存可用正确,则其寄存器文件的状态未知。软件必须将其初始化为已知状态。


转载自:**Joe Zbiciak**,(软件工程师和片上系统(SoC)架构师)

收藏
2021-01-23 18:59 更新 蝈蝈 •  224