Je vais essayer de vous donner une idée de la façon dont les circuits numériques sont conçus pour résoudre les problèmes de traitement numérique en utilisant les problèmes que vous posez: comment les processeurs implémentent-ils les ajouts et les multiplications.
Tout d'abord, permet de résoudre la question directe: comment un langage de programmation évalue-t-il efficacement les multiplications et les ajouts. La réponse est simple, ils les compilent en multipliant et en ajoutant des instructions. Par exemple, le code suivant:
a = 1 + 1;
b = a * 20;
est simplement compilé en quelque chose comme:
ADD 1 1 a
MUL a 20 b
(notez que l'assemblage ci-dessus est pour un CPU imaginaire qui n'existe pas, par souci de simplicité).
À ce stade, vous vous rendez compte que la réponse ci-dessus déplace simplement le problème et le résout par magie matérielle. La question de suivi est évidemment comment fonctionne cette magie matérielle?
Regardons d'abord le problème le plus simple: l'addition.
D'abord, nous faisons un problème familier, en ajoutant des nombres réguliers de base 10:
17
+28
La première étape serait d'ajouter 7 et 8. Mais cela donne 15, ce qui est plus qu'un seul chiffre. Nous portons donc le 1:
(1)
17
+28
= 5
Maintenant, nous ajoutons 1, 1 et 2 ensemble:
17
+28
=45
Ainsi, nous obtenons les règles suivantes:
lorsque le résultat de l'addition est supérieur à un chiffre, nous conservons le chiffre le moins significatif et reportons le chiffre le plus significatif vers l'avant
si nous avons un chiffre reporté dans notre colonne, nous l'ajoutons avec les chiffres que nous ajoutons
Il est maintenant temps d'interpréter les règles ci-dessus dans la base 2 - l'algèbre booléenne.
Donc, dans l'algèbre booléenne, en ajoutant 0 et 1 ensemble = 1. En ajoutant 0 et 0 = 0. Et en ajoutant 1 et 1 = 10 qui est plus d'un chiffre, nous reportons donc le 1.
À partir de cela, nous pouvons construire une table de vérité:
a b | sum carry
-------------------
0 0 | 0 0
0 1 | 1 0
1 0 | 1 0
1 1 | 0 1
À partir de cela, nous pouvons construire deux circuits / équations booléennes - un pour la sortie de somme et un pour la sortie de report. La façon la plus naïve est de simplement lister toutes les entrées. Toute table de vérité, quelle que soit sa taille et sa complexité, peut être reformulée sous cette forme:
(AND inputs in first row) OR (AND of inputs in second row) OR ...
Il s'agit essentiellement de la somme des produits. Nous ne regardons que les sorties qui donnent un 1 et ignorons les 0:
sum = (NOT a AND b) OR (a AND NOT b)
Remplaçons le ET OU et NON par des symboles de langage de programmation pour le rendre plus facile à lire:
sum = (!a & b) | (a & !b)
Fondamentalement, nous avons converti le tableau comme suit:
a b | sum equation
-------------------
0 0 | 0
0 1 | 1 (!a & b)
1 0 | 1 (a & !b)
1 1 | 0
Cela peut être directement mis en œuvre sous forme de circuit:
_____
a ------------| |
\ | AND |-. ____
\ ,-NOT--|_____| \ | |
\/ `--| OR |----- sum
/\ _____ ,--|____|
/ `-NOT--| | /
/ | AND |-`
b ------------|_____|
Les lecteurs attentifs remarqueront à ce stade que la logique ci-dessus peut en fait être implémentée comme une seule porte - une porte XOR qui a commodément le comportement requis par notre table de vérité:
_____
a ------------| |
| XOR |---- sum
b ------------|_____|
Mais si votre matériel ne vous fournit pas de porte XOR, les étapes ci-dessus expliquent comment vous allez le définir et l'implémenter en termes de portes ET, OU et NON.
La manière de convertir les portes logiques en matériel réel dépend du matériel dont vous disposez. Ils peuvent être implémentés à l'aide de divers mécanismes physiques tant que le mécanisme fournit une sorte de comportement de commutation. Des portes logiques ont été mises en œuvre avec tout, des jets d'eau ou des bouffées d'air (fluidique) aux transisiteurs (électronique) aux chutes de billes. C'est un gros sujet à part entière, je vais donc le passer sous silence et dire qu'il est possible d'implémenter des portes logiques en tant que périphériques physiques.
Maintenant, nous faisons de même pour le signal de portage. Puisqu'il n'y a qu'une seule condition où le signal de report est vrai, l'équation est simplement:
carry = a & b
Alors, c'est simple:
_____
a ------------| |
| AND |---- carry
b ------------|_____|
En les combinant ensemble, nous obtenons ce que l'on appelle le demi-additionneur:
_____
a ------;-----| |
| | XOR |---- sum
b --;---|-----|_____|
| | _____
| '-----| |
| | AND |---- carry
'---------|_____|
Au fait, les équations du circuit ci-dessus ressemblent à ceci:
sum = a ^ b
carry = a & b
Le demi-additionneur manque quelque chose. Nous avons implémenté la première règle - si le résultat est supérieur à un chiffre par rapport au report, mais nous n'avons pas implémenté la deuxième règle - s'il y a un report, ajoutez-le avec les chiffres.
Donc, pour implémenter un additionneur complet, un circuit d'addition qui peut ajouter des nombres à plus d'un chiffre, nous devons définir une table de vérité:
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
L'équation de somme est maintenant:
sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)
Nous pouvons suivre le même processus pour factoriser et simplifier l'équation et l'interpréter comme un circuit, etc., comme nous l'avons fait ci-dessus, mais je pense que cette réponse devient trop longue.
Vous devriez maintenant avoir une idée de la façon dont la logique numérique est conçue. Il y a d'autres astuces que je n'ai pas mentionnées, telles que les cartes de Karnaugh (utilisées pour simplifier les tables de vérité) et les compilateurs logiques tels que l'espresso (pour que vous n'ayez pas à factoriser les équations booléennes à la main), mais la base est fondamentalement ce que j'ai décrit ci-dessus:
Décomposez le problème jusqu'à ce que vous puissiez travailler au niveau d'un seul bit (chiffre).
Définissez les sorties souhaitées à l'aide d'une table de vérité.
Convertissez le tableau en une équation booléenne et simplifiez l'équation.
Interprétez l'équation comme des portes logiques.
Convertissez votre circuit logique en circuits matériels réels en implémentant des portes logiques.
C'est ainsi que les problèmes fondamentaux (ou plutôt de bas niveau) sont vraiment résolus - beaucoup, beaucoup de tables de vérité. Le véritable travail de création consiste à décomposer une tâche complexe telle que le décodage MP3 au niveau du bit afin que vous puissiez y travailler avec des tables de vérité.
Désolé, je n'ai pas le temps d'expliquer comment implémenter la multiplication. Vous pouvez essayer de vous y attaquer en déterminant les règles de durée de la multiplication, puis en l'interprétant en binaire, puis essayez de la décomposer en tables de vérité. Ou vous pouvez lire Wikipedia: http://en.wikipedia.org/wiki/Binary_multiplier