微处理器设计/程序计数器
程序计数器 (PC) 是一个寄存器结构,它包含当前指令的地址指针值。每个周期,指针指向的值都会被读入指令译码器,而程序计数器会更新为指向下一条指令。对于 RISC 计算机,更新 PC 寄存器就像将机器字长(以字节为单位)添加到 PC 一样简单。但是,在 CISC 机器中,需要计算当前指令的长度,并且需要将该长度值添加到 PC。
通过将使能信号置高可以更新 PC。在每个指令周期之后,需要更新 PC 以指向内存中的下一条指令。在构建 PC 更新电路之前,了解内存的组织方式非常重要。
基于哈佛的系统倾向于在每个内存位置存储一个机器字。这意味着每个周期都需要将 PC 加 1。共享数据和指令内存的计算机通常是字节可寻址的,也就是说每个字节都有自己的地址,而不是每个机器字都有自己的地址。在这种情况下,需要根据机器字中的字节数来增加 PC。
在这张图片中,字母M被用作每个周期更新 PC 的数量。这可能是在 CISC 机器中的一个变量。
示例:MIPS
MIPS 架构使用字节可寻址的指令内存单元。MIPS 是一种 RISC 计算机,这意味着所有指令的长度都相同:32 位。因此,每个周期都需要将 PC 加 4(32 位 = 4 字节)。
示例:英特尔 IA32
英特尔 IA32(有些人更熟悉它的别称“x86”)是一种 CISC 架构,这意味着每个指令的长度可能不同。英特尔内存是字节可寻址的。每个周期,指令译码器都需要确定指令的长度(以字节为单位),并且需要将该值输出到 PC。PC 单元会根据从指令译码器接收的值来增加自身。
分支发生在称为“分支”或“跳转”指令的一组特殊指令中。
. 在分支或跳转中,控制权会转移到指令内存中不同位置的另一条指令。
在分支过程中,会加载一个新的 PC 地址,通常来自指令或寄存器。此新值将加载到 PC 中,并且未来的指令将从该位置加载。
无偏移分支,通常称为“跳转”,是一种分支,其中丢弃先前的 PC 值,并从外部源加载新的 PC 值。
在这张图片中,PC 值要么被加载为更新后的版本,要么被加载为新的分支地址。为了简化,我们没有显示 MUX 的控制信号。
偏移分支是一种分支,其中将一个值添加到当前 PC 值(或从中减去一个值)以生成新值。这通常用于 PC 值大于寄存器值或立即值的系统中,在这种情况下,无法将完整的值加载到 PC 中。它也常用于支持可重定位的二进制文件,这些文件可以加载到任意基地址。
在这张图片中,有一个第二个 ALU 单元。请注意,如果我们使用以下配置,我们可以简化此电路并删除第二个 ALU 单元。
这些只是此电路的两种可能的配置。
许多系统都具有使用偏移和无偏移分支的功能。一些系统可能会在“近跳转”和“远跳转”之间进行区分,尽管这个术语已经过时了。