我将尝试向您介绍如何设计数字电路,以解决您所使用的问题:CPU如何实现加法和乘法。
首先,让我们排除直接的问题:编程语言如何有效地评估乘法和加法。答案很简单,他们将它们编译为乘法和加法指令。例如,以下代码:
a = 1 + 1;
b = a * 20;
可以简单地编译成如下形式:
ADD 1 1 a
MUL a 20 b
(请注意,为简单起见,上面的程序集用于一个不存在的虚构CPU)。
至此,您意识到上述答案只是转移了问题并通过硬件魔术解决了问题。后续问题显然是该硬件魔术如何工作?
首先让我们看一个更简单的问题:加法。
首先,我们做一个熟悉的问题,添加常规的以10为底的数字:
17
+28
第一步是将7和8相加。但这将导致15,这不仅仅是个位数。因此,我们进行1:
(1)
17
+28
= 5
现在我们将1、1和2加在一起:
17
+28
=45
因此,我们得到以下规则:
当加法的结果超过一个数字时,我们保留最低有效数字,并向前携带最高有效数字
如果我们有一个数字结转到我们的列中,我们将其与我们要添加的数字相加
现在该解释以2为底的布尔布尔代数了。
因此,在布尔代数中,将0和1加在一起=1。将0和0 = 0加在一起。将1和1 = 10加起来,这是一个多位数,因此我们将1向前进行。
由此我们可以构造一个真值表:
a b | sum carry
-------------------
0 0 | 0 0
0 1 | 1 0
1 0 | 1 0
1 1 | 0 1
由此,我们可以构造两个电路/布尔方程-一个用于求和的输出,另一个用于进位的输出。最幼稚的方法是简单列出所有输入。任何真值表,无论多么大和复杂,都可以用这种形式重新表述:
(AND inputs in first row) OR (AND of inputs in second row) OR ...
这基本上是乘积形式的总和。我们仅查看导致结果为1而忽略0的输出:
sum = (NOT a AND b) OR (a AND NOT b)
让我们用编程语言符号替换AND OR和NOT,以使其更易于阅读:
sum = (!a & b) | (a & !b)
基本上,我们将表转换为:
a b | sum equation
-------------------
0 0 | 0
0 1 | 1 (!a & b)
1 0 | 1 (a & !b)
1 1 | 0
这可以直接实现为电路:
_____
a ------------| |
\ | AND |-. ____
\ ,-NOT--|_____| \ | |
\/ `--| OR |----- sum
/\ _____ ,--|____|
/ `-NOT--| | /
/ | AND |-`
b ------------|_____|
细心的读者此时会注意到,上述逻辑实际上可以实现为单个门-XOR门,该门具有我们的真值表所需的行为:
_____
a ------------| |
| XOR |---- sum
b ------------|_____|
但是,如果您的硬件没有为您提供XOR门,那么上述步骤就是您将如何使用AND,OR和NOT门定义和实现它的方法。
将逻辑门转换为实际硬件的方式取决于所拥有的硬件。可以使用各种物理机制来实现它们,只要该机制提供某种切换行为即可。逻辑门已经实现了从喷水或空气(流体)到晶体管(电子)到掉落的大理石的一切事物。它本身就是一个很大的话题,因此我将简单介绍一下,并说有可能将逻辑门实现为物理设备。
现在我们对进位信号进行相同的操作。由于只有一个条件中的进位信号为真,因此方程式很简单:
carry = a & b
因此,携带很简单:
_____
a ------------| |
| AND |---- carry
b ------------|_____|
将它们组合在一起,我们得到了所谓的半加器:
_____
a ------;-----| |
| | XOR |---- sum
b --;---|-----|_____|
| | _____
| '-----| |
| | AND |---- carry
'---------|_____|
顺便说一下,上述电路的方程式如下:
sum = a ^ b
carry = a & b
半加法器缺少某些内容。我们已经执行了第一条规则-如果结果比结转多了一个数字,但是我们还没有执行第二条规则-如果有进位,则将其与数字相加。
因此,要实现一个完整的加法器,一个可以将多个数字相加的加法电路,我们需要定义一个真值表:
a b c | sum carry
---------------------
0 0 0 | 0 0
0 0 1 | 1 0
0 1 0 | 1 0
0 1 1 | 0 1
1 0 0 | 1 0
1 0 1 | 0 1
1 1 0 | 0 1
1 1 1 | 1 1
现在求和的等式为:
sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)
如上所述,我们可以通过相同的过程来分解和简化方程式,并将其解释为电路等,但是我认为答案太长了。
到现在为止,您应该对数字逻辑的设计有所了解。我还没有提到其他技巧,例如Karnaugh映射(用于简化真值表)和逻辑编译器(例如espresso)(这样您就不必手工分解布尔方程式),但是基本上我已经掌握了这些技巧上面概述:
分解问题,直到可以在单个位(数字)级别工作为止。
使用真值表定义所需的输出。
将表转换为布尔方程并简化方程。
将方程解释为逻辑门。
通过实现逻辑门将您的逻辑电路转换为真实的硬件电路。
这就是真正解决根本(或更底层)问题的方式-很多真相表。真正的创意工作是将诸如MP3解码之类的复杂任务分解为位级别,以便您可以使用真值表进行处理。
抱歉,我没有时间解释如何实现乘法。您可以尝试弄清楚乘法的有效时间,然后以二进制解释它,然后尝试将其分解为真值表,从而对它进行破解。或者,您可以阅读Wikipedia:http : //en.wikipedia.org/wiki/Binary_multiplier