Lecture 4
Abstract
我们先回顾浮点类型转换、加法与乘法的处理流程,再从 MOS 晶体管构造 CMOS 逻辑门,由真值表设计加法器、解码器、多路选择器和 ALU,最后用功率模型与传播延迟分析电路的代价和时间约束。
浮点回顾:表示、转换与运算怎样连接起来
回放 A 06:35
我们先接上前一课的浮点数。定点表示固定小数点的位置,把一部分位解释为整数位、另一部分解释为小数位;浮点表示则把有限的位分给符号、指数和有效数,以指数调整数值的尺度。对于规格化的二进制浮点数,我们写成
IEEE 754 单精度占 32 位,其中符号 1 位、指数 8 位、小数字段 23 位;双精度占 64 位,其中符号 1 位、指数 11 位、小数字段 52 位。规格化数的首位 1 隐含,因此两者的有效数精度分别是 24 位和 53 位。分给指数和小数字段的位数,分别影响数值范围与精度。课堂也回顾了 BF16、MXFP4、MXFP8 等低精度格式:不同计算任务可以在精度与计算开销之间取舍。
浮点数与整数怎样转换
回放 A 08:13
把 float 或 double 转成 int,整数部分需要保留,小数部分向零截断。正数的小数部分去掉,负数也向零靠近,例如 得到 , 得到 。浮点数能够表示的数值范围比这里的 32 位 int 大,所以还要检查截断后的整数是否可表示;越界或 NaN 转为 int,C 没有定义相应结果。
反过来,把 int 转成 float,数值范围足够,但有效数位数可能不够,因而需要按舍入模式选取可表示值。这里联系前一课的四种方式:向零、向负无穷、向正无穷,以及舍入到最近值且中点取偶数。把 32 位 int 转成 double 则可以精确完成,因为双精度的 53 位有效数足以容纳它的全部有效位。
我们也把此前内容连起来:位级布尔运算、逻辑运算与移位提供基本操作;整数使用无符号表示或补码解释,并通过符号扩展、零扩展、截断和类型转换改变位宽或解释方式。补码使有符号与无符号加法能够共用位级加法电路。接下来要问的是,浮点数是否也能只接一个整数加法器就完成计算?
浮点加法先对阶,再做有效数运算
回放 A 12:50
设两个输入是 、。相加以前,要先让它们使用同一个指数。取 ,就有
指数较小的一项,其有效数需要右移,移位量等于两个指数的差。对齐后,同号时相加,异号时根据大小相减,并确定结果符号。得到的有效数还要规格化:若大于等于 2,就右移并增加指数;若非零且小于 1,就左移并相应减小指数。最后按小数字段的精度舍入,并检查指数范围。
课件的加法例题把这些步骤写得很具体:
这里先把第二项右移一位完成对阶,和的有效数已经在 内,且所写小数位能够精确容纳结果。
课件纠错:加法通则页把“有效数左移 位”后的指数调整写成增加 ;为保持数值不变,指数应减少 ,后面的例题页也采用减少的写法。
从硬件结构看,这些步骤需要比较输入大小、必要时交换输入、比较并相减指数、对阶移位、有效数加减、结果规格化和舍入,还要有控制逻辑协调各部分。整数加法可以从一位全加器逐位扩展,浮点加法则在加法器之外增加了这些处理。实现同样的浮点功能,可以有不同的速度、面积和功耗设计。就像房屋都要满足居住需求,但布局及其与环境的配合各不相同,体系结构设计也要在相同功能下组织好各部件。

Align (<<) 的左移标记有误;对齐到较大指数时,较小指数一项的有效数应右移。浮点乘法分别计算符号、有效数和指数
回放 A 18:53
乘法与科学计数法的乘法相接:
两个符号相同,异或为 0,积为正;符号不同,异或为 1,积为负。两个规格化有效数都在 中,乘积就在 中。如果 ,把有效数右移一位,同时令指数加一,重新回到规格化范围。乘出的有效数可能有更多小数位,最后还要舍入到所选格式的精度;若指数超出范围,还要处理溢出。
我们最后检查它的代数性质。浮点加法与乘法保留交换性;有限位宽中的溢出和每一步舍入,使结合律与分配律不再普遍成立。即使交换了括号以后,实数运算的数学表达式相同,中间步骤舍去的信息也可能不同。对这里的有限数,乘以 1 保持原值。这样,我们从“数怎样编码”走到了“运算电路需要做哪些工作”。
从数的运算走向电路的构造
我们已经知道怎样用二进制表示和计算数据,现在把问题再往下追一层:计算机究竟怎样由电子器件搭出来?我们可以把整个过程看成一条抽象层次链:问题先变成算法,算法写成程序,程序最终由指令集体系结构所规定的指令来执行;指令下面有微架构,微架构下面又有具体电路。指令集使我们可以描述机器做什么,而不必在每次编程时都知道底下每一个晶体管怎样连接。今天我们沿着相反的方向,从最小的器件开始,看看这些器件怎样组合成门,再怎样组合成能够计算和选择数据的电路。
1. 把 MOS 晶体管当作受电压控制的开关
在这部分内容中,我们把 MOS 晶体管作为最小的构造单元。MOS 是 Metal Oxide Semiconductor,即金属氧化物半导体。正如乐高中最小的积木可以搭成赛车和城堡,晶体管可以搭成门电路,门电路又能搭成处理器和存储部件。我们先使用开关模型,不进入半导体内部的物理细节。
晶体管有源极 Source、漏极 Drain 和栅极 Gate。栅极相当于控制开关的端口;它控制源漏之间导通还是断开。这里有一个容易混淆的词:开关闭合意味着导通,开关打开意味着断路。下面我们直接说“导通”和“截止”,避免把“打开开关”误解成通电。
两类晶体管的控制方式相反。在课件使用的基本接法中,NMOS 的源极接地 GND,地电位记为逻辑 0;当栅极是高电平,即逻辑 1 时,源漏通路导通;当栅极是低电平,即逻辑 0 时,源漏通路截止。这里的 0 和 1 是对电压范围的逻辑抽象,并不是说实际电路里有一个抽象数字在移动。
PMOS 的源极在这个基本模型中接供电电压 ,例如课件举出的 。它与 NMOS 互补:栅极为 0 时导通,为 1 时截止。PMOS 符号栅端的小圆圈提醒我们,它的控制极性与没有小圆圈的 NMOS 相反。
| 栅极输入 | NMOS 源漏通路 | PMOS 源漏通路 |
|---|---|---|
| 0 | 截止 | 导通 |
| 1 | 导通 | 截止 |
导通的理想开关可以把两端看成连接在一起;截止时,两边则可以具有不同电位。我们后面会看到,“某个晶体管导通”不等于“输出一定为 1”:它若把输出接到了地,输出恰恰会变成 0。现代计算机同时使用 n 型和 p 型晶体管,这就是 CMOS,即 Complementary MOS,互补 MOS 技术。
2. 两个晶体管怎样实现一个非门
我们把一个 PMOS 放在上方,一个 NMOS 放在下方,把二者的栅极接在一起作为输入 ,再把漏极接在一起作为输出 。上方通路连接 ,下方通路连接 GND。
当 时,上方 PMOS 导通,下方 NMOS 截止。于是输出连接到电源而与地隔离,。当 时,情况正好相反:PMOS 截止,NMOS 导通,输出被接到地,。我们得到
| 0 | 1 |
| 1 | 0 |
这就是非门,或者说反相器 inverter。它的门级符号是三角形后面带一个小圆圈。通过这个例子,我们把三个层次接起来了:晶体管连接方式决定开关状态,开关状态决定输出电压,输出电压又被解释成真值表中的 0 或 1。

3. 从串并联关系推导 NAND、NOR 和 AND
接下来我们给两个输入 ,上方用两个并联的 PMOS,下方用两个串联的 NMOS。我们先别急着猜门的名字,逐行推导它的真值表。
当 时,上方两个 PMOS 都导通,下面两个 NMOS 都截止,输出为 1。当 时,一个 PMOS 截止,另一个仍然导通;并联网络只要一条支路导通就可以把输出拉高。下方虽然一个 NMOS 已导通,另一个却截止,而串联路径必须全部导通才通,所以输出仍为 1。 的情况对称,输出也是 1。只有 时,上方 PMOS 全部截止,下方两个 NMOS 全部导通,输出被拉到 0。
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
所以这个电路实现的是与非门:
这里把 AND 写成乘法 ;后面把 OR 写成加法 。它们是布尔运算,不是一般整数运算。与非门的门级符号是在与门输出端加上表示取反的小圆圈。
现在再问:或非门 NOR 怎样实现?我们把上下的串并联关系交换:上方两个 PMOS 串联,下方两个 NMOS 并联。只有当 时,上方才能全部导通、下方全部截止,因此输出为 1;只要有一个输入为 1,下方就存在通地支路,输出便为 0。于是
这也给我们一个检查电路的普遍方法:并联网络中任意一条支路导通就够了,串联网络中则必须所有器件都导通。我们不能只看单个晶体管,而要看从输出到电源或者地的整条通路。
上面的 PMOS 部分叫上拉网络(pull-up network),因为它把输出拉到高电平;下面的 NMOS 部分叫下拉网络(pull-down network),因为它把输出拉到低电平。对于这里讨论的静态 CMOS 门,在稳定输入下,我们希望恰好一个网络导通,另一个网络截止。若二者同时导通,就会形成从电源到地的直通路径;若二者同时截止,输出没有被确定地连接到任何一端,就处于悬浮 floating 状态,可能受到噪声等因素影响,不能当作确定的 0 或 1。

如果我们需要的是 AND,刚才的 NAND 还差一次取反。把 NAND 的输出接到一个反相器即可:
这样我们已经可以用晶体管组成最基本的逻辑门,再把门作为构造更大电路的积木。
4. 从真值表到电路:SOP 与 POS
我们用一位全加器复习一次设计流程。它有三个输入:本位的两个加数 ,以及低位送来的进位 ;输出是本位和 及向高位的进位 。
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
我们先找 的全部输入组合。对其中一行,例如 ,用乘积项 表示“恰好满足这一行”。输入值为 0 的变量取反,值为 1 的变量保留。把所有使输出为 1 的乘积项用 OR 接起来,就得到积之和 SOP(sum of products):
同样地,
这些表达式可以进一步写成我们熟悉的形式:
SOP 的直觉很清楚:若满足任意一种使输出为 1 的情况,输出就为 1。把取反变量接非门,每个乘积接与门,最后再接或门,就从真值表得到了门电路。这是一个标准的真值表到布尔函数、再到电路的转换过程。
还有另一种等价方式,叫和之积 POS(product of sums)。这次我们找输出为 0 的行,为每行构造一个“恰好在这一行等于 0”的或项,再把各或项 AND 起来。这里变量的极性与 SOP 相反:该行中为 0 的变量写原变量,为 1 的变量写其反。为什么?因为一个或项只有在所有文字都为 0 时才为 0。
对于全加器的 ,零输出的输入是 ,因此
其中相邻括号表示 AND,也就是乘法;括号内的加号表示 OR。任选一个 的输入代入,都会使对应的括号为 0,整个乘积随之为 0;而在 的输入行,每个括号都为 1,所以乘积为 1。SOP 与 POS 都能得到正确电路,只是观察真值表的方向不同。
5. 多位加法器与关键路径的直觉
一位全加器已经会加三个一位输入。要做四位加法,我们把四个全加器串起来:第 位的 接到第 位的 ,最低位接外部初始进位。这样进位像涟漪一样从低位向高位传递,叫串行进位加法器或 ripple-carry adder。
它的优点是设计简单,各位结构相同。但高位的结果可能要等待低位的进位先到来。四位时还不明显,扩展到 32 位、64 位甚至更宽时,最长的进位传播链就会很长。在这种结构中,延迟随位宽线性增长。我们今天暂时不展开超前进位加法器 CLA(carry look-ahead adder)的实现,只要知道它通过预先组织进位逻辑,减少逐位等待,从而改善速度。
一条电路中最慢、决定整体何时能得到正确结果的路径,叫关键路径(critical path)。在 ripple-carry 结构中,进位链就是值得关注的长路径。做优化时应先看限制整体速度的路径:只把其他已经很快的部分再做快,通常不能缩短整个电路的完成时间;当原先的关键路径得到改善后,瓶颈才可能转移到别处。
6. 解码器:识别输入是哪一种模式
接下来我们做两类在处理器和存储器中反复出现的组合电路。第一类是 decoder,解码器。这里说的解码器是一个输入模式检测器:有 位输入和 路输出,正常情况下恰好一路输出为 1,其余全部为 0。为 1 的那一路指出输入对应哪一种二进制模式。
例如二到四解码器。把输入记为 ,它依次代表数值 0、1、2、3:
| 00 | 1 | 0 | 0 | 0 |
| 01 | 0 | 1 | 0 | 0 |
| 10 | 0 | 0 | 1 | 0 |
| 11 | 0 | 0 | 0 | 1 |
据此直接写出
这个行为类似自动售货机中的选择:输入一个编号,只有对应通路被选中。计算机中更重要的用途是地址选择。我们可以把存储数据的位置想成不同仓库,输入的地址指出要访问哪个仓库,解码器把二进制地址变成对应行或对应存储部分的选择信号。课上提到的 DRAM 行地址就是这种用途之一。我们也可以把某一段位模式解释成指令操作码,由译码逻辑决定它表示加法、减法还是访存。
增加地址位数,就能增加可区分的位置数。
7. 多路选择器:从多个数据输入中挑一个
第二类叫 multiplexer,通常缩写 MUX,也叫多路选择器或多路复用器。它有多个数据输入,依据选择信号 select,选其中一路送到输出。若数据输入数为 ,就需要 位选择信号;例如四路输入需要两位控制。
先做最简单的二选一。数据输入是 ,选择信号是 : 时选 , 时选 。我们把真值表中不影响结果的输入记作 ,意思是这一位取 0 或 1 都可以:
| 0 | 0 | 0 | |
| 0 | 1 | 1 | |
| 1 | 0 | 0 | |
| 1 | 1 | 1 |
因此
这式子本身就解释了电路怎样工作。当 时,第一路与门收到 ,所以 ;第二路与门收到 ,无论 是什么,它都输出 0。最后 OR 起来只剩 。当 时,两路角色交换,输出只与 有关。

四选一也可以分两层搭出来:第一层两个二选一,分别在 和 中选择,第二层再选这两路的结果。两位选择信号中的一位控制组内选择,另一位控制组间选择。把逻辑展开,就是
解码器把紧凑的输入编码变成“哪一路有效”,MUX 则让选定的一路数据出现在公共输出。这两种功能在后面的存储器设计中会配合起来。
8. 用选择器组织一个 ALU
我们在冯·诺依曼计算机中先取指令,再按照指令取数据并做运算。做运算的部件叫 ALU,Arithmetic Logic Unit,算术逻辑单元。它要支持多种操作,实际执行哪一种由控制信号决定。
我们先用一个容易理解的实现:假设支持加、减、按位 AND、按位 XOR 四种操作。把输入数 同时接到四个运算电路,它们分别得到 、、、,然后把四个结果接到四选一 MUX。控制信号 决定把哪个结果送出去。这里的输入输出可以是多位总线,不局限于一个 bit;对多位结果进行选择,相当于每一位都有相同选择信号控制的 MUX。
这让我们看到,ALU 不必因为要执行不同指令,就临时把整个电路变成另一种形状。一个组合设计可以预备好多种计算,再按控制信号选择结果。课件还标出了 ZF、OF、CF 等标志输出,具体含义留到后面讲。
简单的算术单元加上选择逻辑,就能构成支持多种功能的更大部件。
9. 功率、能量,以及为什么电压很重要
电路除了算得对、算得快,还要考虑功耗。我们先把总功率分成动态功率和静态功率:
动态部分来自开关活动。信号从 0 变成 1,或从 1 变成 0,电路的电容要充放电,就会消耗能量。式中的 表示电路中门和连线的等效电容, 是供电电压, 是活动所依据的充放电频率, 用来反映实际发生的开关活动比例。CPU、GPU、存储部件可以有各自的时钟与工作频率。
静态部分主要来自漏电流。即使晶体管没有主动切换,也不能把实际器件当成完全没有电流的理想开关。供电电压乘漏电流给出这一部分的功率。
功率与能量也要分清:功率表示单位时间的能量消耗,若功率近似恒定,运行时间为 ,则
观察动态功率公式,我们可以从降低开关活动、减小电容、降低电压或者降低频率等方向考虑功耗。尤其电压以平方形式出现,所以供电电压的变化会明显影响动态功率。减小器件尺寸、降低供电电压和电容,是课堂给出的设计方向。
10. 组合逻辑为什么还不能保存计算结果
到这里,我们可以搭一个没有内部记忆的计算器:给定输入 2 和 2,它输出 4。可是如果下一步想“在刚才的 4 上再加 3”,机器就必须记得刚才的结果。我们当然可以一次把 都作为当前运算来做,但那与保存中间结果、在下一次操作时使用它,是两件事情。
组合电路的输出只依赖当前输入。我们接下来要研究的时序逻辑则要让当前输出或后续行为也依赖过去的信息,这需要存储单元。不过在构造存储单元之前,先要修正一个过于理想的想法:输入一变,电路的输出并不会瞬间就变成正确答案。
11. 输入变化到输出变化,要等多久
我们先看一个 buffer,即缓冲器。它在逻辑上实现 ,输入是多少,稳定后的输出就是多少;这个符号本身不表示保存一个独立的历史状态。真实的电压从低到高需要一个过渡过程,输出还要再经过电路响应才发生相应变化。
从低电平到高电平的转换叫上升沿 rising edge,从高到低的转换叫下降沿 falling edge。画时序图时,横轴是时间,纵向的高低表示电平。为了在平滑的实际转换曲线上规定一个变化时刻,可以使用约定的电压交点;课上用转换过程的中间位置作直观说明。输入和相应输出的交点之间就是所测的延迟。
但对复杂电路,只说一个延迟还不够。输入变化以后,输出可能先发生变化,经过一段不稳定的过程,最后才达到正确的稳定值。因此我们定义两个边界:
传播延迟 是从输入变化到输出达到最终值所需时间的最大界限。只要输入此后保持不变,等待足够的传播延迟之后,我们才可以保证输出已经稳定。
污染延迟 是输入变化后,任意输出最早可能开始改变所需时间的最小界限。在这段时间以前,旧输出还保持不变;从这个边界开始,它可能不再可靠,但这不意味着它已经等于正确的新输出。
所以输入在 发生变化后,可以把时间理解为三段: 之前仍保留旧值; 到 之间允许发生过渡; 以后保证最终值。不是每一次输入变化都会使输出真的出现抖动,这两个量给的是保证边界。

12. 如何计算组合电路延迟
假设暂时忽略连线延迟,每个逻辑门有给定的延迟。我们把输入到输出的不同路径列出来,沿每条路径累加门延迟,再取最大者。这条达到最大延迟的路径就是关键路径:
课件给出的数值是 AND 为 、OR 为 、NAND 为 、XOR 为 。其中关键路径依次经过 AND、NAND、XOR,所以
这里 是皮秒,。判断关键路径要比较累计时间,不能只看图中线画得长不长,也不能把整张图上所有门的延迟相加,因为并行支路并不是逐个串行执行。
为什么输出可能在最终稳定以前就变化?同一输入的影响可能沿不同路径传播。短路径上的变化先到达末级门,长路径上的信息还没到,末级暂时组合了不同阶段的信息,就可能出现中间变化;等最长路径也传播完成,最终值才有保证。这样,关键路径与两种延迟就联系起来了。后面我们会把这个时间观点带入存储电路:既要知道存什么,也要知道什么时候才能可靠地存。
来源与补全:据 2026-09-24 A(154170)、B(151985)完整转写,覆盖开场浮点回顾至组合电路延迟。浮点部分核对 Lecture 4 原件,加法算例据该课件回顾;组合逻辑核对 Lecture 5 PDF 1—132 页、Lecture 6 PDF 1—27 页。对阶、规格化、SOP/POS、MUX 与延迟公式补齐中间步骤,原式错误就地说明。截图来自相应回放;新增浮点加法器图已目视核对。