这一部分对应的是 lec 14 ~ 17 (哔大上的参考课程为[Summer 20]),主要涉及的是同步数字系统,包括基本介绍(lec 14)、状态原件(lec 15)、组合逻辑设计(lec 16)以及组合逻辑模块(lec 17)
在前面,我们了解了层次抽象这一理念。而 c 代码的高层抽象最终在物理层面上需要由晶体管来执行。但指令集架构(ISA)只是软件向硬件交互的媒介,我们需要再深入一些,从数字设计 (Digital Design) 和电路设计 (Circuit Design)了解底层是如何设计实现 ISA 的定义指令的。
同步数字系统(Synchronous Digital Systems (SDS))
SDS拥有两大核心特征:
- 同步 (Synchronous):所有操作都由一个全局的时钟 (Clock) 信号来协调和同步。时钟像心脏一样跳动,每一个脉冲(周期)驱动系统完成一步操作。这是确保复杂系统有序工作的关键。
- 数字 (Digital):所有信息都用离散值(0和1)表示。电信号(电压的高低)被解读为逻辑上的“0”或“1”,多个信号线组合在一起就形成了数据字(如32位的RISC-V指令或数据)。
所有部件都在时钟 的指挥下协同工作
基本构件块
SDS中的基本构件块包括:
- 开关 (Switches):最基础的物理概念——反映了“用信号控制电路”的思想。开关的组合就形成了基本的与 (AND)、或 (OR) 逻辑门。
- 晶体管 (Transistors):现代电子学的基石。课件介绍了MOS晶体管,特别是CMOS(Complementary MOS)技术中使用的两种类型:
- nMOS:当栅极(G)为高电压(1)时导通(开关闭合)
- pMOS:当栅极(G)为低电压(0)时导通(开关闭合)
- CMOS逻辑门:通过组合nMOS和pMOS管,可以构建出高效、低功耗的逻辑门(如反相器NOT、与非门NAND)。讲座在此强调了一个重要观点:
任何数字逻辑电路最终都可以由晶体管网络构建而成。
从这可以看出,晶体管构建起了硬件的基础,相同于 bit 之于软件,它是所有复杂性的起点。
信号与波形
- 信号 (Signals):在数字系统中,信息通过 wires 上的电压电平传输,被解读为0或1。
- 波形 (Waveforms):一种用来可视化信号随时间变化的工具
关于信号,存在两个关键问题:
- 噪声 (Noise):实际信号并非完美的方波,会有抖动和过冲。
- 延迟 (Delay):信号通过逻辑门需要时间,这是硬件设计中最关键的约束之一。从输入变化到输出稳定需要一个“传播延迟”。这个延迟便决定了电路能运行的最高时钟频率。
一个电路的性能(最高时钟频率)由其中最长的组合逻辑路径(关键路径)的延迟决定。而这也直接联系到了CPU的主频(GHz)
基本电路类型
SDS由两种电路构成:
- 组合逻辑 (Combinational Logic, CL):输出仅取决于当前输入的电路。它没有记忆功能。比如加法器(ALU)、多路选择器(MUX)、译码器和基本的逻辑门(AND, OR, NOT)。
- 状态元件 (State Elements):能够存储信息的电路。它们构成了系统的“记忆”。比如寄存器(Register)和内存(RAM)。它们通常在时钟边沿(如上升沿)才捕获并保存输入端的值,并在下一个时钟周期到来之前一直保持该值不变。这为同步系统提供了稳定性。
所以CPU数据通路可以视为组合逻辑和状态元件的交替组合。时钟控制着数据在组合逻辑中处理完毕后,被安全地存储到寄存器中,在下一周期进入下一状态。
关于这两种电路,lec 14 只做了粗略介绍,更详细的介绍在后续的讲座 lec 15 和 lec 16 中,见下。
状态元件
状态元件的核心作用包括两点:一是构成计算机的记忆体系,比如堆和内存;二是控制流,在时钟的指挥下有序将数据放入下一级组合逻辑中,实现了不同组件间的解耦与同步,是流水化设计(见后续)的重要保障。
状态元件的实现依靠的是 D 型触发器 (D Filp-Flop)
D 型触发器是储存 1 Bit 信息的基本单元,多个 D 触发器并行工作就构成了一个寄存器。
D 型触发器的关键特性是边沿触发:即只在时钟信号的上升沿/下降沿瞬间将输入 D 端的值捕获并锁存到输出 Q 端,而时钟周期的其余所有时间输入都会被忽略。
约定 D 型触发器的时序参数包括:
- 建立时间 (Setup Time, tₛᵤ):在时钟上升沿到来之前,输入D必须保持稳定的最短时间。
- 保持时间 (Hold Time, tₕ):在时钟上升沿到来之后,输入D必须继续保持稳定的最短时间。
- CLK-to-Q延迟 (t_cq):从时钟上升沿到输出Q端变得稳定有效所需的时间。
流水线(Pipelining)
前文提及一个电路的性能(最高时钟频率)由其中最长的组合逻辑路径的延迟所决定,那么为了提高性能,在设计时我们可以将一个延迟很长的组合逻辑路径(关键路径)用寄存器切割成多段,这样就使得每一段的最长延迟变短,因此可以使用更高的时钟频率,从而提升系统吞吐量。
那么,SDS,代价是什么呢?◐▽◑
流水线设计增加了延迟(Latency)(完成单个任务所需的总时间)和硬件面积(额外的寄存器)。这是一种典型的“以空间换时间”的策略。关于这部分后续还会有讲座进行专门介绍,此处按下不表
有限状态机(FSM – Finite State Machine)
所谓 FSM ,是指一个具有有限数量状态的系统,根据当前输入和当前状态(PS)来决定下一个状态(NS)和输出。
实现起来还是相当简单的(参考 lab 05),包括
- 状态寄存器:一组触发器,用于存储代表当前状态的二进制编码。
- 组合逻辑:两个功能块:
- 次态逻辑:输入为
当前状态
和外部输入
,输出为下一个状态
。 - 输出逻辑:输入为
当前状态
或当前状态和输入
,输出为控制信号
。
- 次态逻辑:输入为
组合逻辑
设计方法
工欲善其事必先利其器,在组合逻辑设计中,我们可用的工具包括:
- 真值表 (Truth Table):逻辑功能的规范。列出所有可能的输入组合及其对应的输出。作为设计的起点。
- 逻辑门 (Logic Gates):实现的工具。与(AND)、或(OR)、非(NOT)、与非(NAND)、或非(NOR)、异或(XOR)是基本构建块。
- 布尔代数 (Boolean Algebra):分析和优化的数学语言。使用公理和定理(如交换律、结合律、分配律、德摩根定理)可以简化逻辑表达式,从而用更少的门实现相同的功能,降低成本、功耗和延迟。
而相应的规范形式(Canonical Forms)包括:
- 积之和 (Sum-of-Products, SOP):先AND后OR。由多个最小项 (Minterm) 相加而成。每个最小项对应真值表中输出为1的一行。
- 和之积 (Product-of-Sums, POS):先OR后AND。由多个最大项 (Maxterm) 相乘而成。
- 注意上述式子虽然保证了正确性,但不一定最简!
组合逻辑模块
这一部分是 lec 17 的内容,主要介绍了多路选择器 (Multiplexor, Mux)、算术逻辑单元 (ALU)、加法器 (Adder)三种模块以及溢出检测 (Overflow Detection)的相关思路
多路选择器 (Multiplexor, Mux)
MUX 是一种 N 选 1 的数据选择器。可以根据选择信号(S) 的值,从多个数据输入中选择一个送到输出。
lab 中有一个 circ 实验需要用到 16 bits MUX,在实现上除了基于真值表用 AND Gate 和 OR Gate 实现外,更简易以及更建议的做法是层次化设计的递归实现,说人话就是 1 生 2,2 生 4,4 生 8 …
在CPU数据通路中,Mux被大量用于选择不同的数据来源,因此弄懂结构和原理是相当必要的
算术逻辑单元 (ALU)
ALU 是CPU的执行核心,负责执行算术(加、减)和逻辑(与、或、移位等)运算,其核心正是我们刚刚提及的 MUX ,不同的功能块(加法器、按位与器、按位或器)并行计算所有结果,最终由功能选择信号控制一个Mux来选择哪一个结果作为最终输出
它同样是我们“层次抽象”的完美体现,CPU控制器只需要发出简单的选择信号(如
ALUop
),而无需关心ALU内部复杂的电路细节。
加法器(Adder)
这块主要介绍的是行波进位加法器 (Ripple-Carry Adder)它由N个1位全加器串联而成。结构简单,但速度慢(关键路径延迟长),因为进位信号像波浪一样从最低位传递到最高位。
此外还有减法,利用补码表示,我们便可以用加法器完成加法和减法两种操作,具体来说:
$$A – B = A + (-B) = A + (~B + 1)$$
我们在加法器中通过一个控制信号(Sub)进行控制:
- 将B的每一位与Sub信号进行异或就相当于条件取反。
- 将Sub信号作为进位输入(Cin),便可实现
+1
操作。
溢出检测(Overflow Detection)
对于有符号数(补码)加法,最高位的进位输入和最高位的进位输出不一致时,就会发生溢出,即:
$$Overflow = Carry_{in}[MSB]\ XOR\ Carry_{out}[MSB]$$
这标志着结果超出了有限位数的表示范围,导致了符号位的错误
写在最后
总而言之,lec 14 ~ 17 为我们提供了设计和理解CPU及其他数字硬件所需的全套工具箱。从设计方法论到实现逻辑,从层次化的总体抽象到层内的性能权衡,我们现在应该能够看懂数据通路的每一个模块的大致结构并理解系统的工作流程,为接下来的缓存、流水线、处理器设计打下一定基础。
发表回复