华科软院计算机组成原理实验整理
前言
一共应该是四次实验,但是最后只检查实验二和实验四。
关于这些实验的说明,老师给的时间是一个星期,从前一周的星期四晚上开始讲解,到接下来一周的周四就要检查实验成果。而且,由于接下来的那一周的周二还有考试,同样是计算机组成原理的考试,所以老师应该是隐晦地降低了要求,最后只要求检查实验结果,并且要理解实验原理(这个最后检查的时候要问),然而,却不管这个实验是否是独立做出来的,可以讨论,可以从网上找参考。
基于这些情况,我决定使用计算机学院在慕课上给的实验材料,因为那个材料可以找到的参考资料比较多,而实验助教给的那份材料就先放在一边。毕竟最终的目的是理解实验原理。
实验一
暂时按下不表。
实验二
一、实验目的
- 熟悉 Logisim 软件平台。
- 掌握运算器基本工作原理
- 掌握运算溢出检测的原理和实现方法;
- 理解有符号数和无符号数运算的区别;
- 理解基于补码的加/减运算实现原理;
- 熟悉运算器的数据传输通路。
二、实验环境
Logisim 是一款数字电路模拟的教育软件,用户都可以通过它来学习如何创建逻辑电路,方便简单。 它是一款基于 Java 的应用程序,可运行在任何支持 JAVA 环境的平台,方便学生来学习设计和模仿数字逻辑电路。Logisim 中的主要组成部分之一就在于设计并以图示来显示 CPU。当然 Logisim 中还有其他多种组合分析模型来对你进行帮助,如转换电路,表达式,布尔型和真值表等等。同时还可以重新利用小规模的电路来作为大型电路的一部分。
http://www.cburch.com/logisim/docs.html
三、实验内容
1. 八位串行可控加减法电路设计
利用已经封装好的全加器(封装 1)设计 8 位串行可控加减法电路,其(指八位串行可控加减法器)引脚电路如下图所示
封装 1 的电路如下图所示:
初始电路如下:
完成电路如下:
完成之后,可以使用上面的引脚区域进行测试:
按:这个引脚的 X 和 Y 输入可以一位一位地点击来改变其数值。
一些测试用例:
- 1. x=0000 0000,y=0000 0001,sub=0;s=0000 0001,Cout=0,OF=0
- 2. x=0000 1000,y=0000 0101,sub=1;s=0000 0011 - Cout=1,OF=0
- 3. x=0100 1000,y=0100 0001,sub=0;s=1000 1001 - Cout=0,OF=1
- 4. x=0000 0111,y=1000 0111,sub=1;s=1000 0000,Cout=0,OF=1
实验原理:
输入:
- 操作数 1 为 \(X\),\(X\) 的 8 位数据 \(X_7 \sim X_0\),操作数 2 为 \(Y\),\(Y\) 的 8 位数据 \(Y_7 \sim Y_0\)。
- 最低位进位 \(Cin\)。
- 加减法控制项 \(Sub\)。
输出:
- 运算结果 \(S\) 的 8 位数据 \(S_7 \sim S_0\)。
- 最高位进位 \(Cout\)。
- 有符号运算溢出判断 \(OF\)。
首先,研究一下预置部件一位全加器 FA。
对于一位加法,显然有输入:
- 操作数 1:x
- 操作数 2:y
有输出:
- 本位和:s
- 进位产生:Cout
则有:
- \(0 + 0 = 0\),进位 \(0\)
- \(0 + 1 = 1\),进位 \(0\)
- \(1 + 0 = 1\),进位 \(0\)
- \(1 + 1 = 0\),进位 \(1\)
然而,在实际的运算中,对于一位加法,还有从低位进位引入的进位值,在运算中不可忽略,我们把这个进位值记作 Cin,同样要与 x 和 y 一起参与加法运算。
那么对于一位加法运算,有 x,y 以及 Cin 三个输入数据,同时有 s 和 Cout 两个输出数据。
对于这个运算过程,其逻辑表达式为
\[ \begin{split} Cout &= X_i \cdot Y_i + Cin \cdot (X_i \oplus Y_i) \\ S_i &= X_i \oplus Y_i \oplus Cin \end{split} \]
根据一位加法的原理,可以设计出一位全加器 FA:
已经封装好的电路可以在其他电路中直接拖拽使用,一位加法器 FA 在其他电路中的效果如图所示:
将 8 个 FA 的进位链串联即可得到 8 位串行加法器。
将 8 个一位全加器 FA 的进位链串联即可得到 n 位加法器,由于补码符号位也可以参与运算,所以此电路既可以用于有符号数运算,也可以用于无符号数运算,但二者在溢出检测上有一定区别,这里 OF 的判定以有符号数加法运算是否溢出为标准。
按:存疑。为什么要以有符号数加法运算是否溢出为标准。
教材给出了溢出的定义,即:运算结果超出数据类型所能表示的数据范围的现象称为溢出。有多种方法可以检测溢出,课本上给出了 3 种常用的方法来检测溢出。
溢出检测方法 1. 根据操作数和运算结果的符号位是否一致来进行检测
在有符号运算加法中,只有当两个符号相同的数相加时才有可能产生溢出,因此,可以根据操作数与运算结果的符号位是否一致来进行检测。
设 \(X_f\),\(Y_f\) 分别为两个操作数的符号位,\(S_f\) 为结果的符号位,\(V\) 为溢出标志位,\(V = 1\) 时即表示溢出,那么有逻辑表达式:
\[ V = X_f Y_f \overline{S}_f + \overline{X}_f \overline{Y}_f S_f \]
这个逻辑表达式表明,有符号加法运算溢出的条件是:两个操作数都是正数结果却为负数,或者两个运算数都是负数结果却是正数。
溢出检测方法 2. 根据运算过程中,最高数据位与符号位的进位位是否一致进行检测(推荐)
设运算时最高数据位产生的进位信号为 \(C_d\),符号位产生的进位信号为 \(C_f\),那么相应的检测逻辑表达式为:
\[ V = C_d \oplus C_f \]
这个表达式表明,运算过程中最高数据位的进位 \(C_d\) 与符号位的进位 \(C_f\) 不同步时,就表明有符号运算结果发生了溢出。
可以用异或门实现。
溢出检测方法 3. 利用变形补码进行检测
略。暂时用不到,而且讲课的时候有讲。
对于这个封装好的 8 位串行加法器,采用的是上述的方法 2 来实现 OF 的溢出检测。
在电路中,我们把最高数据位 \(X_6\),\(Y_6\) 的运算结果的进位输出 \(Cout_6\) 与符号位 \(X_7\),\(Y_7\) 的运算结果的进位输出 \(Cout_7\) 一同送入 XOR gate 进行判定,结果送 OF,实现检测功能。
然后,我们来研究八位串行可控加减法器的实现。
再次给一下八位串行可控加减法器的输入输出引脚:
输入:
- 操作数 1 为 \(X\),\(X\) 的 8 位数据 \(X_7 \sim X_0\),操作数 2 为 \(Y\),\(Y\) 的 8 位数据 \(Y_7 \sim Y_0\)。
- 最低位进位 \(Cin\)。
- 加减法控制项 \(Sub\)。
输出:
- 运算结果 \(S\) 的 8 位数据 \(S_7 \sim S_0\)。
- 最高位进位 \(Cout\)。
- 有符号运算溢出判断 \(OF\)。
之前已经给出了 8 位串行加法器的电路实现,相当于已经有了“加法”功能。根据这个思路,在本实验中,需要完成“减法”功能,以及“加减法控制”功能。
实验文件中已经给的 8 位串行加法器的实现:
预备知识:补码减法
对补码加法有:
\[ [x]_补 + [y]_补 = [x + y]_补 (mod \; M) \]
对补码减法有:
\[ [x]_补 + [-y]_补 = [x - y]_补 \]
根据以上规则,把补码减法转换为补码加法。这样,我们就可以简单地利用“加法器”来实现减法运算。
“加减法控制”功能与 Sub。
这里建议 Sub 值为 1 时表示减法运算,Sub 为 0 时表示加法运算。
有符号数运算溢出检测 OF?
采用和上述八位串行加法器一样的思路。
最后再贴一次参考测试用例:
- 1. x=0000 0000,y=0000 0001,sub=0;s=0000 0001,Cout=0,OF=0
- 2. x=0000 1000,y=0000 0101,sub=1;s=0000 0011 - Cout=1,OF=0
- 3. x=0100 1000,y=0100 0001,sub=0;s=1000 1001 - Cout=0,OF=1
- 4. x=0000 0111,y=1000 0111,sub=1;s=1000 0000,Cout=0,OF=1
再贴一次完成电路:
2. 四位先行进位电路
根据下图定义的输入输出引脚完成 4 位先行进位电路。
初始电路:
完成电路:
实验原理:
首先研究一下输入输出:
输入序列 \(G4 \; P4 \; G3\) \(P3 \; G2 \; P2 \; G1 \; P1 \; Cin\)
输出序列 \(C4 \; C3 \; C2\) \(C1 \; G^* P^*\)
1. 输入:0000 0001 1 输出:0001 00
2. 输入:0000 0111 0 输出:0011 00
3. 输入:1111 0000 0 输出:1100 10
4. 输入:1111 1110 0 输出:1111 10
并行进位加法器的进位电路,74181 包含了 74182。