ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从补码到MIPS运算器:计算机组成原理实验通关实战指南

从补码到MIPS运算器:计算机组成原理实验通关实战指南 先交代个背景我是华科计算机系的老学长当年被计组实验折腾得死去活来从第一次接触Logisim时的满脸懵到后来能对着MIPS单周期CPU的连线图淡定排错中间踩过的坑能写满一本实验报告。这个题为“华中科技大学计算机组成原理实验通关秘籍”的帖子就是冲着这门课最硬核的几个实验来的——8位加减法运算器、组间串行进位、还有压轴的MIPS运算器设计。如果你正准备选这门课或者已经在上课但被实验折磨得怀疑人生这篇指南就是给你准备的。计算机组成原理这门课理论部分确实抽象什么定点数、浮点数、ALU、寄存器堆教材里写得云里雾绕。但实验课完全另一种体验你得亲手把这些逻辑搭出来用线和门电路说话。8位加减法不是为了让你会做加法而是让你理解补码、进位、溢出这些概念在硬件上长什么样。MIPS运算器实验更离谱一根线接错整个功能就全乱了而且Debug起来比写代码痛苦多了——代码报错还有行号提示硬件连错了只给你一个高电平鬼知道是哪个门出了问题。这篇文章我会把从最简单到最复杂的运算器实验完整拆开把每一步的原理、连线方法、排错技巧都交代清楚保证你看完能少走一大半弯路。需要提前说明的是我讲的版本是华科用的那套基于Logisim的实验环境不同学校可能用别的软件比如Digital或者自研的EDA工具但核心逻辑是相通的——都是搭数据通路、验证控制信号。所以就算你的实验平台和我用的不一样这里面的思路照样能复用。1. 内容整体设计与思路拆解从8位加减法到MIPS运算器这门课到底在练什么1.1 三个实验的递进关系为什么先从8位开始最后却要上MIPS我把华科计组实验里涉及运算器部分的路线图先梳理一下。整个实验不是孤立的几个题目而是有一条非常明确的递进主线第一个实验是8位加减法运算器说白了就是让你用Logisim搭一个能算8位二进制加法和减法的模块。这个阶段允许你偷懒可以用加法器芯片甚至直接用运算组件核心目标是让你搞懂补码、进位和溢出的关系。第二个实验是组间串行进位的ALU扩展设计要你把多个4位ALU级联成16位或者32位理解组间进位是如何一级级传下去的。第三个实验是MIPS运算器设计这个就硬核了需要你按照MIPS指令集的要求设计一个支持若干条整数运算指令的算术逻辑单元并且处理好移位、比较、逻辑运算、溢出标志等细节。看到这你可能会问直接学MIPS不就行了为什么先做8位加减法说实话当年我也觉得前面的实验多余直到自己做MIPS运算器时卡在“加减法在不同指令格式下的操作数选择”上才意识到前面打下的基础有多重要。8位加减法练的是最小闭环输入——运算——输出你在这期间掌握的进位、溢出判断方法是所有后续大实验的地基。组间串行进位练的是怎么把单个小模块按规则拼成大的系统这简直就是在模拟真实CPU里ALU的扩展方式。到了MIPS运算器阶段你已经不是在“搭电路”了而是在设计硬件功能单元需要考虑指令语义、控制信号、数据格式这些更高层的东西。1.2 工具选型原理解析Logisim到底配不配当教学模拟器华科的实验基本都基于Logisim这个软件最初是Jon von Neumann奖得主、斯坦福大学的一个学术项目用来教学数字逻辑。它不像Vivado、Quartus那样要跑来跑去的综合、布线而是纯逻辑仿真特别适合验证电路功能。但这类模拟器有个问题太依赖鼠标拖拽连线稍多就觉得费劲而且大规模电路时性能会下降。我的建议是别嫌弃它。教学实验就是要你用最原始的门电路和器件搭东西逼你把手动布线练熟。等到了MIPS运算器实验你搭的电路可能有一两百根线这时候如果连Logisim的基本操作都不熟光是拉线就能把你整崩溃。常用的快捷键一定要提前背CtrlC/V复制粘贴CtrlShiftX调出仿真时钟CtrlR重置还有Logisim特有的“导线”工具快捷键就是画线选对工具能省一半时间。另一个必须掌握的技巧是使用“分线器”Splitter它能把一根多位的导线拆成若干根单线反之也能合并这在MIPS运算器里几乎是必需品——因为你的指令操作码是6位但立即数可能是16位你要从32位指令中抠出各个字段全靠分线器。2. 8位加减法运算器补码、进位和溢出的第一课2.1 实验要求与核心思路8位加减法运算器的实验要求通常是这样设计一个能执行两个8位二进制数加法和减法的模块输入A、B是8位控制信号是加减选择线输出是8位结果同时还要给出进位输出和溢出标志。有些版本还要求能输出Z标志结果为0。大多数初学者第一反应是减法不好做要借位干脆用减法器。但实验的真正目的就是逼你统一使用补码把减法变成“取反加一”的加法。这个方法在逻辑上无比简洁设有一个控制信号Sub如果Sub0就做加法如果Sub1就做减法。减法的实现方式是将B的每一位取反再把Cin设为1就相当于Alu做A加(~B1)。这样做的好处是整个运算单元只有加法器控制逻辑极其简单。2.2 关键细节溢出判断的两种方法实验报告写哪种都能拿分这是最有讲究的地方。8位有符号数的范围是-128到127如果两个数相加结果超过这个范围就发生了溢出。硬件的溢出标志怎么判断常用方法有两种第一种是观察最高位进位和次高位进位是否不同。如果Cin进入符号位的进位和Cout符号位产生的进位不相同则说明发生溢出。举个例子计算1271二进制A01111111B00000001加出来结果是10000000此时Cin1次位向符号位有进位Cout0Cin和Cout不同所以溢出标志置1。这个原理的本质是符号位进位和最高数值位进位不一致说明数值位越过符号位翻到了错误的一边。第二种方法是比较输入和输出的符号位。如果两个正数相加得到了负数或者两个负数相加得到了正数就是溢出。这种方法在硬件层面等价于第一种但如果你在电路里直接接出溢出标志通常用第一种更直观一个异或门。除了溢出标志进位输出Cout很多人也容易搞混。注意Cout是无符号数加法的进位它和溢出标志是两回事。即使发生了溢出Cout也可能为0比如正正超出127时符号位无进位Cout0但溢出1反过来Cout1时也可能没有溢出比如负数加负数符号位有进位但结果是负数没溢出。实验报告里一定要把这两个概念讲清楚判分老师很看重这个区分。2.3 实操连线步骤我第一次做时连连错三根线的教训具体在Logisim里搭这个电路的步骤我拆给你看拖入两个输入引脚分别命名为A和B位宽都设为8。拖入一个输入引脚Sub位宽1。拖入一个8位加法器Logisim的Arithmetic目录下有Adder组件也可以自己用全加器搭。Adder的A和B接A、BCin接Sub。在B和加法器B口之间插入一组受控反向器先用一个分线器把B拆开再对每一位接一个异或门异或门的另一个输入接Sub。这一步就是“B取反”的逻辑Sub1时每一位翻转Sub0时原样。这里最容易犯的错是忘记把B拆位直接把8位线和异或门连上——Logisim的异或门默认只接受1位输入所以必须先拆分。把加法器Sum输出接到输出引脚Result位宽8。溢出标志用两个引脚分别引出加法器的Cin和Cout接一个异或门输出命名为Overflow。注意加法器的Cin其实就等于进入最高位的进位Logisim的Adder组件本身就有Cin引脚和Cout引脚所以直接接就行。进位输出Cout直接从一个输出引脚引出命名为Carry。零标志Z用一个比较器或一个NOR门比较Sum的8位是否全0如果有0就输出1。如果你用比较器可以设置成“等于常数0”输出就是Z。我第一次搭的时候犯了个特别蠢的错把Sub信号既接到了加法器的Cin又接到了异或门的控制端但是异或门的控制端在Sub1时确实让B取反加1交给Cin这是对的可我不小心把一个异或门的输出接到了加法的错误位结果AB的结果变成了AB2排错花了一个晚上。后来养成的习惯是每接一根线先在标签上标清楚信号名再在脑子里过一遍“如果Sub1这条线应该是0还是1”。2.4 仿真验证与实验报告要点仿真的时候用输入引脚配合时钟信号或者按钮输入几组典型数据正正不超过上限例如1020结果30进位0溢出0。正正溢出例如1271结果0x80-128溢出1。负负正常例如-1-2用补码计算结果-3进位1溢出0。负负溢出例如-128-1结果-129溢出1。实验报告里我建议除了贴电路截图还要把真值表列一遍尤其是上面四组边界情况然后一定要附上你对“进位”和“溢出”区别的说明。这部分占分很高因为老师能从你的解释里看出你是不是真懂了。3. 组间串行进位连接小ALU理解“级联”这件事3.1 为什么会有组间串行进位直接全部并行不行吗当你把4位ALU扩展成16位或32位时如果你把高位的进位输入直接接低一位的进位输出一级一级传下去这就是组间串行。它的好处是你不需要额外电路把每一级的进位链串起来就行坏处是随着位数增加最高位的进位要经过很多级门的延迟速度很慢。教学中要求做组间串行是为了让你直观体会到延迟是怎么累积的也为后面讲超前进位提供对比素材。具体到华科实验常见的任务是先做好一个4位ALU实现加减、与、或、异或等功能然后将4个4位ALU级联成16位ALU观察进位传递过程。实验报告中要有延迟分析每一级4位ALU的进位输出C4到C8、C8到C12、C12到C16每经过一级就多了几个门级延迟最终C16的延迟是3倍的C4延迟。3.2 4位ALU的功能设计在做级联之前你得先有一个功能正常的4位ALU。通常要支持的操作有加法、减法、与、或、异或。控制信号可以用2位选择线00加法、01减法、10与、11或。再加一个功能控制信号来区分加减和逻辑运算不同题目要求不同。这里有个经验先规划好ALU输出总线和标志位再动手建子电路。建立子电路时一定要把输入输出引脚的顺序固定下来因为后面级联的时候你要按顺序连。我当时建立了一个名为“ALU4”的子电路引脚从左到右依次是操作控制M2(0)、M1(1)、M0(0)输入A[4]和B[4]进位输入Cin输出Result[4]和Cout还有一个Status位用于输出零标志。引脚顺序错了后面连线时你会频繁回头改。3.3 级联连线细节与常见翻车现场4个ALU4级联成16位其实机械操作很简单最高位的ALU4的Cout作为整个16位ALU的Cout最低位的ALU4的Cin作为整个16位ALU的Cin每个ALU4的M2、M1、M0控制信号都连到同一个输入因为是同一个操作A[15:12]接第4个ALU的A[4]依此类推。听起来不难吧但翻车全都翻在细节上。第一个常见问题位号错位。16位的A输入你需要用分线器把A[15:12]、A[11:8]、A[7:4]、A[3:0]分别引出如果分线器的顺序接反了那结果是几位反转的这种错很难肉眼发现。我的技巧是先给每一组输入输出用标签命名比如“AH_L”之类的然后顺着接。另外分线器的顺序可以调整默认是从高到低你可以在属性里反转顺序一定要仔细核对。第二个常见问题Cout和Cin的连错。最高位ALU的Cout连出去作为总Cout但内部级联的时候比如第一个ALU4的Cout必须接到第二个ALU4的Cin以此类推。如果你图快把Cout接到了下一级的控制输入上整个功能就全乱了。连线完成后用仿真跑典型数据用探针或者LED观察每一级ALU4的中间进位是否点亮。第三个常见问题标志位的地位。16位ALU的零标志Z应该判断整个16位结果是否为0。最直观的做法是把四组4位结果做“或”之后再取反或者用一个16位比较器。如果你只把最高位ALU4的Z当总的Z那是不对的——必须综合所有组的结果。这个很多人会忽略实验报告里要专门提出来。3.4 性能分析与报告怎么写才算到位你应该在仿真时测量关键路径延迟虽然Logisim里没有实际时序信息但你可以用布尔路径长度分析来估算。实验报告里要画出一张进位传递路径图不是mermaid是那种手绘示意图沿路径标注每一级的类型和传播链比如“第一级ALU4的C0-C4要经过1个全加器1个或门第二级C4-C8则需要在第一级基础上再经过一次最终C16一路经历了3次级联”。这些数据才是老师想看到的说明你真的理解了串行进位缓慢的原因。4. MIPS运算器设计全解析从指令集到硬件连线4.1 要做多少个指令每个指令带来什么硬件需求MIPS运算器实验的核心要求是设计一个支持一定指令集的32位ALU用于后续搭建单周期CPU。通常要求的指令包括add、addu、sub、subu、and、or、xor、nor、slt、sltu、sll、srl、sra、jr也许还有lui。不同年份题目不同但绝大多数指令是围绕R型指令格式和一部分I型指令格式。每个指令对硬件的要求可以拆开讨论add/addu加法结果和溢出标志按需设置addu忽略溢出。sub/subu减法和无符号减法加法器上做A~B1Sub控制线为1。and/or/xor/nor逐位逻辑运算。slt/sltu如果A B结果为1否则为0。这个指令比较有挑战要用减法再判断符号来得到结果而且有符号和无符号要分开处理。sll/srl/sra移位操作。这需要桶式移位器或者循环移位在运算器里通常加入专门移位单元。lui加载立即数到高位把16位立即数放到高16位低16位补零。它不经过加法器而是走一条立即数通路。归纳下来MIPS运算器内部大致分为四个功能块算术运算加减、逻辑运算与或异或非、比较运算slt/sltu、移位运算。最后再通过一个多路选择器按控制信号选择最终输出。你还要决定如何设置标志位zero、carry、overflow等它们会用于分支跳转指令。4.2 核心决策有符号无符号到底怎么区分业界常说的“有符号加法和无符号加法在二进制形式上完全一样”这个观点在算术层面是对的但在标志位逻辑上有区别。对于add和addu区别在于溢出标志的生成add要看有符号溢出addu不关心溢出。sub和subu同理。slt和sltu的区别就大了slt将两个数当作有符号数比较sltu按无符号数比较。有符号比较的实现方式常见的两种第一种是用减法器求A-B然后看结果的符号位。如果是slt并且A-B的结果为负最高位为1则slt结果为1但如果出现溢出符号位就不可信了所以要检测溢出在溢出时反过来如减负得正溢出时结果符号位是1但实际上是AB溢出后符号位反而变反了。最稳妥的做法是用布尔公式Result (A[31]~B[31]) | (A[31]^B[31])Result_negative? 涉及逻辑量很大新手容易错。另一种做法是直接用两个补码做减法然后根据加法器输出的最有效位再结合溢出标志做修正即“如果溢出标志为1结果符号位取反否则就用符号位”。这条思路实现起来比较简单也能跑通。对于sltu的实现你需要将A和B分别补零扩展到33位在33位加法器里做减法结果最高位是否为1来比较大小。更简单的做法是借用32位加法器的进位输出。无符号减法如果AB则减法需要借位即Cout0如果AB则Cout1。所以sltu的结果就是~Cout。这个思路很优雅很多教材都没有说明但实验时你能用上老师会加分。不过要注意有个坑加法器在做减法时Cout是借位取反的意思跟加法时的进位含义不同你得在最前面声明清楚。4.3 数据通路规划并行、运算、选择三步走MIPS运算器的宏观架构其实非常标准。输入两个32位操作数A、B控制信号包括ALUOp操作码、还有若干功能扩展线比如判断是否是不是移位指令、是否比较指令。在内部算术运算单元一个32位加法器可以复用做减法SubALUOp中表示减法的bit输出加减结果以及Zero、SignedOverflow、CarryOut等标志。逻辑运算单元四个32位的与门、或门、异或门、或非门nor可以看作~A或B各自计算出结果。比较运算单元专门生成slt和sltu的结果通常是一个32位信号结果要么是0要么是1放在最低位。移位单元对于sll/srl/sra移位数通常由指令的低5位指定需要将A或B的值按Shamt左移/右移。这里注意MIPS的移位指令格式一般把要移位的数放在rt对应B端口shamt在低5位但不同MIPS版本的运算器实验对接方式可能不同我按常规实验要求做。最终所有结果都送到一个多路选择器mux的输入端ALUOp选择哪一个作为输出。多路选择器的控制信号可以由ALUOp转换而来也可以用case思想生成。我在实操中习惯用两个层面的mux第一层是对“算术/逻辑/比较/移位”四个大类做4选1第二层是在算术内部对加法和减法做选择、在逻辑内部对四种逻辑做4选1。这样层次清楚排错容易。4.4 关键电路实现ALU控制信号译码不是简单的查表当你准备把指令的funct字段比如R型指令的6位功能码映射到ALU控制信号时通常会有一个ALUControl模块。常见的方案是使用最原始的“主译码器ALU译码器”两级结构就像《计算机组成与设计》书里那样。经典映射方式可以简化为一张表指令ALUOpfunctALUControllw/sw00xxxxxx0010(加)beq01xxxxxx0110(减)R-type10100000(add)0010R-type10100010(sub)0110R-type10100100(and)0000R-type10100101(or)0001R-type10101010(slt)0111............这张表几乎每个用过MIPS的人都能背下来。但要注意MIPS的funct编码很多比如sll是000000srl是000010sra是000011jr是001000等等。实际设计中不一定为所有指令单独码可以用分支判断。我在实验里采用过一个技巧把ALUControl的低两位设计成与“加减与或”的编码一致然后最高的有效位表示是否比较再高一位表示是否移位这样可以大大简化译码电路。不过如果只是做运算器实验你的ALUControl可以直接由多功能测试仪或者手动开关模拟不一定需要真实的指令译码。这时你可以手动把每个测试点对应的控制信号拨到位只验证运算器本身逻辑。但如果你的目标是后续做单周期CPU最好把控制信号和指令funct的映射关系先定义清楚以后能复用。4.5 移位单元的实现细节与三种右移移位单元可能是新手比较头秃的部分。MIPS的sll是逻辑左移低位移入0srl是逻辑右移高位移入0sra是算术右移高位用符号位填充。在Logisim里有一个Shifter组件可以通过配置支持逻辑左移、逻辑右移、算术右移等模式而且支持动态移位数输入。如果你不想用自带移位器自己用桶式移位器搭也行但复杂度高我不建议在有限实验时间内去造轮子。但要注意一点MIPS的sll/srl/sra指令格式中要移动的数存放在rt字段bits[20:16]移位位数存在shamt字段bits[10:6]并不是把A作为移位主体。所以如果你把输入A接到被移位的数据把B当shamt那就做反了。在实验验证时一定要在仿真阶段设置好测试向量分别测一测0x80000000算术右移1位应得0xC0000000和逻辑右移1位应得0x40000000这样就能抓到接反问题。4.6 完整验证方案把这几个边界测试点全部通过才算过关MIPS运算器验证时不能只跑几个简单例子。我建议准备一组测试向量覆盖以下场景add有符号溢出0x70000000 0x70000000应产生溢出标志。sub结果为零5-5Z标志1。slt有符号比较0xFFFFFFFF-1和0x00000000slt结果应为1但sltu比较同一个数时结果应为0按无符号0xFFFFFFFF远大于0。sra负数0x80000000算术右移3位得0xF0000000。srl正数0x00000008逻辑右移1位得0x00000004。or自操作A or A A。lui操作把16位立即数放到高16位低16位清零。jr操作如果实验要求支持jr实际上就是把某寄存器的值传给PC在运算器层面可能只需直接输出A或不需要额外运算但这涉及CPU数据通路如果只是运算器可以不处理。我还习惯用Logisim的“组合逻辑分析”功能做一次功能验证将子电路的输入输出导入分析表跑一遍真值表扫描虽然对于32位大规模电路不太现实但对于每个4位子模块非常管用。对于完整32位ALU用自动化测试脚本太麻烦我就手动拨开关并盯着输出十六进制数一组一组测虽然原始但能有效发现多数问题。4.7 排错实录我在这四个问题上浪费了最多时间先说第一坑忘接零标志。Z标志在很多设计中不是ALU直接输出而是从输出总线走一个检测电路后产生。我当时把Z输出接成了一个固定0因为检测电路输入引线接错了信号名。排查时发现ADD出来的结果明明是0Zero灯却不亮花了好久才定位到比较器信号没接。零标志必须用最终结果的所有位来判断不能拿中间信号判断这个务必牢记。第二坑slt实现时误把符号位当比较结果。如果用A-B结果最高位作为slt输出在发生溢出时会得到错误结果。比如A-10xFFFFFFFFB1A-B结果应该是0xFFFFFFFE符号位是1正确但如果A127B-128A-B结果按补码会溢出到0x00FFFFFF符号位是0但实际127 -128slt应得0。你需要在减法器上加溢出修正或者用前面提到的公式。第四坑就是漏看溢出标志把有符号slt当无符号做了这在实验报告里是大硬伤。第三坑移位和逻辑运算共用了B端口但控制信号错位。比如按功能设计表里sll指令的移位量在shamt但实验板上的操作数B引脚可能有多个来源如果调试时手拨开关把B接成了被移位数而不是移位数结果自然不对。我的经验是先在纸上画出每组指令的端口连接关系然后在验证时针对每条指令单独写一张测试向量表别混在一起测。第四坑寄存器数据通道和ALU输出没有隔离导致仿真时模拟稳定变慢。有时你会在一个模块里同时输出多组结果总线冲突在Logisim中不一定报大红叉而是显示错误值。解决方法是注意所有输出端口的位宽和方向并且尽量用“探针”连接观察点避免相互干扰。5. 实验报告与答辩准备不仅仅是交一份截图5.1 报告结构怎么排才能拿高分华科的计组实验报告一般有固定模板但老师更看重你有没有自己的想法。我的建议结构实验目的不要照抄书上的话写“掌握补码加减法运算的硬件实现”“理解组间串行进位的延迟特性”“掌握MIPS运算器的数据通路与控制信号设计”。实验原理每个模块的草图不是mermaid可以用手画截图或者Logisim导出图配一段关键解释。设计过程分模块描述每个模块说明输入输出、控制信号、内部逻辑。适当增加关键布尔表达式和真值表。验证结果列出测试向量表格边测边记录结果。重点是出现错误时你怎么定位和修改的过程。问题与总结写2-3个真实的坑越具体越好。比如“最初将加法器Cin接到了数据总线导致加减结果都大1后来通过单步仿真发现了这个问题。”这种细节才是老师给高分的依据。5.2 答辩时最容易被追问的三个问题答辩的时候老师很喜欢围绕标志位、溢出判断、控制信号真值表这三点来问你。我梳理一下回答思路问“add和addu区别是什么”答add检测溢出addu不检测溢出二者在结果上一致区别只在溢出标志是否置位。问“slt和sltu在硬件实现上区别在哪”答slt需要处理有符号数实现上要考虑A与B的符号和溢出sltu可以直接用减法器的进位输出来判断大小。问“如果ALU输出结果和预期不符你会怎么排查”答先确认控制信号是否按照真值表正确设置然后分别检查加法器、逻辑单元、移位单元各模块的输出用单步时钟依次观察每一级最后检查分线器位序和引脚连接。5.3 让我少走弯路的三个独家技巧第一给每一个连线起个看清楚的名字尤其是总线信号。Logisim里选中导线按CtrlL可以添加标签当导线多了之后标签能让你迅速找到相同信号的连接点。我因为懒得标标签出过错后来宁可多花十分钟标完所有关键线。第二搭建大电路时把子模块做成“黑盒”先验证子模块单独工作再集成。当初我直接搭完正个MIPS运算器再调试出了问题根本不知道是哪个模块的锅。后来我把加减单元、逻辑单元、移位单元分别用单独子电路实现并分别仿真全部通过后再拼起来总调试时间减少了至少一半。第三保存多个版本。每完成一个小功能比如加减法通过、逻辑运算通过、slt修正通过都另存为一个版本文件。万一后面改坏了还能回到上一版。这个习惯救了我好几次尤其是实验课临近截止时谁都不想从头再搭一遍。6. 从实验到能力的转化做完运算器你能带走什么说实话计组实验里运算器只是中间一环而这一环带给你的能力绝不是“会搭电路”那么简单。你会在设计MIPS运算器的过程中真正理解“指令集决定硬件”这句话。为什么MIPS的add和sub可以使用同一个加法器主体靠控制线切换因为硬件能够复用而复用是计算机设计的核心思想之一。你还会在调试过程中学会系统化的排错方法。硬件 debugging 不像软件你没法随便print只能靠观察信号层面的逻辑状态这种能力在以后做数字逻辑、嵌入式、体系结构方向都会用到。哪怕你不做硬件很多系统级问题排查思路也共通。我现在还记得当年我熬夜调spim验证MIPS仿真器时看着计数器一点点把ALU控制信号拨出来当时觉得烦死了现在回头想如果没有那几周的折磨我对补码、溢出、移位这些语义的理解不会那么扎实。所以如果你现在正卡在哪个实验上别急把每一个小的验证向量都跑一遍把每一次错误都记下来后面学到CPU设计时你就知道当前的积累有多值钱。最后再分享一个实用小技巧做MIPS运算器实验时记得把“输入引脚”用旋转形式摆放成和原理图引脚方向一致比如A和B分列左右控制信号在下输出在上这样导出到报告的时候图更容易被老师看懂。连线的时候善用自动布局CtrlShiftS可以控制显示栅格保持整洁的电路图不只是好看更是排错时的救命稻草。愿这篇指南能让你少熬几个夜也希望你能在这门硬核课程里收获真正的程序员内功。
返回列表