算术逻辑单元(ALU)

发布时间 2023-11-01 18:30:34作者: Neolux_Lee

算术逻辑单元(ALU)

构建一个四位算术逻辑单元,可以实现两个四位二进制数的加减法运算。

减法

一个二进制数字表示如下:

0010

四位可以表示从0~15的十进制数。

若使最高位设置为符号位,0表示正数,1表示负数,那么可以表示从-8~7的十进制数。
则0010表示2.

负数的表示方法有:原码、反码、补码。

  • 原码:符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。
  • 反码:正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
  • 补码:正数的补码是其本身,负数的补码是在其原码的基础上,符号位不变,其余各个位取反,最后+1。

在这里,我们使用补码来表示负数。

补码转换

正数

正数的补码就是其本身。

例如:2 为 \(10_B\),则其补码为 \(10_B\), 存储时为 \(0010_B\)

  • 0 为 \(00_B\),则其补码为 \(00_B\), 存储时为 \(0000_B\)

负数

负数的补码为其反码+1。

例如:2 为 \(0010_B\),表示-2时,最高位符号位为1,算出其反码为 \(101_B\),补码为 \(110_B\),存储时为 \(1110_B\)

\(1110_B = -8\times1 + 4\times1 + 2\times1 + 1\times0 = -2\)

亦可理解成,在0的最前面补上一个1, 然后减去其绝对值。

例如:3 为 \(0011_B\),表示-3时,在0的最前面补上一个1,变为 \(10000_B\),然后减去其绝对值,即 \(10000_B - 0011_B = 1101_B\),存储时为 \(1101_B\)


由此得到,

int add (int a, int b) {
    return a + b;
}
int sub(int a, int b) {
    return add(add(a, ~b), 1);
}

后加的1可以由减法标志决定


算术逻辑单元(Algorithmic Logic Unit, ALU)

ALU Subtract

ALU Add

最后加上三个输出端,分别为是否进位,是否是负数,是否为0.

TODO: Make a 8 bit ALU