首页 / 资讯中心 / 文章详情

计算机组成原理:CPU内部结构、寄存器与ALU数据通路详解

计算机组成原理:CPU内部结构、寄存器与ALU数据通路详解 ★ FEATURED ARTICLE
计算机组成原理这门课不少同学学到第六章中央处理器时都会有一个共同的感受前五章好歹还能在脑子里搭出画面存储器的读写时序、总线的仲裁握手、I/O接口的端口映射都是看得见的部件在按规则配合可一进第六章话题突然转向CPU内部寄存器、ALU、控制器、数据通路这些名词一股脑涌出来教材上满是方框和箭头看着看着就分不清谁连着谁、谁先动谁后动。我最初学这章的时候也一样晕后来是在帮人调试一个教学用的CPU模拟器时才真正把第六章1的内容串成了一条线。这条线就是以一条指令从取指到执行为线索把CPU的各个部件挨个安放到它该出场的位置。这篇文章就按这条线来写覆盖本章第一部分最核心的内容——CPU的功能与结构、寄存器体系、ALU的工作原理、指令执行的数据通路以及控制器的基础框架。适合正在学这门课的同学巩固理解也适合工作后想回头把体系结构底子补扎实的工程师。1. 先搞清楚中央处理器这一章在整个课程里的位置1.1 为什么前五章还顺畅到第六章突然卡壳原因其实不复杂。前面的存储系统和输入输出系统本质上都在描述被CPU访问的对象主存是一张按地址组织的表格I/O接口是一组端口告诉CPU怎么读写就行。到了第六章视角一下子反转成访问的主体也就是CPU自己内部的运作。这种视角切换对初学者来说是最难的一关——很多人不是看不懂单个概念而是还没适应站在CPU里面向外看。另一个卡壳原因是术语密度突然增大。PC、IR、MAR、MDR、ACC、ALU、CU、PSW光缩写就八九个而且它们之间的连线图在教材里密密麻麻。初学者最容易犯的错是把记忆重点放在每个寄存器叫什么名字、缩写是什么上却忽略了这个寄存器在指令执行的哪个阶段被写入、哪个阶段被读取。前者是死记后者才是理解。等你把活跃阶段搞清了寄存器的名字自然就记住了。1.2 功能维度与物理维度两条线搭出CPU全景教材对CPU的叙述通常有两条线。功能维度上CPU要做四件事指令控制、操作控制、时间控制、数据运算。前三条统称控制功能第四条是运算功能。物理维度上对应的就是两位主角控制器CU负责生成控制信号并决定时序运算器负责真正算数运算器的核心是ALU。除了这两个大件还有一组工作寄存器它们同时服务于运算器和控制器。用生活化的说法控制器是指挥小组发号施令ALU是施工队实际干活寄存器是工具台和料仓放半成品和原料而主存是远处的大仓库每次取料都要通过总线搬运耗时最长。这样一比喻访存慢这个后面反复出现的话题就有了直觉基础。学完这一章时你脑子里应该有一张全景图控制器指挥寄存器中转ALU运算主存供给总线连接。这张图越大越清晰后面学指令流水线、中断和并行越省力。2. 寄存器体系CPU内部的工作台和中转站2.1 先按是否可见分类再按活跃阶段记忆寄存器可以从两个角度分类两个角度都要用上。第一个角度是程序员能否看得见通用寄存器、PC、PSW这些是用户可见的汇编指令能直接引用MAR、MDR、IR这些是透明的程序员不感知但CPU干活时它们跑得最勤。第二个角度更关键是在指令执行的哪个阶段被写入、哪个阶段被读取我称它为活跃阶段。为什么活跃阶段重要因为第六章和后续章节的很多考题都建立在某个阶段该动哪个寄存器上。比如取指阶段的动作基本固定PC→MAR→主存→MDR→IR同时PC自增。执行阶段才轮到通用寄存器和ACC。如果你把这两个阶段混在一起画数据通路图时就会把箭头连错。我辅导时遇到的大多数连线错误追根溯源都是这个阶段感没建立起来。2.2 七个必须脱口而出的寄存器下面这张表把这一部分的核心寄存器汇总了一下重点看右侧的活跃阶段一栏寄存器缩写核心职责活跃阶段程序计数器PC保存下一条指令的地址取指阶段被自增指令寄存器IR保存当前正在执行的指令取指阶段写入后续阶段保持地址寄存器MAR保存本次访问主存的地址访存类操作数据寄存器MDR暂存从主存读出或写入主存的数据访存类操作累加寄存器ACC保存ALU的一个操作数与运算结果执行阶段通用寄存器R0~Rn保存操作数、地址、中间结果执行阶段状态寄存器PSW记录运算结果的标志如Z、N、C、V执行阶段更新建议不要把这张表当字典背而是当剧本读PC把地址交给MARMAR通过地址线找到主存单元主存把内容送到MDRMDR再把数据交给IRIR里的操作码部分送给控制器判断该做什么地址码部分重新送回MAR准备取操作数操作数经MDR进入ALU和ACC里的旧值相加结果写回ACC同时更新PSW。这套流程走两遍表格里的每一行都有了位置感考试时顺着流程推理就行。2.3 取指后PC到底加几一个总被问错的细节取指阶段结束时PC会被修改以便指向下一条指令。教材里常说PC加1这个1不是抽象意义上的数字1而是一条指令的存储单位数。在按字节编址的机器中若一条指令占4字节PC实际增加的就是4若采用变长指令增量还要根据每条指令的实际长度计算。很多同学机械地做1运算一到地址计算题就翻车。这里有一个判断技巧PC修改的目标永远是下一条指令的地址而不是当前地址加固定值。记住这句话无论是定长指令还是变长指令、顺序执行还是跳转都能从语义上推出正确的值。另外注意模型机里常在取指阶段结束时就把PC改好这样当前指令还没执行完下一条指令的地址已经就绪取指部件一腾出空来就能立刻开始下一轮取指不必再额外等一个周期。3. ALU的构成与运算原理运算功能是怎么落地的3.1 ALU为什么是组合逻辑而不是时序逻辑ALU的全称是算术逻辑单元它本质上是组合逻辑电路。组合逻辑的特点是输出只取决于当前输入输入一变经过一段门电路延迟后输出自动稳定不需要时钟触发。这和我们前面学的寄存器完全不同——寄存器必须在时钟边沿才能把输入锁存进内部是时序逻辑。这个区别看似基础却是很多人的认知盲区。遇到ALU要不要时钟这种判断题答案是否定的。需要时钟的是ALU输出端的寄存器它们负责把运算结果在合适的节拍锁存下来。如果把ALU当成时序部件后面学流水线时就会产生一连串误解比如想不通为什么组合逻辑路径可以成为流水线的瓶颈。记住运算随时在发生只有把结果稳定地存下来并送到该去的地方才是时钟要管的事。3.2 加法器是ALU的地基从一位全加器到超前进位ALU能做的运算很多但最核心的是加法。减法本质上是取补码相加乘除法在简单模型机里也常被分解为移位加移位减逻辑运算则是对每一位独立做与、或、非。可以说加法器是ALU的地基。最基本的加法器是一位全加器它有被加数、加数和低位进位三个输入输出本位和以及向高位的进位。把n个一位全加器按进位方向串起来就是行波进位加法器。它的优点是电路简单每一位的进位输出接到高一位的进位输入像多米诺骨牌一样一级级传上去。缺点是延迟随位数线性增长32位加法进位可能要传32级这在早期CPU里是实打实的时间开销。所以实际CPU会用超前进位思路不等待低位进位慢慢传而是用逻辑电路直接算出每一位需要的进位。代价是电路规模变大、布线变复杂换来的却是进位几乎并行产生延迟大幅缩短。这就是用硬件复杂度换时间的典型例子。学到这里值得停下来回想一下第一章讲过的性能来自哪里——CPU内部这些看似微小的改进累积起来就是整机性能的天壤之别。3.3 标志位与进位/溢出的经典考点ALU每做一次运算除了结果还会顺带产出几个状态标志最常用的是进位标志C、溢出标志V、零标志Z、负标志N。这些标志写进PSW供条件转移指令判断。这也是控制器输入中状态条件的来源。这里的经典考点是进位和溢出的区别。考虑无符号数加法最高位向上有进位就说明结果超出表示范围这是进位C的意义而溢出V针对的是有符号数两个同号数相加、结果符号变反说明溢出。更严谨的硬件判据是比较符号位进位和最高数值位进位两者不同则说明溢出。举两个例子4位补码范围是-8到7计算71结果是8超出范围符号位从正变负溢出而无符号数151结果16超出4位范围进位C被置位但对补码来看这相当于-11没有溢出V不置位。把这两个例子亲自算一遍考试再遇到就稳了。4. 指令执行的数据通路一条加法指令的完整旅程4.1 为什么要用阶段而不是瞬间看CPUCPU执行一条指令不是一个原子动作而是一串有序阶段。教材把这条时间线分成取指周期、间址周期、执行周期、中断周期等每个周期又被拆成若干时钟节拍。很多人背得住指令周期若干机器周期机器周期若干时钟周期这句话但不知道为什么要分这么多层。其实这套分层是历史和实践共同塑造的。早期CPU的速度由访存速度主导访问一次主存的耗时被定义为一个机器周期因此取指、访存各占一个或几个机器周期而纯粹的ALU运算可能只占一个时钟周期。控制器的节拍发生器按机器周期切出不同时刻的控制信号指挥各个部件按顺序动作。不理解这层时序三层结构控制器那部分就很难入门——控制器本质上就是在正确的节拍上给出正确的信号。4.2 单地址加法指令的五步执行分解现在拿最简单的模型机指令开刀指令格式是操作码地址码功能是把内存某单元的数值加到累加器ACC。完整执行过程可拆成五步第一步取指。PC内容送MARCPU向主存发读命令主存从该地址读出指令送入MDRMDR再把指令送到IR。与此同时PC自增指向下一条指令。第二步译码。控制器根据IR中的操作码判断出这是加法指令明确后续要访存取操作数。第三步取操作数。IR的地址码字段送MAR再次发读命令主存把操作数读出到MDRMDR将其送往ALU的一个输入端。第四步运算。ALU将ACC送来的旧值和MDR送来的操作数相加结果送回ACC。第五步更新状态。根据运算结果设置PSW的Z、N、C、V标志。这五步里PC只在第一步被改过一次此后直到下一条指令取指前都不动IR在第一步被写入后保持整个执行阶段下一条指令取指时才被覆盖。这两个时间特征就是前面表格里活跃阶段的由来。建议各位自己把这五步画成数据流图重点标出每一步哪些连线是活跃的画完再对比教材比默读十遍都管用。4.3 访存次数决定指令时间从数据通路看性能注意第三步也是一次访存这说明一条加法指令至少访问两次主存一次取指令、一次取操作数。如果采用间接寻址还要再多一两次访存。指令周期因此主要由访存次数决定而不是由运算复杂度决定。这就是为什么教材总说寄存器寻址快、直接寻址次之、间接寻址慢——本质就是在数访存次数。在真正的CPU里指令预取、Cache和多级存储体系都是为了缩短访存这段等待。从第六章开始你会反复遇到一个思维模式任何指令执行时间都能拆成取指时间访存操作数时间运算时间写回时间其中访存部分通常最大。带着这个视角去看后续的指令系统和存储系统章节很多结论都不再需要硬背自己就能推出来。5. 控制器凭什么知道每一步该干什么5.1 控制信号与节拍控制器的输入和输出控制器要解决的只有一个问题在正确的时刻向正确的部件送出正确的控制信号。为了实现这一点它的输入有三类指令的操作码告诉我们这条指令要做什么、节拍发生器送来的时序信号告诉我们现在处于哪个阶段、以及状态条件比如ALU的进位标志告诉控制器上一步的结果是什么特征。输出则是给各部件下发的控制信号比如寄存器写使能、ALU运算选择、主存读写命令、PC写入使能等。把这三类输入一列就能看出控制器不是一个孤立部件而是整个CPU的神经中枢。ALU负责算寄存器负责存控制器则负责让它们在对的时刻互相配合。学习时可以尝试给每一个主要部件列一张控制信号清单比如寄存器什么时候允许写入、ALU选用哪种运算、总线上谁驱动数据这样会把控制器从玄学变成查表问题。5.2 硬布线控制器的查表本质实现控制器有两种主流路线。第一种叫硬布线控制器也叫组合逻辑控制器。它的本质是把操作码节拍通过译码器、门电路、触发器组合成各个控制信号相当于一张用硬件焊死的真值表满足哪些条件某个信号就有效。优点是快门电路延迟很短缺点是改指令功能就要改硬件设计周期长、灵活性差。硬布线控制器的设计思路值得细品先列出每条指令在每个节拍需要的控制信号再归纳出每个信号的逻辑条件最后用门电路实现。这一步正好把数字电路课程里学的译码器、多路选择器、卡诺图化简全部用上了。很多同学在这一章第一次体会到原来数字电路的每个知识都有地方用这也是第六章最有魅力的地方。如果设计题考到某个控制信号的表达式记住它的条件由机器周期节拍操作码状态条件共同组成按这个框架列真值表就不会漏。5.3 微程序控制器的编程化思路与两者取舍第二种路线是微程序控制器。它不动用大量门电路而是把每条机器指令对应的控制信号序列预先写进一块控制存储器。每条机器指令对应一段微程序执行时逐条读出微指令微指令的字段直接对应要打开或关闭的控制信号。修改指令功能时只需改写控制存储器的内容不必重做硬件。用类比来说硬布线像专门铺设的铁轨列车只能沿既定轨道飞奔速度可观但改线要大工程微程序像城市道路上的导航驾驶路线可以随时调整但每到一个路口都要停下来读路牌、做决定多花时间。从四个维度对比更清楚对比维度硬布线控制器微程序控制器速度快门电路延迟短慢每步要读微指令灵活性差改功能要改硬件好改控制存储器即可结构规整度不规整逻辑分散规整便于设计与调试维护与升级困难容易可像软件一样修改实际CPU常混合使用两者出现频率高、要求快的指令用硬布线复杂少用的指令用微程序这就是毫微程序和混合控制这些概念的出发点。第六章1阶段只要能把硬布线和微程序在速度、灵活性、结构规整度、可维护性四个维度上的取舍说清楚就已经达标了。6. 这一部分的五类高频误区与两个自查练习6.1 五类反复出现的高频错误我把这几年辅导中反复出现的理解偏差整理成五类如果你连中两条以上说明还需要回头过一遍第一把IR和PC搞反。IR装的是当前正在执行的指令PC装的是下一条指令的地址。判断口诀只有一句IR属于现在PC属于将来。第二认为取指后PC加1一定加数字1。实际上加的是一条指令所占的存储单位在按字节编址、指令定长4字节的机器上就是加4。遇到地址计算题先确认指令长度再动手算。第三把ALU当成时序逻辑。ALU不需要时钟结果是输入稳定后经过门延迟自然稳定的。需要时钟的是它后面的输出寄存器。第四低估MDR的缓冲角色。MDR只是CPU与主存之间的中转站负责暂存一次读写的数据没有长期保存数据的职责。理解这一点画数据通路时才不会把MDR和通用寄存器混为一谈。第五把指令周期机器周期时钟周期三个词混用。正确的包含关系指令周期由若干机器周期组成机器周期由若干时钟周期组成。访存型机器周期通常占多个时钟节拍纯运算往往只占一个节拍。6.2 两个不用背就能学透的自查练习与其反复读教材不如做两个动手练习。第一个合上书凭记忆画出模型机的数据通路图至少包括PC、IR、MAR、MDR、ACC、ALU、CU以及它们之间的连线然后顺着一条取数指令标出每一步数据流向。画完和教材对比凡是连错的地方就是没懂的地方而且通常不是某个部件不认识而是阶段时序没搞清。第二个找一个教学用的CPU模拟器很多经典教材配套的网站上都有或者课程实验环境里带的单步执行一段只有四五条指令的小程序每执行一步就观察一次寄存器和内存变化把它和你画的流程图逐行对照。这里会有一个意想不到的收获你会发现真实模拟器的节拍比纸面上更细比如同一个机器周期内的控制信号还有先后之分。这正好帮你建立微操作的概念为下一部分学控制器实现打基础。如果课程还没安排实验自己找模拟器走一遍也完全够用——这一步的收益远大于多刷十道选择题。6.3 三个检验过关的问题和一个收尾技巧学完第六章1你应当能不看书回答三个问题CPU由哪些部件构成每个部件的功能是什么一条指令从取指到执行经历了哪些阶段每个阶段有哪些寄存器在变化控制器凭什么知道每个时刻该做什么它的输入输出分别是什么能流畅答出来这部分就算真正过关了。最后分享一个我自己的收尾技巧每学完一个部件就单独画一张以它为中心的关系图比如以ALU为中心标出它的输入来自哪里、输出送到哪里、控制信号从哪来、标志位送到哪去。这种单部件关系图画完再和整机数据通路图对照理解就会特别牢固。下一部分开始进入微指令、流水线和中断时你手里的这套部件关系网就是你最可靠的地图。
阅读完成 · 觉得有帮助?
咨询建站