Logisim实战:从补码运算到汉明码,打通计算机数据表示实验
1. 项目概述:从“纸面理论”到“动手验证”的跨越
如果你正在学习《计算机组成原理》,或者对计算机内部如何表示和处理数据感到好奇,那么“数据表示实验”绝对是你必须亲手过一遍的环节。这门课的理论部分,比如原码、反码、补码,或者汉字编码的区位码、国标码,听起来可能有些抽象,甚至枯燥。很多同学会陷入“听课都懂,做题就懵”的困境,根本原因在于缺少一个直观的、可操作的验证环境。而Logisim这款数字电路仿真软件,恰恰为我们搭建了一座从理论通往实践的桥梁。它用可视化的逻辑门、导线和组件,让你能像搭积木一样,构建出课本上描述的运算器、编码器乃至简单的CPU部件。
这次实验的核心,就是利用Logisim,将“计算机数据表示”这一章的核心知识点进行硬件层面的仿真实现。这不仅仅是照着实验指导书连线那么简单。通过亲手搭建一个8位的可控加减法器,你会深刻理解补码运算如何统一了加法和减法;通过设计一个汉明校验码电路,你会直观看到冗余校验位是如何被计算并插入数据流,以实现一位错的检错与纠错;而通过完成汉字区位码到国标码、机内码的转换电路,你更能从硬件角度理解中文信息在计算机中存储和传输的完整链条。这个过程,会让你对“数据表示”的理解从“知道是什么”升级到“明白为什么”和“清楚怎么做”。
我经历过单纯啃书的阶段,也体验过在Logisim里调试电路到深夜,最终看到LED灯正确显示结果时的豁然开朗。可以说,没有经过Logisim“折磨”的计组学习是不完整的。接下来,我将以一个过来人的视角,带你拆解这个实验的每一个核心环节,分享从工具准备、思路设计到调试排错的全流程干货。无论你是为了完成课程实验、备战考研408,还是纯粹出于兴趣,这篇内容都能给你提供一份可直接“抄作业”又富含原理讲解的指南。
2. 实验环境准备与Logisim核心操作精讲
工欲善其事,必先利其器。在开始搭建复杂的数字电路之前,我们必须先和Logisim这个工具打好交道。很多实验的挫折感,并非源于逻辑设计本身,而是来自于对工具的不熟悉。
2.1 Logisim的获取与基本界面认知
Logisim是一款用Java编写的开源软件,这意味着它可以在Windows、macOS和Linux上无缝运行。建议直接从其官方或可靠的大学课程网站获取稳定版本。安装过程无需赘述,关键是打开软件后,要对它的界面分区有清晰的认识。
主界面通常分为四块:左侧的导航面板(Explorer)、中上部的电路编辑区(Canvas)、左侧下方的组件属性表(Attribute Table),以及底部的仿真控制栏。导航面板是元件库,像工具箱,里面分门别类存放着导线(Wiring)、逻辑门(Gates)、多路复用器(Plexers)、算术单元(Arithmetic)等。电路编辑区就是你的“工作台”,所有电路都在这里搭建。属性表则用于配置当前选中元件的具体参数,比如一个与门的输入引脚数,或者一个探针(Probe)的显示格式(二进制、十进制、十六进制)。仿真控制栏则控制着电路的“运行”与“暂停”,以及时钟信号的步进。
注意:初次使用时,务必花几分钟点击各个菜单栏熟悉一下。特别是“模拟(Simulate)”菜单下的“仿真启用(Simulation Enabled)”选项,它相当于整个电路的电源总开关。很多时候电路没反应,不是设计错了,而是忘了打开这个开关。
2.2 核心元件使用心法与布线技巧
Logisim的操作看似简单,但有些技巧能极大提升效率和减少错误。
首先是用好“探针(Probe)”和“引脚(Pin)”。引脚是电路与外界交互的接口。输入引脚(Input Pin)可以手动点击切换0/1,也可以绑定到时钟或常数;输出引脚(Output Pin)则用于观察结果。但直接看引脚上的小数字并不直观。这时就需要“探针”工具:用鼠标点击导线,Logisim会自动为这段导线附上一个持续显示的数值标签。这在调试多位数数据通路时至关重要,你能实时看到每一根线上的数据流变化。
其次是理解“位宽(Data Bits)”属性。这是Logisim中最容易出错的概念之一。几乎所有的组件(引脚、导线、门电路、加法器)都有一个“位宽”属性。它定义了该组件处理数据的二进制位数。如果你设计的是一个8位加法器,那么你的输入引脚、输出引脚以及连接它们的导线,位宽都必须设置为8。如果位宽不匹配,Logisim会用红色导线提示错误,或者进行你不期望的符号扩展/截断,导致结果诡异。
布线时,强烈建议开启“网格对齐”和“自动布线”功能。这能让你的电路图看起来整洁规范。对于复杂的连接,可以使用“隧道(Tunnel)”功能。给一根导线或一组总线(Bundle)起一个标签名(比如A[7..0]),然后在另一个需要连接的地方放置一个同名隧道,它们就在逻辑上连接起来了,避免了画面上杂乱无章的跨区域连线,让电路图模块清晰,易于阅读和维护。
最后是分层设计思想。对于一个复杂的系统(比如最终的汉字编码转换器),不要试图在同一个电路图中画完所有东西。应该利用“子电路(Subcircuit)”功能。你可以先新建一个电路,命名为“8位全加器”,在其中实现细节。然后在主电路中,将这个“8位全加器”作为一个黑盒元件来使用,只关心它的输入输出接口。这种自顶向下设计、自底向上实现的方法,是工程实践的标配,也能让你的实验报告结构清晰。
3. 核心实验一:8位可控加减法器的设计与实现
这是数据表示实验中最经典的部分,目标是构建一个能根据控制信号选择进行加法或补码减法的运算单元。其核心是理解补码运算如何让减法变为加法。
3.1 补码运算原理与电路设计思路
我们知道,在补码体系下,A - B可以转化为A + (-B),而-B等于B的按位取反(反码)再加1。这就是电路设计的理论基础。
一个可控加减法器,本质上是一个加法器,但其中一个加数B在减法模式下需要先经过一个“求补”操作。具体来说,我们需要一个控制信号Sub(假设Sub=0做加法,Sub=1做减法)。当Sub=1时,我们需要将输入B的每一位与Sub进行异或(XOR)操作。因为0 XOR B = B,1 XOR B = NOT B。所以,一组异或门就实现了对B的按位取反。同时,Sub信号还要作为加法器的最低位进位(Cin)输入。因为NOT B + 1才是-B的补码。这样,当Sub=1时,加法器实际计算的是A + (NOT B) + 1,即A - B。
因此,电路的数据通路可以这样设计:两组8位输入A[7..0]和B[7..0],一个1位控制信号Sub,一组8位输出S[7..0]和一个1位溢出标志OF。B的每一位先经过一个异或门,异或门的另一输入端统一接Sub。异或门的输出结果与A一起送入一个8位并行加法器。Sub信号同时连接到加法器的进位输入端Cin。加法器的输出即为结果S。
3.2 Logisim中的具体实现步骤
- 创建子电路:在Logisim中新建一个电路,命名为
Controlled_Add_Sub_8bit。 - 放置输入输出:放置两个8位输入引脚,命名为
A和B。放置一个1位输入引脚,命名为Sub。放置一个8位输出引脚,命名为S。放置一个1位输出引脚,命名为Overflow。务必在属性框中将它们的“数据位宽”分别设置为8、8、1、8、1。 - 搭建求补通路:从元件库“Gates”中拖出8个“异或门(XOR Gate)”,排列整齐。将
B输入引脚的8根输出线(总线)分别连接到这8个异或门的一个输入端。将Sub引脚连接到这8个异或门的另一个输入端。这样,异或门的输出就是B xor Sub,即受控的B或NOT B。 - 集成加法器:从元件库“Arithmetic”中拖出一个“加法器(Adder)”。在属性框中,将“数据位宽”设置为8。将
A引脚和8个异或门的输出,分别连接到加法器的两个加数输入端。将Sub引脚连接到加法器的“进位输入(Carry In)”端。将加法器的“和(Sum)”输出端连接到输出引脚S。 - 溢出判断逻辑:溢出标志
OF的判断是难点。对于有符号补码运算,溢出发生在:正数加正数得负数,或负数加负数得正数。具体到电路,可以通过最高位的进位C7和次高位向最高位的进位C6来判断。公式为:OF = C7 XOR C6。遗憾的是,Logisim标准库的加法器不直接提供每一位的进位信号。因此,我们有两种实现方案:- 方案A(推荐,更直观):不使用库里的加法器,而是用8个1位全加器(Full Adder)自己串联成一个行波进位加法器(Ripple Carry Adder)。这样,你可以直接从第7位和第6位全加器上引出进位信号
C7和C6,再用一个异或门计算溢出。这虽然连线稍多,但完美契合教学内容,让你彻底看清进位链。 - 方案B(取巧):利用库里的加法器,并通过计算来间接判断。我们可以通过检查
A[7]、B'[7](求补后的B最高位)和S[7]的关系来实现。逻辑是:如果A[7]和B'[7]相同(即同号),且与结果S[7]不同,则溢出。这需要用到几个与门、或非门等,逻辑表达式稍复杂。
- 方案A(推荐,更直观):不使用库里的加法器,而是用8个1位全加器(Full Adder)自己串联成一个行波进位加法器(Ripple Carry Adder)。这样,你可以直接从第7位和第6位全加器上引出进位信号
- 测试与验证:电路搭建完成后,点击“模拟”->“仿真启用”。手动点击
A、B、Sub引脚输入不同的值进行测试。例如:Sub=0,A=5,B=3->S应该为8。Sub=1,A=5,B=3->S应该为2(5-3)。- 测试边界情况:
A=127,B=1,Sub=0(正溢出),观察S是否变为-128,并且OF灯是否亮起。 - 测试负数运算:
A=-5(即补码11111011),B=3,Sub=1(即-5-3=-8),验证结果。
实操心得:在测试时,不要只用十进制输入,要习惯查看二进制和十六进制表示。在输出引脚属性中,将“显示格式”改为“十六进制”,可以更紧凑地观察8位数据。溢出判断部分最容易出错,务必用多个边界用例反复测试。自己搭建行波进位加法器虽然初期麻烦,但对理解进位传递和溢出本质有巨大帮助,强烈建议第一次实验时采用方案A。
4. 核心实验二:汉明校验码生成与校验电路设计
汉明码是一种高效的错误检测与纠正码,广泛应用于内存(ECC内存)、通信等领域。这个实验要求我们设计一个能对若干位数据位自动生成校验位,并能检错一位、纠错一位的电路。
4.1 汉明码原理快速回顾
汉明码的核心思想是在数据位中插入多个校验位,每个校验位负责校验数据位中特定位置的奇偶性(通常采用偶校验)。校验位的位置是2的幂次方(第1, 2, 4, 8...位)。数据位填充其余位置。每个数据位可能被多个校验位覆盖,其位置编号的二进制表示决定了它受哪些校验位校验。
例如,要保护4位数据(D3, D2, D1, D0),需要3个校验位(P2, P1, P0)。最终7位汉明码排列为:P0, P1, D0, P2, D1, D2, D3(位置1-7)。
- P0(位置1)校验所有位置编号二进制表示中最低位为1的位:1, 3, 5, 7 (即P0, D0, D1, D3)。
- P1(位置2)校验所有位置编号二进制表示中次低位为1的位:2, 3, 6, 7 (即P1, D0, D2, D3)。
- P2(位置4)校验所有位置编号二进制表示中第三位为1的位:4, 5, 6, 7 (即P2, D1, D2, D3)。
在接收端,重新计算每个校验组的奇偶性,形成一个“错误字(Syndrome)”。如果错误字全0,则无错;否则,错误字的数值直接指出了出错位的位置,取反即可纠正。
4.2 生成器与校验器的Logisim实现
我们可以将电路分为两部分:汉明码生成器(Encoder)和汉明码校验纠正器(Decoder/Corrector)。
4.2.1 生成器电路设计
假设我们对4位数据D[3..0]进行编码,生成7位汉明码H[6..0]。
- 确定校验位位置:H0, H1, H3 对应 P0, P1, P2(这里索引从0开始,需与原理中的位置1-7映射好,注意换算)。
- 分配数据位:将
D0, D1, D2, D3分配到汉明码的剩余位置(例如H2, H4, H5, H6)。 - 计算校验位:
- P0 = D0 XOR D1 XOR D3 (对应位置3,5,7的数据位,即H2(D0), H4(D1), H6(D3))
- P1 = D0 XOR D2 XOR D3 (对应位置3,6,7的数据位)
- P2 = D1 XOR D2 XOR D3 (对应位置5,6,7的数据位)
- 在Logisim中实现:使用异或门搭建上述三个逻辑表达式。将4位数据输入用分线器(Splitter)分开,然后按照表达式连接异或门。最后用一个合并器(Merger)将计算出的P2, P1, P0和原始数据位
D[3..0]按照既定位置顺序合并成7位输出H[6..0]。
4.2.2 校验纠正器电路设计
输入是可能出错的7位汉明码H'[6..0],输出是纠正后的7位汉明码H_corrected[6..0],以及错误标志Error(可选项)。
- 提取数据和校验位:根据编码规则,从
H'中分离出收到的数据位和校验位。 - 重新计算校验位:将收到的数据位,送入一个和生成器完全相同的电路,计算出理论上应该有的校验位
P2_new, P1_new, P0_new。 - 计算综合征:将重新计算出的校验位与收到的校验位进行按位异或:
S2 = P2_new XOR P2_received,S1 = P1_new XOR P1_received,S0 = P0_new XOR P0_received。这样就得到了一个3位的综合征S[2..0]。 - 错误定位与纠正:
S[2..0]的二进制值(1-7)直接指示了哪一位出错(0表示无错)。我们需要一个“译码器”逻辑:根据S的值,产生一个7位的“错误掩码(Error Mask)”,其中只有出错的那一位是1(如果无错则全0)。例如,若S=3(二进制011),则错误掩码的第3位(从1开始计)为1。然后将这个错误掩码与收到的H'进行按位异或,即可翻转(纠正)出错位,得到H_corrected。 - Logisim实现:综合征计算用异或门即可。最复杂的是“从S到错误掩码”的译码逻辑。这本质上是一个3-8线译码器(Decoder),但输出需要映射到7位。你可以使用Logisim的“Plexers”库中的“Decoder”元件,或者用基本的与门、或门搭建组合逻辑。另一种更直观的方法是使用“ROM”或“PROM”元件,将S作为地址输入,预先写好对应的7位掩码数据,实现查表功能,这在Logisim中实现起来更简洁。
注意事项:位序和索引是此实验最大的坑。务必在实验报告或电路注释中清晰定义你的汉明码每一位(从高位到低位或从低位到高位)对应的是原理中的哪个位置(1-7)。统一采用一种索引方式(建议物理位序从0开始,逻辑位置从1开始),并在整个设计中保持一致,否则综合征解码会完全错误。测试时,可以手动翻转(取反)汉明码中的任意一位,观察校验器是否能正确输出错误位置并纠正。
5. 核心实验三:汉字编码转换电路(区位码、国标码、机内码)
这个实验将计算机中的数据表示与我们最熟悉的汉字联系起来,揭示了从输入、存储到处理过程中,汉字编码的演变历程。我们将设计一个电路,能够完成区位码到国标码,以及国标码到机内码的转换。
5.1 汉字编码体系解析
首先必须理清三个概念:
- 区位码:这是最早的国家标准(GB 2312)中汉字的二维坐标表示。一个94x94的表格,区号(行)从01到94,位号(列)从01到94。例如“啊”字在16区01位,区位码就是
1601。注意,这里的数字是十进制的。 - 国标码:为了在计算机中传输,将区位码的区号和位号分别加上
32(即0x20),得到国标码。加32是为了避开ASCII码中的前32个控制字符。“啊”的国标码就是(16+32, 1+32) = (48, 33),用十六进制表示为0x3021。国标码用两个字节表示一个汉字。 - 机内码:在计算机内部存储时,为了与ASCII字符明确区分(因为ASCII码是单字节,且值小于128),将国标码的两个字节的最高位都置为
1(即各加上128或0x80)。“啊”的机内码就是(48+128, 33+128) = (176, 161),十六进制为0xB0A1。我们看到的中文文本在内存或文件中的形式,通常就是这种机内码。
因此,转换关系是:
- 区位码 -> 国标码:
区/位字节 = 区/位码 + 32 - 国标码 -> 机内码:
区/位字节 = 国标码区/位字节 + 128(或等价于,最高位置1) - 区位码 -> 机内码(直接):
区/位字节 = 区/位码 + 160(因为32+128=160)
5.2 多模式转换电路的Logisim实现
我们的目标是设计一个电路,输入一个汉字的区位码(区号和位号),通过一个模式选择开关,可以输出对应的国标码或机内码。
- 输入设计:需要两个输入端口,分别代表区码(Zone)和位码(Position)。由于区位码范围是1-94,至少需要7位二进制来表示(因为2^7=128>94)。我们可以设计为两个7位或8位的输入。为了便于手动测试,可以连接两个“Hex Digit Display”输入器,或者用多个单比特开关组成总线。
- 核心加法器:转换的核心是加法运算。我们需要一个加法器来计算
Zone + 32、Position + 32、Zone + 160、Position + 160。但不需要四个独立的加法器。我们可以利用一个可控加减法器的思路,但这里是固定的加法。更简单的方法是使用常数加数。 - 电路结构:
- 放置两个8位加法器(Adder),一个用于计算区码部分,一个用于计算位码部分。
- 每个加法器的一个加数输入端接区位码输入(高位补0至8位)。
- 另一个加数输入端,需要通过一个多路选择器(Multiplexer)来选择是加上
32(国标码模式)还是加上160(机内码模式)。 - 因此,我们需要一个模式选择信号
Mode(例如0为国标码,1为机内码)。这个Mode信号控制两个多路选择器(每个加法器对应一个)。 - 多路选择器的两个数据通道,一个接常数
32(二进制00100000),另一个接常数160(二进制10100000)。注意,160的二进制最高位是1,这正好对应了机内码最高位置1的要求。 - 两个加法器的输出,就是转换后的汉字编码(两个字节)。
- 输出与显示:将两个加法器的8位输出分别连接到两个输出引脚,可以命名为
High_Byte和Low_Byte。为了直观显示,强烈建议使用“Hex Digit Display”或“七段数码管(Seven-Segment Display)”来显示十六进制结果。同时,也可以使用“探针”显示二进制形式,以便观察最高位的变化。 - 测试验证:
- 输入“啊”的区位码:区=
16(十进制),位=1(十进制)。在Logisim中,输入引脚可以设置为十进制显示并输入16和1。 - 将
Mode设为0(国标码模式),观察输出。区字节应为16+32=48(十六进制0x30),位字节应为1+32=33(十六进制0x21)。合起来显示0x3021。 - 将
Mode设为1(机内码模式),观察输出。区字节应为16+160=176(十六进制0xB0),位字节应为1+160=161(十六进制0xA1)。合起来显示0xB0A1。 - 可以多测试几个字,如“中”(区位码
5448),国标码(86,80)=0x5650,机内码(214,208)=0xD6D0。
- 输入“啊”的区位码:区=
实操心得:这个实验的关键在于理解“加32”和“加160”的实质是设置不同的字节高位。在Logisim中实现常数加法时,可以直接用一个“常量(Constant)”元件,设置其值为十进制32或160,位宽设为8。多路选择器(Multiplexer)的“选择位(Select Bits)”属性设为1,数据位宽设为8。这个电路相对简单,但它是理解汉字在计算机中生命周期的关键一环。你可以尝试扩展它,比如增加一个“显示模式”,直接输出对应的汉字字形(这需要集成ROM字库,是更高级的实验)。
6. 实验集成、调试与排错全记录
当各个模块都完成后,我们可能需要将它们集成到一个更大的项目中,或者仅仅是确保每个独立模块都能稳定工作。调试是实验中最耗时也最能增长经验的环节。
6.1 系统性调试方法
- 模块化测试,逐层验证:不要试图一次性搭建和调试整个复杂系统。严格按照分层设计,先确保最底层的子电路(如一个1位全加器)功能正确。然后用这个正确的全加器去构建8位加法器,再测试这个8位加法器。像汉明码电路,先单独测试生成器,用已知数据验证输出是否正确;再单独测试校验器,用正确的和故意弄错的汉明码输入,看能否检错纠错。
- 善用“探针”和“日志”:Logisim的探针是实时调试的利器。在关键的数据通路上都放上探针,运行仿真时所有信号一目了然。对于时序问题(虽然本实验主要是组合逻辑),可以使用“日志(Log)”功能,记录信号随时间的变化。
- 构造全面的测试用例:不要只测试“正常路径”。对于运算器,要测试正数、负数、零、最大值、最小值以及各种溢出边界情况。对于汉明码,要测试无错、每一位单独出错、两位出错(应仅检错无法纠错)的情况。对于编码转换,要测试区位码上下边界(1和94)的转换。
- 对比验证法:对于有明确计算结果的模块(如加法、编码转换),可以先用笔算、计算器或写个小程序算出预期结果,然后在Logisim中运行对比。对于汉明码,可以找在线计算工具验证你的生成和校验结果。
6.2 常见问题与故障排查表
以下是我在多次实验中遇到的典型问题及解决方法:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 电路没有任何反应,输出始终为0或未知(X) | 1. 仿真未启用。 2. 输入引脚未连接或位宽不匹配。 3. 存在未连接的浮动输入。 | 1. 检查菜单“模拟”->“仿真启用”是否勾选。 2. 检查所有输入引脚是否都有导线连接,且导线与引脚位宽一致(无红色警告)。 3. 检查所有逻辑门、多路选择器的输入端是否都接了明确的0/1信号,悬空输入端会被视为“未知”。 |
| 加法器结果明显错误 | 1. 进位链连接错误。 2. 位宽设置不一致。 3. 混淆了有符号数补码和无符号数显示。 | 1. 如果是自建的行波进位加法器,请逐位检查进位输出到下一级进位输入的连接。 2. 确保加法器元件、输入输出引脚、连接导线的“数据位宽”属性全部一致(例如都是8)。 3. 在输出探针的属性中,切换显示格式(二进制、有符号十进制、无符号十进制)进行对比,确认你理解当前显示的数字含义。 |
| 汉明码校验器无法正确纠错 | 1. 生成器与校验器使用的编码/校验位位置规则不一致。 2. 综合征到错误掩码的译码逻辑错误。 3. 位序(最高位/最低位)混淆。 | 1.这是最常见原因!用一张纸清晰写出你的编码方案:数据位D3-D0放在汉明码H6-H0的哪几个位置?校验位P2-P0放在哪几个位置?确保生成器和校验器使用完全相同的映射表。 2. 单独测试译码逻辑:手动输入不同的S值,观察输出的错误掩码是否只有对应位为1。可以用真值表验证。 3. 检查总线分合器(Splitter/Merger)的组合/分离顺序,确保高位对高位,低位对低位。 |
| 编码转换电路输出值偏差固定值 | 加法器的常数加数设置错误。 | 检查连接到加法器第二个输入端的“常量(Constant)”元件的值。确认国标码模式加的是32(二进制00100000),机内码模式加的是160(二进制10100000)。注意常量元件的位宽也要设为8。 |
| 多路选择器输出不对 | 选择信号连接错误或数据通道顺序反了。 | 检查Mode信号是否正确连接到多路选择器的“选择(Select)”端。在属性中确认“数据位宽”和“选择位”数量(1位选择对应2个数据通道)。确认数据通道0和1对应的输入是否正确(例如,0通道接32,1通道接160)。 |
| 子电路封装后,在主电路中无法连接 | 子电路的接口引脚属性设置不当。 | 在子电路编辑界面,检查输入/输出引脚的“面向(Facing)”属性,确保它们指向子电路框图的边界外部。同时检查引脚名称是否清晰。在主电路中使用该子电路时,其端口应该显示为可连接的点。 |
6.3 性能优化与扩展思考
当基本功能实现后,可以思考一些优化和扩展方向,这能让你的实验报告脱颖而出:
- 超前进位加法器(CLA):尝试用Logisim实现一个4位或8位的超前进位加法器,对比其与行波进位加法器在速度上的差异(通过观察信号稳定所需的时间)。
- 汉明码扩展:实现能纠正一位错、检测两位错的扩展汉明码(SEC-DED),增加一个全校验位。
- 汉字显示系统:将编码转换电路与一个简单的ROM字库连接,根据输出的机内码地址,从ROM中读取点阵数据,驱动一个LED矩阵或图形化界面显示汉字。这需要了解汉字点阵字库的结构。
- 集成化CPU数据通路:将可控加减法器作为算术逻辑单元(ALU)的核心部件,再结合寄存器堆、指令译码器等,可以构建一个极其简化的CPU模型,用于执行简单的加减法指令。这才是计算机组成原理实验的终极乐趣所在。
调试的过程就是与逻辑对话的过程。每一个错误的信号,都在告诉你电路某处的设计违背了你的初衷。耐心地、系统地排查,利用好Logisim提供的可视化工具,当最终所有探针都显示出预期的数值时,那种通过自己双手将抽象理论转化为具体实现的成就感,是任何考试高分都无法比拟的。这份排错经验,也将成为你后续学习数字电路、体系结构乃至硬件描述语言(如Verilog)的宝贵财富。
