简介:计算机组成原理多思实验的累加器实验报告文档,面向数字逻辑与计算机组成原理课程学习者,用于理解累加器在数据通路中的地位及微命令控制方式。资源为1个doc文档,压缩包整体约458KB,适合阅读、打印或按需编辑。实验内容围绕用R0作累加器完成一次加法运算展开,涵盖实验目的、原理图、控制信号设置、微命令表格以及存储器芯片查看等环节,需通过数据开关、总线、地址寄存器AR、运算器ALU和累加器R0的协同配合,完成被加数输入、存储器操作数读取、加法运算及结果写回存储单元的全过程。报告中包含A→R0、B+R0→R0、存储R0等典型操作的微命令设计表,并附有实验电路连线信息,可帮助读者掌握三态门总线传输、微命令时序控制和数据通路运行机制,适合作为课前预习、课内参考或课后复习的配套材料。目前已有1120人学习下载,实用性较强。
1. 把计算机组成原理的多思累加器实验跑通:先搞懂数据通路再动手拨开关
做过多思平台累加器实验的人都清楚,最痛苦的不是连线,而是不知道每一步该给哪些控制信号、为什么要给这些信号。很多同学照着报告抄微命令,抄完发现数据灯不亮、存储单元没写入,折腾一下午最后只能归咎于“实验箱坏了”。实际上绝大多数翻车都出在同一个地方:没理解总线结构的竞争关系,也没搞清微命令里的S3-S0、Cn、CE这些位到底控制谁。这份实验报告的价值在于它把A→R0、B+R0→R0、R0→存储单元三组微命令的完整取值都列出来了,配合电路连接清单,可以让你一次性看懂数据在各部件之间怎么流动、每个CPU周期该做什么,少走两三次实验课的弯路。适合正在做计算机组成原理课程设计、需要交实验报告的在校生,也适合想快速回顾数据通路控制的从业者。
2. 累加器实验的数据通路:从74LS374到74LS181,控制信号是怎么把数据送到该去的地方
2.1 总线结构下的部件协作方式
累加器实验的核心不是累加器本身,而是总线。报告里所有部件——数据开关SW7-SW0、寄存器DR1/DR2、地址寄存器AR、存储器RAM6116、累加器R0——都挂在同一条总线上。总线的特点是同一时刻只能有一个部件往线上送数据,其余部件要么接收、要么高阻态隔离。这个设计是理解整张微命令表的前提。
实验里用74LS374作为累加器R0,它的输出端通过三态门接到总线,当BUS-R0有效时,R0的内容才被驱动到总线上;其他时候R0的输出端处于高阻态,不影响总线上的其他数据传输。数据开关侧同样如此,SW7-SW0经74LS245总线收发器接总线,由BUS-SW控制。两个控制信号同时有效时,总线就会冲突,这也是新手最常犯的错误。
74LS181是ALU核心,S3-S0四位选择运算类型,Cn是进位输入。实验里把DR1和DR2作为ALU的两个输入操作数,ALU的输出经三态门送回总线。这个三态门由BUS-ALU控制。所以一次完整的加法操作至少需要三步:把操作数分别装进DR1和DR2,再由ALU算完送回R0。R0在这里既是累加器,也是一个中转站,因为总线不能同时让两个源都驱动。
2.2 电路预设置:不做好这一步,后面全是玄学
打开虚拟实验系统导入电路后,第一步不是直接拨控制信号,而是做预设置。这份报告里给出的预设置是:DR1、DR2和AR的置1端(置位端)全部置1,时序发生器的Step拨到1,也就是单脉冲模式。这是很多人都跳过但绝对不能跳过的环节。
置位端的含义是让寄存器先进入一个已知状态。DR1、DR2和AR在实验开始前可能残留上次的随机数据,如果不置位,后面对比数据灯时会出现莫名其妙的数。至于Step置1,是为了让时序发生器工作在单脉冲步进模式,每点一次Start只产生一个CPU周期的时钟脉冲。如果误拨到连续脉冲模式,状态机会不受控制地跑,所有微命令时序全部乱套,根本没法观察每一步的效果。
连接清单方面,报告给了一个完整的Pin映射列表,其中比较关键的是CP0Pin32到CP141Pin1这一组,它们把74LS273输出的寄存器控制信号接到74LS374的引脚上。74LS374共有8个D输入端对应8位数据总线,由CP141Pin0(即时钟端)控制锁存时机。连接好后的自查方式是:所有带LD前缀的控制信号线(LDR0、LDDR1、LDDR2、LDAR、LDIR)都能在CP141的对应引脚上找到物理连接。如果某个LD信号悬空,后面的微命令填得再对也白搭。
2.3 CPU周期的概念与Start按钮的含义
这里必须把“一个CPU周期”这件事讲透。时序发生器产生一个T周期,包含节拍脉冲,用于协调各个控制信号的有效窗口。每次单击Start,时序发生器只输出一个周期的脉冲序列(当Step=1时)。这个周期内,所有控制信号按照当前开关状态组合生效,数据完成一次总线传送或一次ALU运算。
实验中的“设置控制信号1”“设置控制信号2”等步骤,本质上是在每个CPU周期之前,先拨好控制开关和对应数据,然后启动一次脉冲,让该周期内的操作按时序发生。这就是手册里“等待一个CPU周期后,X值已存入Y”这句话的实际含义。它不是自动推进的,而是你手动一步步喂时钟。理解这个机制后,你就能解释为什么每步都要重新设置数据开关:因为数据开关在每个周期里扮演不同角色,有时提供A值,有时提供B的地址,有时提供C的地址。
提示:做完一步操作后,数据开关如果不改成下一步的值,就会沿用旧值。建议把每个周期的开关设置列成一个清单,照着拨,减少出错概率。
3. 微命令设计:三张表对应的S3-S0、Cn、CE与控制信号逐位拆解
3.1 微命令编码总表:每一位控制什么
实验报告把控制信号归纳为表6-1,实际用到的字段包括S3-S0、Cn、CE、M、WE、LAR、LDDR1、LDDR2、LDR0、BUS-R0、BUS-ALU、BUS-SW。这些控制信号按顺序组合成一条微命令,每位对应一个二进制值。把报告结果部分的三组表格提取出来,可以得到全实验完整的微命令序列:
| 微命令功能 | S3S2S1S0 | Cn CE | M | WE | LAR | LDDR1 | LDDR2 | LDR0 | BUS-R0 |
|---|---|---|---|---|---|---|---|---|---|
| 数据开关→R0 | 0000 | 00 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
| 存储单元地址→AR | 0000 | 00 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
| 存储器操作数→DR2 | 0000 | 00 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
| R0→DR1 | 0000 | 00 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
| DR1+DR2→R0 | 1001 | 01 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| R0→存储单元 | 0000 | 00 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
这里要注意几处容易看晕的位。首先是S3S2S1S0在加法运算时取1001,配合Cn=1,这是74LS181在“A加B加进位”模式下最常用的编码,实验里没有额外进位需求时Cn=1保证进位输入为高电平。而M=0表示算术运算,M=1表示逻辑运算。存储操作时M=1,因为此时ALU不参与运算,S3-S0取值无实际意义,统一填0便于检查。
再就是存储操作里BUS-R0=1这一位。R0→存储单元这个微命令中,LDR0=0,也就是R0不在本周期内接收新数据,但BUS-R0=1,即R0的输出使能打开,把内部保存的运算结果驱动到总线上。数据经总线送到RAM6116的数据输入端,同时WE=1给出写信号,存储器把总线上的值锁存到AR指向的地址中。这个过程同时用到了WE和BUS-R0,两个信号都在同一个周期有效,没有先后顺序之分,因为存储器写入是边沿触发的。
3.2 存储单元地址→AR 与存储器操作数→DR2 的配合逻辑
B+R0→R0这段流程里,最容易被误解的是为什么“存储单元地址→AR”和“存储器操作数→DR2”要分成两个CPU周期。原因是AR和DR2各自有独立的加载信号,但存储器的地址输入只有一路,而DR2接的是数据总线。如果不先把地址装入AR,存储器不知道该读哪个单元;如果AR和DR2的加载信号在同一个周期内同时有效,虽然理论上也能在一个周期内完成“地址锁存+数据读出”,但前提是时序发生器支持这样的内部微操作。
在这个实验平台里,RAM6116的读操作时序要求地址先稳定,然后CE有效,数据才能出现在输出端。如果地址和读使能在同一周期才稳定下来,数据输出会有延迟,DR2在同样的时钟沿可能锁存到无效数据。所以分成“送地址”和“读数据”两个周期,第一拍让AR锁存地址,第二拍存储器把数据放到总线上、DR2锁存下来。实验操作步骤里“单击Start按钮,等待一个CPU周期后B的值已存入DR2”,整个进程对应的是地址生效后的那次读操作。
3.3 为什么DR1+DR2→R0这一步要独立成一个周期
前三步把A装入R0、把B的地址装入AR、把B的数据装入DR2,第四步才是真正让ALU干活。这一步微命令里S3-S0=1001、Cn=1、M=0,同时BUS-ALU不发生,而是BUS-R0=1。一个很反直觉的点在于:运算结果为什么不是先送到总线再由R0锁存,而是直接进了R0?
观察微码可以看到第四步LDR0=1,而BUS-R0=0,意思是R0工作在这个周期内锁存数据,但它的输出并没有使能。R0的锁存输入接的是ALU输出端经过三态门后的总线节点,此时三态门的方向由ALU内部控制,而非由BUS-ALU信号控制。实验平台在ALU输出到总线之间那组三态门,在这里是常开还是由微码控制,取决于电路图里CP56与门的接线方式。从微命令编码看,这个周期ALU输出不可见,换句话说R0直接锁存了ALU的运算结果,不需要经过总线竞争。这也是为什么这个周期里BUS-R0填0——如果填1,ALU结果和R0旧值同时驱动总线,会直接冲突。
3.4 三张表抄作业时的填法
实验报告里每次操作步骤最后都会让你把微命令填入表6-2、6-3、6-4。按照前面拆解出的编码规则,填表时只需要遵循一个原则:这个周期内哪些部件要工作,就把对应的LD或BUS信号置1;不参与工作的部件信号全部置0。S3-S0只有在ALU参与运算的周期才需要认真填,其他周期全部填0。Cn只有在加法运算时才需要关注进位设置,其他周期不影响结果。
写操作那一行的WE填1、BUS-R0填1,同时其他LD信号全为0。之前有同学把LDR0也填成1,导致写入存储器的过程中R0同时被总线上的数据改写,结果存储单元的值没错但R0被污染,后续实验数据乱掉。所以务必记住:一个周期只做一件事,涉及数据传送的两端,只能是“源使能+目的锁存”的组合,绝不能把两个锁存信号都置1。
4. 累加器实验的常见坑:现象、原因和对应的解决办法
4.1 数据开关拨好了但总线没有数据
现象:Set好数据开关后点击Start,R0或DR2的值没变化,数据灯也不亮,检查过连线正确、芯片选择也对,但就是传不进去。
原因:这个平台的数据开关输出经74LS245隔离,BUS-SW信号没有置1时,开关数据根本没被驱动到总线上。很多人只注意了目的寄存器的LD信号,忽略了源端三态门的使能。A→R0这一趟里,BUS-SW是必须有效的,否则数据开关等于摆设。
解决:对照微命令表单独检查源端使能位。凡是数据开关作为源的操作(数据开关→R0、数据开关→AR),对应的微命令位里BUS-SW必须为1。有一个快速定位方法:把数据灯接到总线上,BUS-SW=0时灯应该全灭,拨动开关灯不会变;BUS-SW=1时灯随开关变化。
4.2 连续脉冲模式下实验步骤全部错乱
现象:点击Start后,数据灯快速变化,寄存器值跳来跳去,完全没法按步骤观察。
原因:时序发生器的Step没有拨到1。Step=0时处于连续脉冲模式,时钟不断产生,每个微命令周期只维持一瞬间,状态还没稳定就跳到下一个周期,手工方式根本跟不上。
解决:每次实验开始前把Step拨到1。如果是中途误触,关闭电源重开一次,重新做预设置,不要试着在乱状态下继续。遇到这类问题,多半是硬件开关拨错位,不是实验方案的问题。
4.3 存储器写入后数值不对,且每次写入的值还不一样
现象:执行R0→存储单元后,通过“工具/存储器芯片设置”查看09H的值,发现和R0运算结果不一致,再跑一次得到另一个数。
原因:最常见的原因是存储单元地址不对。实验里B的地址是08H,C的地址是09H。如果做完B+R0→R0后忘了把数据开关改成09H,硬件侧会用AR中的旧地址(08H)执行写入,把结果写到了08H单元。第二次跑由于AR残留值可能又变成了别的地址。
解决:每次执行“存储单元地址→AR”之前,先确认数据开关显示值等于目标地址。显示灯直接反映总线上的数值,从灯上读地址比凭记忆判断可靠。养成一个习惯:把SW7-SW0的二进制读数在纸上写下来再操作。
4.4 运算结果成了负数或者符号位错误
现象:A=03H、B=01H,理论上结果应为04H,但R0和存储单元里是FC或FF之类的值,怎么看都不对。
原因:ALU的S3-S0编码用错。74LS181的某些控制组合执行的是A加B取反或A减B,而不是A加B。微命令表中DR1+DR2→R0(即B+R0→R0)那一行S3-S0=1001、Cn=1,这是A加B标准模式。如果调试时把S3-S0拨成了1010之类,运算类型整个变了。
解决:运算型微命令的S3-S0必须对照芯片手册或实验指导书确认。实验平台上常见的几个编码值得记住:1001加、0110减、1010加反码、0000传送A。出现负数结果时,优先检查S3-S0和Cn这两处,而不是怀疑连线。
4.5 74LS374的锁存时间与总线数据不同步,结果偶尔抖动
现象:数据灯显示正常,但R0的内容时对时错,尤其是快速连续操作两个周期更是如此。
原因:74LS374是边沿触发锁存,数据必须在时钟边沿前稳定一小段时间(建立时间)。如果前一个周期结束时总线数据还在变化,后一个时钟沿立即采样,就可能采到不稳定值。
解决:单击Start之间稍微停顿一秒左右,等数据灯稳定后再做下一步。如果平台支持延长脉冲宽度,把时钟高电平时间调大。出现这个坑不用慌,属于典型的时序问题,不存在硬件故障。
4.6 预设置后DR1、DR2仍然乱码
现象:做完置位后数据灯仍然全亮或闪烁,寄存器输出的值不是预期的全0。
原因:置位端信号是电平有效,要拿掉置位信号后寄存器才能正常工作。有些平台要求在置位后用复位信号清零,或者置位开关需要拨回初始位置。如果实验台没提供复位开关,置位后直接进入正常流程也可以,因为后续LD信号会覆盖旧值。
解决:观察置位后数据灯的变化。如果全亮且不灭,检查置位端是否被后续信号拉住,必要时把置位开关拨回去,再进入下一步。
5. 验证与进阶:用存储器回读和数据灯反推定位实验是否正确
累加器实验做完后,不要直接截图交报告。报告里实验结果部分有表6-2到表6-4三张微命令表,但还有一项验证工作极少被提起:用存储器芯片设置工具回读09H的值。这个回读不只是确认实验成功,更是一个可以用来反查故障的起点。比如当回读值为05H而预期是04H时,先检查R0在运算结束后数据灯的真实值。如果R0本身就是05H,问题出在ALU阶段或其之前的装载;如果R0=04H而存储单元是05H,问题出在写入阶段,多半是地址错或WE时序不对。这种分段定位方法在后续寄存器实验、存储器实验里都能复用。
进阶玩法是把A和B的值改成非对称数据做交叉验证。原始实验A=03H、B存于08H,假设B=01H,结果为04H。你可以把B改成0FH重新做过一遍,预期结果应为12H。若得到的值是其他数,用回读值减去0FH,差值如果等于A值,说明加法正确,问题出在重复装载前的寄存器清理。这种对比测试在虚拟平台上几乎零成本,却能帮你判断到底是数据通路问题还是微命令编码问题。同理,把A拨到80H再跑一次,可以检查符号位在ALU运算和存储器写入过程中是否被截断。
操作过程中另一个直观验证点是数据灯(CP6到CP13对应的八个LED)。这组灯接在总线上,每一拍总线上的数据都会显示出来。完整跑完三段流程后,你可以从灯的变化状态推断内部状态:第一拍A=03H显示,第二拍B的地址08H显示,第三拍B的值显示,第四拍结果是04H显示,第五拍写入地址09H显示。如果第二拍和第三拍之间出现多余的数字,说明某一步多执行了一次源装载。学会用数据灯全程跟踪后,做微程序控制类实验也会轻松很多,因为这类实验的数据通路上,每个微指令周期的特征就是“源端数据出现、目的锁存发生”。
从那以后我每次做寄存器类实验,都会先在纸质草稿上按周期写好每拍的源端和目的端,再照着拨微命令开关,拨完先看灯再按Start,最后用存储器回读收尾。这四步串联下来基本不会出差错,也希望这套顺序能帮你在多思平台上少走弯路。
本文还有配套的精品资源,点击获取