news 2026/5/26 9:32:51

晶体管到代码:计算机底层原理揭秘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
晶体管到代码:计算机底层原理揭秘

本文基于教程:https://www.youtube.com/playlist?list=PL9vTTBa7QaQOoMfpP3ztvgyQkPWDPfJez

如有疑惑,请移步观看课程视频。

一、晶体管与代码执行

单个晶体管通常有三个引脚:集电极(collector)、发射极(emitter)和基(base)这是构成基本门电路的基础元件。在计算基础架构的最底层就是由大量这样的晶体管构成的。本质上我们可以将它看作一个开关.当基级没有提供电信号的时候集电极和发射极无法导通。当且仅当基极通入电信号的时候集电极与发射极才能导通。下面是一种经典的运用示例图:

好了,在了解完晶体管(这里指三极管)的基本原理后我们来了解一下基础的逻辑门及其实现——他们分别是:与门,或门,或门,异或门。

首先是非门,非门的输出是与输入相反的电信号,如图:

然后就是与门,与门只有输入全为1的时候才会输出1,否则输出0,所以我们受此启发可以用串联电路来实现这一逻辑门(默认导通为1,阻塞为0)。如图:

接下来是或门,或门的准则是当输入器存在1(存在一项导通)的时候,输出为1,否则为0。根据这个性质,我们可以尝试用并联的电路来模拟或门的逻辑信号,如图:

最后我们来介绍异或门,他们是由前三个逻辑门组合制成的,不过在此之前我要展示这些门真正的逻辑符合:

下面是异或门的实现:

可以注意到,异或门只有当输入不同的时候才会输出1否则为0。这引起了我的一个有趣的思考,关于异或门,双输入其实本质上也是模拟了单输入的一根导线的二极管电路方式😂。

这是异或门的逻辑门符号

下面我们来介绍加法器😄,这是学习计算机组成结构中不得不品鉴的一环——半加器与全家器。

首先是半加器,它含有输入及两个输出(进位输出与本位输出),实现了一位的二进制加法。如图我们可以使用一个异或门和一个与门很轻松的实现这个结构。在传统八位加法器里我们可以使用半加器作为最低位的加法元,当然也能用全加器,不过记得把进位输入的地方置0。(Tips:这里我想补充一点,在计算机体系结构中加减乘除都是以加法器实现的,比如减法器,也是将数值转换成补码相加,当然这里又要讨论有符号整数和无符号整数的相关问题,他们的机理比较复杂,这里不做详细赘述。如果感兴趣可以自行购买王道的计算机组成原理教材练习。)

为了实现多位加法计算,我们引入了全加器的概念:全加器在半加器的基础上添加了一个进位输入来处理上一个全加器的进位输出,它其实也是在半加器的基础上添加了一层异或门和与门。不过这样的设计结构能够很好的进行多位计算,最经典的就是八位加法器:

当然,在八位加法器里又有一个不得不品鉴的一环——溢出处理,它是计算机组成原理课程的重难点,不过我们这里不做详细赘述,你只需知道当溢出的时候就会将左下输出置为1且引发操作系统的未定义行为错误,想要了解这个可以观看我上一篇文章的阐述。

如图,是全减器的实现

下面,我们来介绍解码器:这是一种能够将指令转化为计算机可识别并执行操作的设备,实际运用中他们常常被运用在区分和传输汇编码的信号上。具体而言,解码器接收一个二进制输入信号,该信号精确对应目标输出端的位置编号。其核心功能是,当输入信号被接收时,有且仅有一个输出端输出数值1,而其余所有输出端均保持数值0。当输入n个信号,我们可以控制2^n个输出

也许你会疑惑:这些晶体管底层实现和操作系统底层操纵的汇编指令有什么关系吗?答案是:有,而且非常只有!因为真正计算机能理解的代码是由0和1组成的二进制指令。

我们以此段举例,实现一种汇编指令的模拟:

假设01开头是加载操作,00是计算操作,10则是存储操作,那么现在让我们先聚焦于计算操作:

如图,每种操作码对应一种既定计算类型

在CPU确认当前指令为算术运算时,运算器会接收操作码并让所有电路同时接收输入并生成各自输出,但解码器的输出端通过特殊互联设计,确保只有被选定运算对应的结果能够通过该组件。

二、晶体管与数据存储

这一章节将要介绍基于SRAM(静态随机存取存储器)技术的存储,也就是王道书里谈到的Cache广泛应用的插电即存断电即毁的高速缓存技术。

在进行讲解地址数据存储之前我们得先了解一些关于锁存器的概念——它是整个存储系统的核心原理。如图所示,WRITE ENABLE输入端口是控制锁存器状态的当它为0的时候无论DATA怎么改变,存储的信息都不会受到影响。而当WRITE ENABLE输入端口置1的时候(此时我们可以覆盖原数据来修改信息),锁存器可以受到DATA的影响来改变其状态这也是我们I/O设备向高速缓存写入写出的基础原理。

然而这只是对于1bit信息的内容存储,我们知道一字节有8bit,要存储一个字节的信息,我们可以使用8个锁存器来完成。通过一个WRITE ENABLE来控制存储开关。同时这也构成了我们常说的寄存器(最简版)。

然而这种工程方式的排线分布使得地址变多时走线量巨大,那么我们就得引入地址复用技术了(同样这里不过多赘述原理和一些深入的知识,如有需要请看王道书的巨难练习题)我们将地址拆成两份,每份使用一个解码器来控制“类坐标系”中的坐标来定位实现指定地址的访问。

那么,该如何实现写入和输出呢?这里还是引入一个三极管,当ReadEnable被激活时(置1)集电极和发射极导通,遂输出信息且由于WriteEnable置0,信息存储不变。而当WriteEnable置1时,可写入数据更改存储单元信息。如图:

此时我们使用一个类似总线的装置来定位这些锁存器,但是由于没有侦测机制导致每次激活总线会让整行整列都被激活操作,这样是错误的,于是我们加入与门进行优化,让其可以定位到精确的单个锁存器本身:

如此,我们便能单独访问这块缓存上指定位置的锁存器了。开始我们现在仍在处理比特位的相互据,若要转化为字节的层面,可以将所有矩阵共享同一地址输入,这样我们就能通过相同地址同时访问各矩阵中对应的锁存器。读使能和写使能信号也应共享,因为我们需要对整个字节进行读写操作,而非单独处理某个比特位。如图,是我们使用的时候真正的存储方式:

而在写程序的时候,我们使用的更多是高层抽象封装的地址,而不必考虑电路板上的真正蚀刻:

这里我们引入了地址总线的概念(adressbus)。例如,当采用8位地址总线时,配合两个能分别控制16路输出的解码器,即可在存储矩阵中精确定位256个比特中的任意一位。通常来说,若地址总线具备n个输入位,系统可寻址的空间大小为2^n字节。例如,32位地址总线可寻址40亿字节,这解释了为何32位计算机最多只能支持4GB内存。

三、计算机运行程序的编写

这一章,我们来了解学习CPU中指令的实现与运行原理。上一版快,我们讨论了IO在存储中是如何进行的,这一板块,我们要探究汇编指令在硬件上的处理过程:LOAD,STORE以及SUB和ADD。首先,我们回顾一下整体过程步骤:我们将存储器定义为按字节寻址的存储阵列,通过地址总线输入字节在存储阵列中的位置,即可选中对应字节,当选中的字节处于可读取状态时,数据总线会配合读使能信号将该字节存储的数值传输至处理器。同一组数据总线也可作为输入通道,配合写使能信号,将新数据写入指定地址的存储单元。

首先我们来介绍关于LOAD和STORE。与计算操作不同,加载和储存的第一顺位是操作类型判断,第二顺位是寄存器编号,第三顺位是地址(当然,这里使用解码器来判断不同)。译码时,通常第一优先级的任务是判断操作类型(加载还是存储),第二优先级是确定涉及的寄存器编号,第三优先级则是根据寻址方式计算出内存地址。以 LOAD(加载)操作为例,它的目的是把数据从内存读到寄存器中。首先,CPU 将计算好的内存地址送上地址总线,同时激活内存的读使能信号;内存收到信号后,会把该地址中存储的数据输出到数据总线上。这个数据会被同时送到寄存器堆中所有寄存器的输入端,但此时所有寄存器都不会立即更新。接着,控制器根据指令中指定的目标寄存器编号,只激活该寄存器的写使能信号。在下个时钟沿到来时,该寄存器锁存住数据总线上的值,从而用新数据覆盖旧内容,完成加载。

STORE(存储)操作则方向相反:它会先将要存储的寄存器值送上数据总线,并把要写入的内存地址送上地址总线,随后激活内存写使能,将数据写入目标内存单元。这样,LOAD 和 STORE 就通过同样的三阶段选通(操作‑寄存器‑地址)实现了 CPU 与内存的数据交互。

与LOAD和STORE不同,ADD和SUB是计算操作数,假设第一顺位为00代表计算,第二顺位代表不同的计算操作类型,第三顺位是操作所在内存地址。

与 LOAD 和 STORE 这类访存指令不同,ADD 和 SUB 属于纯粹的算术逻辑运算,整个过程无需访问内存,数据只在寄存器堆和 ALU 之间流动。译码阶段依然是相同的优先级逻辑:先根据操作码判断是加法还是减法,然后提取目标寄存器编号以及两个源操作数的寄存器编号(例如ADD R1, R2中的 R1、R2)。随后,寄存器堆根据 R1,R2 的地址,通过译码器从对应的读端口同时送出这两个 32 位(或其他位宽)的数值,直接送入 ALU 的输入端。此时,ALU 控制单元会根据操作码产生相应的控制信号,如果是 ADD,则让 ALU 执行加法运算;如果是 SUB,则通常通过补码加法实现——将第二个操作数按位取反后与第一个操作数相加,并设置进位为 1,从而等效完成减法。经过一段组合逻辑延迟后,运算结果出现在 ALU 的输出端,而这个输出信号被连接到寄存器堆的写数据端口。最后,控制器使能目标寄存器 R1 的写使能信号,在下一个时钟上升沿将结果写入 R1,覆盖旧值。整个运算过程被压缩在一个时钟周期内完成(或者对应流水线的执行 / 写回阶段),与 LOAD 需要等待存储器读出的漫长延迟相比,ADD/SUB 的路径更短、速度更快,体现了 CPU 内部数据通路的纯粹计算能力。

四、Dram内存相关存储

前面我们介绍了Sram,适用于Cache,这里我们介绍Dram,它更多用于建造固态内存,由于集成度更高所以更加价格亲民,不过由于其动态刷新机制,其读远快于写,而且性能略逊Sram。

首先,我们来介绍电容。DRAM 是基于电容设计的一种存储结构,其每个存储单元的核心就是一个微小电容和一个晶体管。在写入数据时,DRAM 并不会一直由电源直接供电,而是通过打开晶体管,让位线上的电压对电容进行充电(存入逻辑 1)或放电(存入逻辑 0),从而将信息以电荷的形式暂存在电容里。电容一旦被充电,就会因为晶体管漏电和本身介质泄漏而开始缓慢丢失电荷。这种漏电速度相对较快,通常在几十毫秒内就会让代表 1 的电压下降到无法可靠识别的程度。因此,DRAM 必须周期性地对所有电容进行重新充电(刷新),才能保持数据不丢失。

DRAM和SRAM的对比

与SRAM相同,DRAM在存储上也使用矩阵样式的地址复用技术,通过复数个解码器与拆解地址来定位锁存器进行IO操作。由于SRAM静态内存技术成本高,且集成度低(空间成本远大于dram),所以我们的固态硬盘常用dram而sram仅用于多级闪存

事实上我们在读取的过程中,假设电压是0-1V的范围,那么我们的位线就就界定位为0.5V。当我们激活解码器的时候,整条线会被打开,激活栅极电容,点容有电会放电,位线会得到0.5+^v电压,电容没电的会充电位线会得到0.5-^v电压。最后输出的时候位线末端的感应放大器以位线电压0.5v为界定,高于则输出1否则为0。读取过后感应放大器将电信号原路返回。事实上在写操作的时候,我们在目标锁存器写好内容也会反向传入存储单元进行复写。

事实上关于刷新操作,我们是在电容器放电到不能读取之前先把数据存到目标锁存器,然后给指定存储位充电,最后写回数值到原存储单元。

由于刷新只能逐行操作,所以按理来说存储元件读写的范围是在未正在刷新的地址进行。不过不用担心,刷新是毫秒为单位的,但是读写操作是以纳秒为单位的所以影响不大。

相信你也注意到了这个模型我们是以比特位单位传输的,但是我们通常使用字节来传输在日常业务中,那么怎么办呢?不要慌,现代的多路复用器可以传输总线了,也就是说我们可以把八位当作一个总线传输输出,每次也输出八位就行。

当然,静态内存sram效率远高于dram,所以说无论如何他们都不能相互替换。

五、处理器是如何运行并维持正常工作状态

这一章节,我们来介绍指令集的协同运作:

关于cpu,在运行的时候通常是使用编译器翻译好的指令进行线性运行,工作台是寄存器。下面我将介绍它的运行过程:

首先,load加载变量,到通用寄存器,然后add将R1寄存器的值加到R0上并存到R0,最后STR存储R0的值到0111地址然后HALT完毕。这里要强调的一点是:通常我们的数据存储是先变量后数据也就是说:

好了,了解完这个之后我们进入到关于循环的实现部分:首先我们要理解JUMP这个指令的概念:JUMP是跳转指令,当生效时的操作是将地址寄存器的特定地址加载到(工作台),得以下一个地址访问是地址寄存器里记录的跳转地址。这里补充一下:每次运行一个指令的时候(无JUMP情况下)我们的地址寄存器自动加一以便下次访存的时候直接就可以找到对应位置。

我们注意到,当一个8位的存储自增到255满了之后,标志位O Z N中的O会亮起,这说明溢出了。标志位OZN分别代表溢出,零和负数,他们是循环条件成立的重要角色:

比如说这个简单的while循环,判断条件是a<5,但是在cpu看来就是判断”a-5“是否在N标志位成立,否则就跳出循环。下面是一些重要的JUMP系列指令:

六、时钟与CPU工作的原理

最后我们来聊聊时钟振荡信号与CPU的控制原理。首先,我们聚焦讨论方波,因为它恰好符合计算机二进制的0/1规则。 综上栏目我们已经知道了计算机运行的过程:取指,解码,然后是执行和程序计数器++。可是计算机是如何知晓应该按照这个过程循环做这些板块内容呢?答案是石英电子时钟。

下方是边缘触发器的波形,上方是电平波形

首先,我们要了解一下如图的逻辑电路机制,表面上看它是一个输入一个反相输入永远不可能会在AND门的前提下实现输出1的,但是我们要知道,反向门的反向操作需要纳秒级的事件这造就了一个上升沿,同时对应不久的下降沿。这就是边缘触发器的制作。

同样的,我们来看SR锁存器。R写入数值,S进行复位,当SR都为0的时候锁存器存储的内容不变,这样就算存储信息了。不过不能同时SR置1,因为不能同时写入和复位而且这个时候置0会因为几纳秒的差距导致上面说的上升沿效应导致信息存储被篡改了。

这时候我们引入使能的概念:只有Enable被激活后,再激活R,S才能实现复位和置位的操作,这确保了激发的安全性。

这个是KJ锁存器,AND门加了两个输入保证不会同时输出一样的信号杜绝了最开始的1:1的异常情况,并且前面接入了一个边缘触发器,当上升沿期间J,K被同时触发,触发器会切换当前数值,而且此时J置位K复位。我们使用多个连在一起的JK触发器可以实现在固定往复的顺序下计数,那么这个就可以用来控制CPU按顺序处理各个阶段的操作。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 9:32:01

伯努利分布:二元决策的统计基石与业务落地指南

1. 这不是数学课&#xff0c;是解决现实问题的“概率扳手”你有没有遇到过这样的场景&#xff1a;电商运营在凌晨三点盯着AB测试后台&#xff0c;心里打鼓——新首页按钮点击率比旧版高了0.8%&#xff0c;这到底是真实提升&#xff0c;还是随机波动&#xff1f;又或者&#xff…

作者头像 李华
网站建设 2026/5/26 9:31:36

海德汉PWM21/PWT101:解锁Endat信号与高精度光栅尺的终极诊断工具

1. 海德汉PWM21/PWT101&#xff1a;工程师的Endat信号诊断利器 第一次遇到海德汉Endat编码器故障时&#xff0c;我和大多数同行一样手足无措。那台价值百万的数控磨床突然报出"位置反馈异常"&#xff0c;但传统示波器上只有一堆看不懂的数字脉冲。直到接触到PWM21这…

作者头像 李华
网站建设 2026/5/26 9:31:36

Thorium浏览器:为什么这个性能怪兽能让你彻底告别Chrome?

Thorium浏览器&#xff1a;为什么这个性能怪兽能让你彻底告别Chrome&#xff1f; 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, links are towards …

作者头像 李华
网站建设 2026/5/26 9:24:11

PikiwiDB新存储引擎 官文解读

原文连接https://github.com/OpenAtomFoundation/pikiwidb/discussions/2052 1.要点 首先提出:上一方案每种数据类型对应一个RocksDB&#xff0c;导致不同数据类型可以重名的问题&#xff0c;同时业务集中使用一种数据类型&#xff0c;造成负载不均衡和资源浪费。 新的存储架…

作者头像 李华