华科软院计算机组成原理实验整理

前言

一共应该是四次实验,但是最后只检查实验二和实验四。

关于这些实验的说明,老师给的时间是一个星期,从前一周的星期四晚上开始讲解,到接下来一周的周四就要检查实验成果。而且,由于接下来的那一周的周二还有考试,同样是计算机组成原理的考试,所以老师应该是隐晦地降低了要求,最后只要求检查实验结果,并且要理解实验原理(这个最后检查的时候要问),然而,却不管这个实验是否是独立做出来的,可以讨论,可以从网上找参考。

基于这些情况,我决定使用计算机学院在慕课上给的实验材料,因为那个材料可以找到的参考资料比较多,而实验助教给的那份材料就先放在一边。毕竟最终的目的是理解实验原理。

实验一

暂时按下不表。

实验二

一、实验目的

  • 熟悉 Logisim 软件平台。
  • 掌握运算器基本工作原理
  • 掌握运算溢出检测的原理和实现方法;
  • 理解有符号数和无符号数运算的区别;
  • 理解基于补码的加/减运算实现原理;
  • 熟悉运算器的数据传输通路。

二、实验环境

Logisim 是一款数字电路模拟的教育软件,用户都可以通过它来学习如何创建逻辑电路,方便简单。 它是一款基于 Java 的应用程序,可运行在任何支持 JAVA 环境的平台,方便学生来学习设计和模仿数字逻辑电路。Logisim 中的主要组成部分之一就在于设计并以图示来显示 CPU。当然 Logisim 中还有其他多种组合分析模型来对你进行帮助,如转换电路,表达式,布尔型和真值表等等。同时还可以重新利用小规模的电路来作为大型电路的一部分。

http://www.cburch.com/logisim/docs.html

三、实验内容

1. 八位串行可控加减法电路设计

利用已经封装好的全加器(封装 1)设计 8 位串行可控加减法电路,其(指八位串行可控加减法器)引脚电路如下图所示

八位串行可控加减法电路引脚定义

封装 1 的电路如下图所示:

封装 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

已经封装好的电路可以在其他电路中直接拖拽使用,一位加法器 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。


华科软院计算机组成原理实验整理
http://fanyfull.github.io/2021/11/25/华科软院计算机组成原理实验整理/
作者
Fany Full
发布于
2021年11月25日
许可协议