
最近在准备计算机考研复试今天已经是连轴转的第八天。早上七点半把闹钟按掉的时候脑子里还在回放昨晚背的Cache替换算法这种状态想必每个考研人都懂。Day8我没有继续刷操作系统而是把大头留给了计算机组成原理原因很简单翻了几所学校的复试真题之后发现这门课几乎是无差别覆盖的高频考点面试官也特别喜欢拿它当连环追问的素材。这篇笔记适合所有正在准备计算机考研复试、保研机试或者期末突击的同学参考尤其是对“数字逻辑组成原理”切换不过来、看到加法器就犯迷糊的人应该能少走不少弯路。1. 复试Day8我把主攻方向压在了“计算机组成原理”1.1 复试为什么绕不开计算机组成原理很多学校复试笔试的专业课是三选一甚至五选一看起来可以挑软柿子捏但面试环节没法挑。计算机组成原理这门课的特殊之处在于它是连接硬件和软件的那座桥几乎所有面试官都默认你应该懂。操作系统里的进程切换底层靠的是中断和时钟编译原理里的指令生成最终落在指令系统的设计上哪怕是做AI方向聊到算力、GPU、异构计算也能扯到存储层次和流水线。所以你越是说自己方向偏应用面试官越可能拿组成原理来试探你的底线。另一个现实原因是复试准备时间普遍只有一两个月别说把五门课都吃透能稳住两三门就算不错。组成原理的考点相对固定数据表示、运算器、存储器、指令系统、CPU、总线与I/O翻来覆去就这些。相比操作系统的主观题和大题组成原理的题目更“讲道理”推得出就是推得出不太容易出现背了书还是不会写的情况。Day8我给自己定的目标就是把数据表示与运算器这一块彻底拿下顺带在Quartus里把加法器真正搭出来。1.2 今天的学习路线与时间安排我的复习习惯是上午啃硬骨头下午做题验证晚上整理错题和笔记。Day8的时间表大概是这样8:30-10:30 原码、反码、补码、移码以及补码加减法与溢出判断配合王道和唐朔飞的教材对照看10:30-12:00 全加器逻辑表达式、串行进位、组间串行进位、并行进位把所有进位公式亲手推一遍14:00-17:00 Quartus原理图实验搭4位加法器并做功能仿真19:00-21:30 计算机系统结构与操作系统的高频计算题主要是Amdahl定律、流水线参数、页面置换缺页次数21:30-22:30 简历与调剂信息整理这份时间表有两点我要特别说第一下午一定要动手做实验复试材料里如果有课程设计或者硬件实验经历面试的时候就有东西可聊第二晚上留出固定时间处理调剂与信息搜集别等到一志愿出结果再手忙脚乱调剂拼的就是信息差。2. 数据表示与运算面试官问得最细的一块2.1 原码、反码、补码用三个例子彻底讲明白数据表示这块很多同学是背结论的“正数的原反补相同负数的反码是符号位不变其余取反补码是反码加一。”背结论能应付选择题但复试面试时面试官会让你现场算还会追问“为什么补码能多表示一个数”。我Day8重新推导了一遍发现用机器字长8位举例子最直观。先看正数比如19符号位0数值部分0010011所以原码00010011反码00010011补码00010011再看负数-19。原码的符号位变1得到10010011。反码是符号位不动数值位取反得到11101100。补码在反码基础上末位加1得到11101101。这里最容易出错的是负数的补码转回真值。很多同学习惯“先减一再取反”其实更快的办法是从右往左找到第一个1这个1左边所有位取反符号位不动。比如11101101最右边的1在第0位那它左边取反得10010011读出来就是-19。这个技巧笔试和面试都适用手算速度能快一倍。至于“为什么补码能多表示一个数”关键在-128。8位原码和反码能表示的范围是-127到127因为10000000和00000000都表示0出现了正负0的浪费。补码把10000000定义为-128所以范围变成-128到127。具体推导是补码的模是2^8256。比如求-128因为-128 128 - 256而128的二进制是10000000所以-128的补码就是10000000。这个推导在面试时说出来比单纯报结论有说服力得多。2.2 补码加减法最容易被追问的溢出判断补码的加减法规则简单按二进制相加符号位自然参与运算舍去最高位进位即可。比如计算-19加上28-19的补码1110110128的补码00011100相加11101101 00011100 1 00001001舍去进位00001001也就是9这个例子能看出补码把减法变成了加法硬件上只需要一个加法器就能同时处理加减这就是补码设计的核心动机。但面试官绝不会止步于此必问的下一句是“怎么判断溢出了”我整理了三种方法自己最推荐的是“双符号位法”。先说单符号位法。两个同号数相加如果结果符号变了那一定溢出。比如8位补码里120加12001111000加01111000等于11110000结果是-16两个正数相加反而得到负数显然溢出。但单符号位法对“异号相加不会溢出”的表述不够严谨而且面试官往往会追问一句“符号位进位和最高位进位不同会发生什么”。更严谨的是进位异或法。设符号位进位为C_out最高数值位进位为C_n-1如果C_out和C_n-1不同则溢出。还是刚才的例子01111000加01111000最高数值位第6位相加产生进位1符号位相加也产生进位1两者相同看起来没溢出。但这不对啊这里我踩过坑。实际上8位补码的“位下标”要看你怎么数。用从低位到高位的下标更清晰设第7位是符号位第6位是最高数值位。120加120时第7位到第0位分别是01111000。第6位1加1得0进位1第7位0加0加进位1等于1符号位进位为0。所以C_n-11C_out0两者相异溢出。这就对了。面试时干脆用双符号位法最不容易翻车。双符号位法也叫变形补码计算时在符号位前额外加一位。8位补码演变成10位存储比如120变形补码001111000两个符号位00两个相加001111000 001111000 011110000结果两个符号位是01说明正溢出。如果是10说明负溢出。两个符号位相同00或11则无溢出。这个方法笔试时多写一位就行面试解释起来也顺因为面试官能立刻看出你学过教材中的“模4补码”。3. 组间串行进位与先行进位加法器从公式到电路3.1 全加器与进位链面试问运算器很少直接问“你画一个全加器”但一定会问“加法器为什么慢”“串行和并行进位区别在哪”。要回答清楚得先回到全加器。全加器有三个输入本位两个加数A_i、B_i以及来自低位的进位C_i-1两个输出本位和S_i以及向高位的进位C_i。逻辑表达式是S_i A_i ⊕ B_i ⊕ C_i-1C_i A_i·B_i (A_i ⊕ B_i)·C_i-1这里可以做一个巧妙变换。定义两个信号生成函数 G_i A_i·B_i传递函数 P_i A_i ⊕ B_i于是进位表达式简化为C_i G_i P_i·C_i-1G_i的意义是“我这一位无论如何都会产生进位”P_i的意义是“我这一位可以把低位的进位传递上去”。这两个信号是整个进位链分析的起点面试时先写出这个再谈并行进位思路会很顺。如果只是把一个个全加器级联起来也就是C_i接到下一个全加器的C_i-1就得到行波进位加法器英文叫Ripple Carry Adder。它的致命问题在于进位像波浪一样从低位逐步传到高位16位加法器最坏情况下要经过16个全加器的进位延迟。我当年第一次听到“行波进位慢”只觉得是一句考点话直到在Quartus里把8位行波加法器的仿真波形展开看到最高位的和迟迟不跳变才真正理解了“进位链是性能瓶颈”这句话。3.2 4位先行进位逻辑推导行波进位慢是因为每一位的C_i必须等C_i-1算完。要提速思路是让进位“提前算好”这就是先行进位加法器Carry Lookahead AdderCLA。把C_i G_i P_i·C_i-1逐层展开。设最初始进位为C0对4位展开C1 G1 P1·C0C2 G2 P2·G1 P2·P1·C0C3 G3 P3·G2 P3·P2·G1 P3·P2·P1·C0C4 G4 P4·G3 P4·P3·G2 P4·P3·P2·G1 P4·P3·P2·P1·C0仔细观察C4的表达式里每一项的G和P都来自输入A、B不依赖任何中间进位。意思是只要A和B稳定下来C1到C4都能通过组合逻辑直接算出来不用一级一级等。这就是“并行”的含义。我不建议死背这四个式子背了也会忘。我自己的推导思路是C_i等于“从i到1所有可能产生进位并一路传到我这的位置加上从C0一路传过来的情况”。说得口语点任何一个低位的G_i都能“生”一个进位并且如果后面所有位的P都是1这个进位就能“穿透”到当前位如果C0是1且所有P都是1它也能穿透过来。这样理解就算考试让你写8位甚至16位展开式也能现推。3.3 组间串行、组内并行的16位加法器结构单个4位CLA能做4位并行进位那16位怎么办两个方案。第一个方案叫单级先行进位结构是“组内并行、组间串行”。把16位拆成四组每4位做一个小CLA组内并行产生C4、C8、C12、C16但第一组的C4要作为第二组的初始进位C0第二组的C8再作为第三组的C0以此类推。这就是热词里提到的“组间串行进位”。它比纯行波快因为组内不用逐位等进位组间还是串行的所以叫做单级先行进位。第二个方案叫多级先行进位在组间也引入一组CLA逻辑专门用来同时算出C4、C8、C12、C16。教材里对应的是74182先行进位发生器芯片。这时候16位加法器的延迟不再是四段串行而是所有组可以同步进行组内运算速度更快代价是逻辑规模和芯片引脚复杂度上升。复试问答到这里基本就是标准套路链行波进位为什么慢 - CLA怎么改进 - 16位怎么做 - 组间串行和组间并行的取舍。能把这个链路完整讲清楚比背十个名词解释都管用。4. Quartus原理图实验今天把加法器真的搭了出来4.1 实验环境与建工程步骤光推公式不够踏实Day8下午我在Quartus里把4位串行进位加法器和4位CLA都搭了一遍。很多人复试材料里的“课程设计”写的是单片机或者Web项目硬件描述类实验很少有人主动提可一旦提了面试官眼睛会亮。我用的环境是Quartus II 13.0sp1因为很多学校的计算机组成原理实验课件还是基于这个版本。新版Quartus Prime Lite也能用但界面变化大新手按旧教程操作容易找不到入口。建工程的标准流程File - New Project Wizard工程名不要用中文路径也不要有中文和空格器件型号直接选Cyclone IV E系列下的EP4CE6F17C8这是很多开发板用的片子EDA Tool Settings页面可以跳过后面仿真直接再用Quartus自带的Simulator新建Block Diagram/Schematic File后缀是.bdf这里有个隐藏坑工程的顶层实体名必须和顶层文件名一致否则编译报“Top-level entity not found”。我第一次建工程顺手把文件命名成sche1.bdf工程名却是adder16编译直接红一片后来统一改成adder16才过。4.2 用原理图搭4位加法器的关键步骤在原理图里搭加法器核心就是调元件、连线、命名引脚。Quartus原理图文件空白处双击会弹出Symbol窗口从primitives下拉菜单里找logic目录下and2、or2、xor、notpin目录下input、output全加器需要两个异或门、两个与门、一个或门。表达式S_i A xor B xor Cin需要两个异或串联C_i (A and B) or ((A xor B) and Cin)需要先算A xor B再和Cin相与最后和A and B相或。我自己用元件搭全加器时顺序是放置两个xor第一个xor的输入是A和B输出接第二个xor的一端另一端接Cin放置一个and2输入A和B输出接or2的一端放置另一个and2输入第一个xor的输出和Cin输出接or2的另一端为了命名清晰给每个输出都加output引脚搭一个全加器后整体复制三份把每一级的Cout垂直连到下一级的Cin就是4位行波进位加法器。这个连线过程看起来简单但很容易把P和G的线接错。我的习惯是每连一根线就给网络命名比如c0、c1编译时如果出现wire dangling的警告就能凭名字快速定位。4.3 仿真验证与踩坑记录搭建完成只是第一步复试里讲实验一定要能说“我验证过了”。Quartus里做功能仿真的步骤是编译通过后File - New - University Program VWF新建矢量波形文件在波形编辑区右键Insert Node or Bus找到编译出来的输入输出端口把A[3..0]、B[3..0]、Cin、S[3..0]、Cout全部加进去给输入设激励。简单办法是把A和B设成计数信号Cin设成时钟运行功能仿真前必须先在Simulator Tool里选Functional然后点Generate Functional Simulation Netlist生成功能网表点Run Functional Simulation查看波形我今天踩了三个坑写出来给你们避雷。第一个仿真波形全是X或者全是U原因通常是输入端有引脚没连接悬空输入在功能仿真里会变成未知态。第二个仿真结果输出的是一个毛刺一样的窄脉冲检查后发现是选成了时序仿真但没做时序约束功能仿真才是验证逻辑正确性的最快路径。第三个文件命名问题波形文件保存时如果和工程名不一致Quartus会提示找不到仿真对象直接报错保存成工程名同名文件最省事。对方波形的验证方式也分享一下加法器功能仿真最直观的激励是让B固定为0001A从0000计数到1111这样S正好是A加1逐次递增Cout只在1111加1时拉高一次。波形上能看到S的节奏和Cout的变化一眼就能确认电路逻辑没接反。这种“设计可验证的激励”的思路面试时讲到会显得实操经验很足。5. 系统结构、操作系统与复试的“高频暗箭”5.1 计算机系统结构流水线三个计算必须会Day8晚上我把系统结构里最常考的流水线计算重新过了一遍。复试题目很少直接让你默写五段流水线但特别喜欢在面试里给一组参数让你心算加速比。流水线的核心公式是k段流水线执行n条指令的总时间T_k (kn-1)×时钟周期。吞吐率TP n/T_k最大吞吐率趋近于1/时钟周期。加速比S n×k/(kn-1)当n远大于k时S趋近于k。举个例子4段流水线执行100条指令T (4100-1) 103个时钟周期加速比 100×4 / 103 ≈ 3.88面试官可能会追问“为什么不是刚好4倍”。答案是有建立时间流水线开始前k-1个周期是空泡最后k-1个周期在排空总共多出(k-1)×2个周期的边际开销但因为n远大于k这部分占比很小。这个“为什么要算平均CPI而不是直接报理想值”的逻辑是面试加分点。Amdahl定律也是高频计算题。公式是加速比 1 / ((1 - 可改进比例) 可改进比例 / 改进倍数)举个例子某个运算占总执行时间60%把它加速到原来的4倍整体加速比 1 / (0.4 0.6/4) 1 / 0.55 ≈ 1.82我早年间看到公式很晕后来总结成一句人话加速后的执行时间等于“没法改进的那部分时间”加上“被改进部分缩水后的时间”。这句话面试时说出口面试官往往就点头了因为这是真理解不是背公式。5.2 操作系统从概念背诵升级到场景分析Day8我没系统过操作系统全书但把最容易在面试中出事的几个点拎出来做了卡片化整理。第一是死锁的四个必要条件以及如何破坏每个条件这个几乎必问而且面试官会现场给一个场景问“这是哪种死锁”。第二是银行家算法的安全性检查流程虽然笔试考的概率下降但作为操作系统里少见的“算法类”考点面试时能现场推一遍会加分。第三是虚拟内存与页面置换最常考的是给一个访问序列算FIFO和LRU的缺页次数。比如访问序列3、1、2、1、3、4、2、4物理块3帧。FIFO在第二次访问4时会淘汰3缺页次数明显比LRU多。板书的计算过程要慢别跳步面试官就是看你的做题习惯是否规范。操作系统这块还有一个隐蔽考点是“进程调度算法”的选择题式问答比如“什么场景适合短作业优先什么场景适合时间片轮转”。我的答法是先列指标周转时间、响应时间、吞吐量然后说短作业优先对周转友好但饿死风险大时间片轮转响应友好但上下文切换开销高。这样从指标出发的答案不容易被追问死。5.3 计算机发展史冷知识莱布尼茨轮式计算机热词里有一个“莱布尼茨轮式计算机”我正好在晚上复习计算机发展史时扫到。别小看这类冷知识面试官问“说说你了解的早期计算机”时能接住的人不多。莱布尼茨轮式计算机是莱布尼茨在1673年前后设计的机械计算器核心机构是“步进轮”用一组长度不同的齿柱参与计数从而实现了机械乘法这是对帕斯卡加法器“只能加减”的重大改进。面试时提到这个知识可以顺势引出你对“机械计算-电子管-晶体管-集成电路”这条演进线的认识也能自然聊到图灵机和冯·诺依曼结构。这类问题虽然不难但答得出彩的关键是“有名字、有年份、有细节”而大部分人只停留在“听说过”。6. 考研复试与调剂的实操建议6.1 复试笔试、口语和机试怎么安排今天是第8天离很多学校出复试通知大约还剩两三周时间分配必须从“广撒网复习”切到“面向真题冲刺”。我个人的节奏是笔试科目按历年真题的出题频率排序高频考点优先英语口语不用花太多时间背几十个话题准备自我介绍、毕业设计介绍、为什么选这个学校、未来研究方向这四段就够每段控制在90秒以内。机试如果还在犹豫要不要准备我建议至少刷60道基础题重点放在“输入输出处理、数组、字符串、排序、简单数据结构”。很多学校机试难度不高但有一个共同特点不能用IDE调试或只能本地调试现场环境陌生平时不练很容易卡在“怎么读一行的整数”这种低级问题上。机试成绩是硬通货复试分数拉不开差距时机试能救命。6.2 调剂信息搜集和邮件沟通说到调剂很多同学心里抗拒但我Day8晚上做信息整理时的体会是调剂不是备胎而是信息战。关键是建立自己的信息表按“学校、学院、专业方向、去年调剂名额、去年调剂复试线、是否有预调剂系统、导师研究方向、联系方式来源”逐项填写。邮件沟通方面我的建议是标题写“考研调剂申请-本科XX大学-初试总分XXX-报考专业-姓名”正文控制在200字以内突出三个信息点初试成绩各科分数、本科期间与目标方向相关的课程或项目经历、为什么想调剂到这个学校。不要群发同一封邮件那会被一眼看穿。发送时间选在工作日上午9点到10点邮件被认真阅读的概率最高。这个阶段容易焦虑但焦虑帮不了任何忙。我的习惯是每天固定时段查一次消息其他时间把手机放在够不着的地方用番茄钟把复习切块。调剂信息不会因为你多刷五分钟手机就多出来复试分数却会因为这一周的时间利用而拉开差距。Day8从早上的补码推导到下午Quartus里亲手搭出加法器再到晚上整理调剂表格最大的感受是复试到最后拼的不是谁记得多而是谁能在有限时间内把高频考点转化为真正的理解。组间串行进位和CLA的逻辑今天推了一遍下周还要用Verilog再写一遍软件描述和原理图描述结合起来才算真的吃透。如果你这两天也在准备复试建议也试一下“先手推公式再动手搭电路”的组合亲测比单纯刷题印象深刻得多。