我最近开始阅读 Charles Petzold 的名为 Code 的书,到目前为止,这本书涵盖了我认为你会好奇的那些事情。但是在购买/借阅之前,我还没有完全通读这本书。
这是我相对简短的回答,而不是 Petzolds ......希望与您的好奇心一致。
你听说过我假设的晶体管。最初使用晶体管的方法是用于晶体管收音机之类的东西。它基本上是一个放大器,将漂浮在空气中的微小无线电信号馈入晶体管的输入端,该晶体管打开或关闭旁边电路上的电流。然后你用更高的功率连接那个电路,这样你就可以接收一个非常小的信号,放大它并将其馈入扬声器,例如收听广播电台(还有更多的事情是隔离频率并保持晶体管平衡,但是你明白我希望的想法)。
现在晶体管的存在导致了一种使用晶体管作为开关的方法,就像电灯开关一样。收音机就像一个调光开关,你可以把它调到任何地方,从一直开到一直关。非调光灯开关要么全部打开,要么全部关闭,开关中间有一个神奇的地方,它可以转换。我们在数字电子产品中使用晶体管的方式相同。取一个晶体管的输出并将其馈入另一个晶体管输入。第一个晶体管的输出肯定不是无线电波那样的小信号,它迫使第二个晶体管一直打开或关闭。这导致了TTL或晶体管晶体管逻辑的概念。基本上,您有一个晶体管驱动高压,或者称其为 1,然后在其上吸收零电压,我们称其为 0。并且您将输入与其他电子设备一起安排,以便您可以创建与门(如果两个输入均为 1,则输出为 1),或门(如果一个或另一个输入为 1,则输出为 1) . 反相器、与非门、门、或非门(一个或带有反相器)等。曾经有一本 TTL 手册,你可以购买 8 个左右的引脚芯片,这些芯片有一个或两个或四个某种门(NAND、NOR、 AND等)内部功能,两个输入和一个输出。现在我们不需要那些用数百万晶体管创建可编程逻辑或专用芯片更便宜的东西。但是我们仍然在硬件设计中考虑 AND、OR 和 NOT 门。(通常更像是 nand 和 nor)。或门(如果一个或另一个输入为 1,则输出为 1)。反相器、与非门、门、或非门(一个或带有反相器)等。曾经有一本 TTL 手册,你可以购买 8 个左右的引脚芯片,这些芯片有一个或两个或四个某种门(NAND、NOR、 AND等)内部功能,两个输入和一个输出。现在我们不需要那些用数百万晶体管创建可编程逻辑或专用芯片更便宜的东西。但是我们仍然在硬件设计中考虑 AND、OR 和 NOT 门。(通常更像是 nand 和 nor)。或门(如果一个或另一个输入为 1,则输出为 1)。反相器、与非门、门、或非门(一个或带有反相器)等。曾经有一本 TTL 手册,你可以购买 8 个左右的引脚芯片,这些芯片有一个或两个或四个某种门(NAND、NOR、 AND等)内部功能,两个输入和一个输出。现在我们不需要那些用数百万晶体管创建可编程逻辑或专用芯片更便宜的东西。但是我们仍然在硬件设计中考虑 AND、OR 和 NOT 门。(通常更像是 nand 和 nor)。现在我们不需要那些用数百万晶体管创建可编程逻辑或专用芯片更便宜的东西。但是我们仍然在硬件设计中考虑 AND、OR 和 NOT 门。(通常更像是 nand 和 nor)。现在我们不需要那些用数百万晶体管创建可编程逻辑或专用芯片更便宜的东西。但是我们仍然在硬件设计中考虑 AND、OR 和 NOT 门。(通常更像是 nand 和 nor)。
我不知道他们现在教什么,但概念是一样的,对于内存来说,触发器可以被认为是两个这样的 TTL 对(NANDS),一个的输出连接到另一个的输入。就这样吧。这基本上是我们所说的 SRAM 或静态 ram 中的一个位。sram 基本上需要 4 个晶体管。Dram 或动态 ram 您自己放入计算机的记忆棒每比特需要一个晶体管,因此对于初学者,您可以了解为什么 DRAM 是您购买千兆字节的东西。只要电源不熄灭,Sram 位就会记住您将它们设置为什么。当你告诉它时,Dram 开始忘记你告诉它的内容,基本上 dram 以第三种不同的方式使用晶体管,有一些电容(如电容器,不会在这里进入),就像一个微型可充电电池,一旦你给它充电并拔下充电器,它就会开始耗尽。想一想架子上的一排玻璃杯,每个玻璃杯上都有小孔,这些都是你的酒杯,你想要其中一些是杯子,所以你有一个助手来装满你想成为的杯子。那个助手必须不断地把水罐装满,然后往下走,让“一”位的杯子装满水,让“零”位的杯子保持空着。因此,任何时候您想查看您的数据是什么,您都可以通过查找绝对高于中间的水位为 1 和绝对低于中间的水位为零来查看并读取 1 和 0。所以即使通电时,如果助手不能让眼镜保持足够满以区分 1 和 0,它们最终会看起来像 0 并耗尽。这是每个芯片更多位的权衡。简短的故事是,在处理器之外,我们使用 dram 作为大容量内存,并且有辅助逻辑负责将 1 保持为 1,将 0 保持为 0。但是在芯片内部,例如 AX 寄存器和 DS 寄存器使用触发器或 sram 来保存您的数据。对于您所知道的每一位,例如 AX 寄存器中的位,可能有成百上千或更多用于将这些位进出该 AX 寄存器。并且有一个辅助逻辑负责将 1 保持为 1,将 0 保持为 0。但是在芯片内部,例如 AX 寄存器和 DS 寄存器使用触发器或 sram 来保存您的数据。对于您所知道的每一位,例如 AX 寄存器中的位,可能有成百上千或更多用于将这些位进出该 AX 寄存器。并且有一个辅助逻辑负责将 1 保持为 1,将 0 保持为 0。但是在芯片内部,例如 AX 寄存器和 DS 寄存器使用触发器或 sram 来保存您的数据。对于您所知道的每一位,例如 AX 寄存器中的位,可能有成百上千或更多用于将这些位进出该 AX 寄存器。
您知道处理器以某种时钟速度运行,如今大约为每秒 2 GHz 或 20 亿时钟。想想时钟,它是由晶体产生的,另一个话题,但逻辑认为该时钟是一个电压,在这个时钟频率 2ghz 或其他任何情况下会变高、变高和变为零(gameboy 前进是 17mhz,旧 ipod 大约是 75mhz,原装 ibm pc 4.77mhz)。
因此,用作开关的晶体管允许我们获取电压并将其转换为我们作为硬件工程师和软件工程师都熟悉的 1 和 0,甚至可以为我们提供 AND、OR 和 NOT 逻辑功能。我们有这些魔法水晶,可以让我们获得准确的电压振荡。
所以我们现在可以做一些事情,比如说,如果时钟是一个,并且我的状态变量说我处于获取指令状态,那么我需要切换一些门,以便我想要的指令的地址,它在程序计数器,在内存总线上熄灭,以便内存逻辑可以给我关于 MOV AL,61h 的指令。您可以在 x86 手册中查找此内容,并发现其中一些操作码位表示这是一个 mov 操作,目标是 EAX 寄存器的低 8 位,而 mov 的源是立即值,这意味着它在这条指令之后的内存位置。所以我们需要将该指令/操作码保存在某处,并在下一个时钟周期获取下一个内存位置。所以现在我们保存了mov al,
你问这一切是怎么发生的?想想一个 python 函数执行一些数学公式。您从程序的顶部开始,将一些作为变量输入的公式输入到程序的各个步骤中,这些步骤可能会在此处添加一个常量或从库中调用平方根函数等。在底部您返回答案。硬件逻辑以相同的方式完成,今天使用的编程语言看起来很像 C。主要区别在于您的硬件功能可能有数百或数千个输入,而输出是一位。在每个时钟周期,AL 寄存器的第 0 位都在使用一个庞大的算法进行计算,具体取决于您想要查看的距离。想想你为数学运算调用的平方根函数,该函数本身就是其中之一,一些输入会产生输出,它可能会调用其他函数,可能是乘法或除法。因此,您可能在某个地方可以将其视为 AL 寄存器的第 0 位之前的最后一步,其功能是:如果时钟为 1,则 AL[0] = AL_next[0]; 否则 AL[0] = AL[0]; 但是有一个更高的函数包含从其他输入计算的下一个 al 位,一个更高的函数和一个更高的函数,其中大部分是由编译器创建的,就像你的三行 python 可以变成数百或数千的汇编程序行。几行 HDL 可以变成成百上千甚至更多的晶体管。硬件人员通常不会查看特定位的最低级别公式来找出所有可能的输入以及计算所需的所有可能的 AND 和 OR 和 NOT,而不是您可能检查程序生成的汇编程序。但如果你愿意,你可以。
关于微编码的说明,大多数处理器不使用微编码。例如,您使用 x86 进入它是因为它在当时是一个很好的指令集,但表面上很难跟上现代的步伐。其他指令集不需要微编码,直接按照我上面描述的方式使用逻辑。您可以将微编码视为使用不同指令集/汇编语言的不同处理器,它模拟您在表面上看到的指令集。不像你在mac上模拟windows或在windows上模拟linux等复杂。微编码层是专门为这项工作设计的,你可能会认为只有四个寄存器AX、BX、CX、DX,但那里里面还有很多。自然地,一个汇编程序可以在一个或多个内核的多个执行路径上执行。就像闹钟或洗衣机中的处理器一样,微码程序简单而小巧,可以调试并烧录到硬件中,希望永远不需要固件更新。至少理想情况下。但就像您的 ipod 或手机一样,您有时确实需要修复错误或其他任何东西,并且有一种方法可以升级您的处理器(BIOS 或其他软件在启动时加载补丁)。假设您打开电视遥控器或计算器的电池盒,您可能会看到一个孔,您可以在其中看到一些裸露的金属触点,可能是三个或五个或更多。对于某些遥控器和计算器,如果您真的想要,您可以重新编程,更新固件。不过一般不会,理想情况下,遥控器完美或完美到足以比电视机寿命长。微编码提供了在市场上获得非常复杂的产品(数百万、数亿晶体管)并修复该领域中可修复的大错误的能力。想象一下,你的团队在 18 个月内编写了一个 2 亿行的 Python 程序,并且必须交付它,否则公司将无法参加竞赛产品。类似的事情,除了你可以在现场更新的一小部分代码之外,其余部分必须保持不变。对于闹钟或烤面包机,如果有错误或需要帮助的东西,您只需将其扔掉并获取另一个。数以亿计的晶体管)在市场上,并在未来修复该领域中的大且可修复的错误。想象一下,你的团队在 18 个月内编写了一个 2 亿行的 Python 程序,并且必须交付它,否则公司将无法参加竞赛产品。类似的事情,除了你可以在现场更新的一小部分代码之外,其余部分必须保持不变。对于闹钟或烤面包机,如果有错误或需要帮助的东西,您只需将其扔掉并获取另一个。数以亿计的晶体管)在市场上,并在未来修复该领域中的大且可修复的错误。想象一下,你的团队在 18 个月内编写了一个 2 亿行的 Python 程序,并且必须交付它,否则公司将无法参加竞赛产品。类似的事情,除了你可以在现场更新的一小部分代码之外,其余部分必须保持不变。对于闹钟或烤面包机,如果有错误或需要帮助的东西,您只需将其扔掉并获取另一个。
如果您浏览 wikipedia 或只是 google 资料,您可以查看指令集和机器语言,例如 6502、z80、8080 和其他处理器。可能有 8 个寄存器和 250 条指令,您可以从晶体管的数量中感受到,与每个时钟计算触发器中每个位所需的逻辑门序列相比,这 250 条汇编指令仍然是一种非常高级的语言循环。你的假设是正确的。除了微编码处理器,这种低级逻辑不能以任何方式重新编程,您必须使用软件修复硬件错误(对于即将交付或将交付但未报废的硬件)。
看看 Petzold 的那本书,他在解释东西方面做得非常出色,远胜于我所能写的任何东西。