基于proteus的算术逻辑单元构建

举报
yd_295385051 发表于 2023/11/09 23:22:31 2023/11/09
【摘要】 一、 实验目的和要求1. 掌握算术逻辑单元(ALU)的设计方法。2. 理解微型计算机的基本组成和工作原理。二、 实验原理1. ALU算术逻辑单元(Arithmetic and Logical Unit,简称 ALU)是中央处理器(CPU)的重 要组成部分, 主要用于实现算术和逻辑运算。在这个实验中, 我们需要设计一个 16 位的 ALU,该 ALU 能够根据不同的输入和控制信号进行各种算术和...

一、 实验目的和要求

1. 掌握算术逻辑单元(ALU)的设计方法。

2. 理解微型计算机的基本组成和工作原理。

二、 实验原理

1. ALU

算术逻辑单元(Arithmetic and Logical Unit,简称 ALU)是中央处理器(CPU)的重 要组成部分, 主要用于实现算术和逻辑运算。在这个实验中, 我们需要设计一个 16 位的 ALU,该 ALU 能够根据不同的输入和控制信号进行各种算术和逻辑操作。

下图为 ALU 的逻辑结构和物理结构:

1: ALU 的逻辑结构和物理结构


下图为 ALU 的真值表: 首先, ALU 接收两个 16 位的输入 x y,以及 6 个控制 信号 zx nzzy ny f no。通过设置这些控制信号, 可以完成各种运算。例如, 当需 要计算 x 1 时,设置 zx nx 0x 将保持不变;设置 zy ny 1y 将先置为 0 然后取反,即 y = 1;设置 f 1no 0,那么输出结果 out = x 1

运算结果还会影响标志位 zr ng。当运算结果 out = 0 时,将 zr 置为 1,否则置为 0;当运算结果 out > 0 时, ng 置为 0,否则置为 1。这两个标志位可以用于进一步的 条件分支或者循环操作。


zx

nx

zy

ny

f

no

out(ng)

1

0

1

0

1

0

0

1

1

1

1

1

1

1

1

1

1

0

1

0

1

0

0

1

1

0

0

x

1

1

0

0

0

0

y

0

0

1

1

0

1

x

1

1

0

0

0

1

y

0

0

1

1

1

1

x

1

1

0

0

1

1

y

0

1

1

1

1

1

x + 1

1

1

0

1

1

1

y + 1

0

0

1

1

1

0

x 1

1

1

0

0

1

0

y 1

0

0

0

0

1

0

x + y

0

1

0

0

1

1

x y

0

0

0

1

1

1

y x

0

0

0

0

0

0

x&y

0

1

0

1

0

1

x|y

1: ALU 的真值表


为了实现这个 16 ALU,我们需要设计以下几个部分:

1. 16 位复用器: 用于实现 zx zy 的功能。当控制信号 zx zy 1 时, 相应的输 x y 将被置为 0;否则保持不变。

2. 16 位非门: 通过将 16 位非门和十六位复用器结合用于实现 nx ny no 的功能。 当控制信号 nxny no 1 时, 相应的输入 xy 或输出结果 out 将被取反; 否则 保持不变。

3. 16 位与门: 用于实现逻辑与操作。当控制信号 f 0 时, 输出结果 out 为输入 x 与输入 y 的逐位与操作。

4. 16 位全加器: 用于实现算术加法操作。当控制信号 f 1 时, 输出结果 out 为输 x 与输入 y 的和。

5. 两个 8 路或门, 一个或门和一个非门: 用于实现 zr 标志位。当输出结果 out 0 时, zr 置为 1,否则置为 0

通过将这些部分组合在一起, 我们可以构建一个功能完备的 16 ALU,实现各种算术和 逻辑运算,为 CPU 提供核心计算功能。 下面我将介绍其中较为复杂部分的实验原理:


2. 16 位复用器

一个 16 位复用器(也被称为多路复用器或 MUX)是一种基础数字设备, 它接收多个 输入, 并根据控制信号选择其中一个输入在输出端输出。对于 16 位复用器来说, 它接收 16 位宽的两个输入,并根据一个单一的二进制控制信号来选择一个输入。

如果我们将两个 16 位输入分别标记为 A[15 : 0] B[15 : 0],控制信号标记为 S,那 么复用器的操作可以描述为: S = 0 时, 复用器输出 A[15 : 0],当 S = 1 时, 复用器输 B[15 : 0]。也就是说,复用器根据控制信号 S 状态选择一个输入在输出端显示。

在这个实验中, 16 位复用器被用于实现 zx zy 的功能。当控制信号 zx zy 1 时, 相应的输入 x y 将被置为 0,这是通过将 0 和原始输入连接到复用器的输入端, 后使用 zx zy 作为控制信号来实现的。如果 zx zy 1,复用器输出 0;否则, 复用 器输出原始输入。 16 位复用器的真值表如下所示


S

A[15:0]

B[15:0]

Out[15:0]

0

0000...0000

0000...0001

0000...0000

0

· · ·

1

0000...0001

· · ·

0000...0000

0000...0010

· · ·

0000...0001

0000...0001

· · ·

0000...0001

1

· · ·

0000...0001

· · ·

0000...0010

· · ·

0000...0010

· · ·

2: 16 位复用器真值表

3. 16 位全加器

为了构建一个 16 位全加器, 我们需要将 16 个一位全加器串联在一起。对于第 i 个全 加器(0 <= i <= 15), 其输入是 Ai Bi 以及来自第 (i-1) 个全加器的进位输出 Cout,i 1 (对于第 0 个全加器, Cout, 1 通常设为 0),其输出是 Sumi Cout,i。所以, 我们可以得到:


Sumi = Ai ⊕ Bi ⊕ Cout,i − 1 (1)


Cout,i = AiBi + Cout,i − 1 (Ai ⊕ Bi ) (2)

16 个全加器的 Cout,15 即为 16 位全加器的总体进位输出。 16 位全加器的总体和输 出是 Sum0 Sum15 16 位的拼接。

需要注意的是,由于在实际的硬件设计中,所有的全加器是同时工作的,所以在设计 16 位全加器的时候, 要考虑如何处理进位的延时, 即第 (i-1) 个全加器的 Cout,i 1 可能在 Ai Bi Cout,i 计算完成之后才得到。这是数字逻辑设计中常见的一个问题, 通常需要使 用特殊的电路结构(如查表加法器或者 Carry-lookahead adder)来解决。 16 位全加器的真 值表如下表所示:



A

B

Cin

S

Cout

0000000000000000

0000000000000000

0

0000000000000000

0

0000000000000000

0000000000000001

0

0000000000000001

0

...

...

...

...

...

1111111111111110

0000000000000001

0

1111111111111111

0

1111111111111111

0000000000000001

0

0000000000000000

1

...

...

...

...

...

1111111111111111

1111111111111111

0

1111111111111110

1

1111111111111111

1111111111111111

1

1111111111111111

1

3: 16 位全加器器的概括性真值表

全加器的逻辑结构和物理结构如下图所示:

2: 加法器的逻辑结构和物理结构


三、 实验内容和实验步骤

1. 16 位复用器

16 位复用器的实验步骤如下:

(1) 提供两个一位二进制输入 A B

(2) 提供一个选择输入 S

(3) 使用 AND 门和 OR 门实现输出的计算: Output = SA + SB

(4) 提供两个 16 位二进制输入 A0 15 B0 15

(5) 提供一个选择输入 S

(6) 对于 i 0 15,执行操作: 使用 2-1 线复用器, 输入为 Ai Bi S,输出为 Outputi

(7) Output0 Output15 拼接起来,即为 16 位复用器的输出。

16 位复用器的电路结构如下:


(a) 子电路结构

(b) 芯片封装结构

3: 16 位复用器的电路结构


2. 16 位全加器

16 位全加器的搭建步骤如下:

(1) 提供两个 16 位二进制输入 A0 15 B0 15

(2) 初始化 Cout, 1 0

(3) 对于 i 0 15,执行操作: 使用一位全加器, 输入为 Ai Bi Cout,i 1 ,输出为 Sumi Cout,i

(4) Sum0 Sum15 拼接起来,即为 16 位全加器的和输出。


(5) Cout,15 即为 16 位全加器的进位输出。

16 位全加器的两种电路图如下:

4: 16 位全加器电路结构 1



(a) 子电路结构

(b) 芯片封装结构

5: 16 位全加器的电路结构 2



3. 16 位非门

搭建 16 位非门的步骤如下:

(1) 提供一个 16 位二进制输入 A0 15

(2) 对于 i 0 15,执行操作:使用 1 位非门,输入为 Ai ,输出为 Outputi


(3) Output0 Output15 拼接起来,即为 16 位非门的输出。

16 位非门的电路结构如下:

(a) 子电路结构

(b) 芯片封装结构

6: 16 位非门的电路结构



4. 16 位与门

搭建 16 位与门的步骤如下:

(1) 提供两个 16 位二进制输入 A0 15 B0 15

(2) 对于 i 0 15,执行操作:使用 1 位与门,输入为 Ai Bi ,输出为 Outputi

(3) Output0 Output15 拼接起来,即为 16 位与门的输出。

16 位与门的电路结构如下

(a) 子电路结构

(b) 芯片封装结构

7: 16 位与门的电路结构


5. 两个 8 路或门, 一个或门和一个非门

搭建 8 位或门的步骤如下:

(1) 提供一个 8 位二进制输入 A0 7

(2) 将输入分为 4 对,每对包含 2 个相邻的输入位。

(3) 对于每对输入位,使用 1 位或门,将它们进行或运算,得到 4 个输出位。

(4) 将得到的 4 个输出位分为 2 对,每对包含 2 个相邻的输出位。

(5) 对于每对输出位,使用 1 位或门,将它们进行或运算,得到 2 个输出位。

(6) 最后,使用 1 位或门,将这 2 个输出位进行或运算,得到最终的 1 位输出。

8 位或门门的电路结构如下

(a) 子电路结构 (b) 芯片封装结构

8: 8 位或门的电路结构



6. ALU

实验步骤如下:

(1) 理解 ALU 的工作原理和功能: 首先, 我们需要理解 ALU 的基本工作原理和功能。 ALU CPU 的核心部分,负责执行各种算术和逻辑运算。我们需要学习 ALU 是如 何接收和处理输入的,以及如何根据控制信号来选择执行的运算。

(2) 设计 16 ALU在理解了 ALU 的工作原理和功能后, 我们需要设计一个 16 ALU。我们需要考虑如何实现 ALU 的各种功能, 包括如何处理输入, 如何选择运 算,如何输出结果等。


(3) 电路设计和仿真: 使用电路仿真软件进行电路设计和仿真。在设计过程中, 我们需 要考虑如何使用电路元件(例如, 与门, 或门, 非门, 复用器等) 来实现 ALU 的功 能。在仿真过程中,我们可以观察电路的工作情况,验证我们的设计是否正确。

(4) ALU 的测试: 在完成 ALU 的设计和仿真后, 我们需要对 ALU 进行测试, 以验证 其功能的正确性。我们可以根据 ALU 的真值表, 设置不同的输入和控制信号, 观察 ALU 的输出结果是否与预期相符。

ALU 的电路结构如下

(a) 子电路结构

(b) 芯片封装结构

9: ALU 的电路结构


四、 实验结果与分析

(1) 实验结果

下图展示了 16 ALU 在不同输入状态下的输出结果:


(a) out = 0 (b) out = 1 (c) out = −1



(d) out = x


(e) out = y


(f) out = ¬x


(g) out = ¬y (h) out = −x (i) out = −y

(j) out = x + 1 (k) out = y + 1 (l) out = x − 1




(m) out = y − 1

(p) out = y − x


(n) out = x + y


(q) out = x ∩ y


(o) out = x − y


(r) out = x ∪ y


五、 延申与拓展-在设计 ALU 的真值表时需要考虑哪些因素

设计算术逻辑单元(Arithmetic Logic UnitALU)的真值表是一项关键任务, 因为它 定义了 ALU 的基本运算。在设计 ALU 的真值表时,我们需要考虑以下几个关键因素:

(1) 支持的操作: ALU 真值表需要覆盖所有 ALU 需要支持的操作, 这包括基本的算术 运算(例如加法、减法等) 和逻辑运算(例如与、或、非等)。这些运算的选择应根据 CPU 的具体需求来确定。

(2) 输入和输出的位数: ALU 的输入和输出的位数也会影响真值表的设计。例如, 16 ALU 的输入和输出将有 16 位,这意味着我们需要考虑所有可能的 16 位输入组合。

(3) 控制信号: ALU 的控制信号决定了哪种运算将被执行。真值表需要为每个可能的控 制信号组合定义一个结果。

(4) 结果标志: 许多 ALU 还有一些结果标志, 如零标志(表示结果是否为),负标志 (表示结果是否为负),溢出标志(表示运算是否导致溢出) 等。真值表需要考虑这些 标志的设置。

(5) 硬件实现: 最后, 我们还需要考虑硬件实现的问题。有些运算可能在理论上可行,

在实际硬件中难以实现, 或者实现成本太高。在设计真值表时, 我们需要考虑到这些 因素,确保我们的设计既能满足功能需求,又能在实际硬件中实现。

总的来说, 设计 ALU 的真值表是一项复杂的任务, 需要综合考虑许多因素。通过精 心设计,我们可以创建出一个功能强大、效率高、易于实现的 ALU


六、 实验总结

在本次实验中, 我们成功地设计并实现了一16 位的算术逻辑单元(ALU)。我们首 先设计了组成 ALU 的各个部分, 包括 16 位全加器、 16 位复用器、 16 位非门和 16 位与 门, 然后将这些部分组合在一起, 构建了完整的 ALU。在仿真软件 Proteus 8.9 中运行我 们的设计, 我们得到了与预期相符的结果, 证明了我们的设计是正确的。我们的 ALU 够进行各种基本的算术和逻辑运算,包括加法、减法、取反、逻辑与、逻辑或等。通过设 置不同的控制信号, 我们能够控制 ALU 进行哪种运算, 从而实现了各种复杂的算术和逻 辑操作。此外, 我们的 ALU 还有两个标志位, 用于表示运算结果的符号和是否为零。这些 功能的实现都得到了我们的仿真测试的验证。在实验结果的分析中, 我们发现我们的 ALU 在所有测试用例中都表现得与预期相符。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。