Partage
  • Partager sur Facebook
  • Partager sur Twitter

Circuit combinatoire : multiplieur

Chapitre 4

    5 avril 2020 à 17:56:08

    Bonjour,

    dans le chapitre 4 sur les Circuit Combinatoire (electronique) , lors de l'explication du multiplieur, si je me fis à la table de vérité, l'exemple donnée ne respecte pas la table de vérité. 

    J'ai essayé de multiplier pas à pas et à chaque fois je trouve un truc du genre [infinité de 1]1010 ...

    Je voudrais etre sur d'un truc : le ProductIn c'est bien le résultat du calcul précédent ? je ne saisie pas...

    Merci pour votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      5 avril 2020 à 19:26:20

      Ce serait bien de donner un lien vers le chapitre en question de façon à ce que l'on puisse voir exactement de quoi tu parles ;)
      • Partager sur Facebook
      • Partager sur Twitter
        5 avril 2020 à 21:10:25

        Désolé.

        voici le lien :

        https://openclassrooms.com/fr/courses/5439156-concevez-vos-premiers-circuits-combinatoires/5731636-realisez-un-multiplieur

        L'exemple donnée est 0110 x 0111 . Si je me fis à la table de vérité je n'obtient pas le résultat supposé. Il y a quelque chose que je ne saisi pas.

        • Partager sur Facebook
        • Partager sur Twitter
          5 avril 2020 à 23:44:34

          ProductIn correspond à un résultat d'une opération précédente mais cela reste un nombre sur 1 bit, qui ne peut valoir que 1 ou 0.

          Les opérations additions se font toujours avec 3 entrées : le AiBi, le productIn de l'opération précédente et un éventuel carryIn.

          Chaque entrée étant sur 1 bit (valeur 0 ou 1), le résultat peut valoir soit 0, soit 1, soit 2, soit 3 et donc tenir sur 2 bits :

          • 0 (dec) = 00 (bin)
          • 1 (dec) = 01 (bin)
          • 2 (dec) = 10 (bin)
          • 3 (dec) = 11 (bin)

          Le poids fort du résultat correspondra au CarryIn d'un calcul ultérieur tandis que le poids faible sera le ProductIn du calcul suivant, ou la valeur d'un des bits du résultat final.

          *****

          Histoire de mieux visualiser la chose, voici la description étape par étape avec une image et une explication en dessous à chaque fois.

          *****

          ETAPE 1 :

          Ici, rien de méchant, on a le A0*B0 qui vaut 0, pas de productIn ni de carryIn, donc on peut déjà dire qu'on aura un 0 à la fin du calcul.

          *****

          ETAPE 2 :

          On a Ai*Bi=1, pas de carryIn ni de productIn.

          On faut la somme des 3 : 1+0+0=1, ce qui va donne un 1 pour le ProductIn du calcul suivant et pas de retenue.

          *****

          ETAPE 3 :

          Sur cette étape, on a Ai*Bi=0, mais on se prend aussi un ProductIn=1 de l'étape précédente, et toujours pas de CarryIn.

          On fait la somme : 0+1+0=1, donc on met se 1 en sortie de calcul et pas de retenue pour la suite.

          *****

          ETAPE 4 :

          Ici, pas de ProductIn ni ce CarryIn, on a un Ai*Bi=1 que l'on va tout de suite balancer sur le calcul suivant.

          *****

          ETAPE 5 :

          Là c'est plus intéressant car on a Ai*Bi=1, ainsi qu'un ProductIn=1, et toujours pas de CarryIn.

          On fait la somme : 1+1+0=2, ce qui en binaire donne 10.

          Le poids faible de cette somme (0) est injecté en ProductIn pour l'étape suivante tandis que le poids fort (1) est balancé à gauche et servira plus tard en temps que CarryIn.

          *****

          ETAPE 6 :

          Rien de magique ici : 0+0+0=0

          *****

          ETAPE 7 :

          Rien de magique non plus ici, Ai*Bi=0 et on a pas de ProductIn ni CarryIn, donc on balance le résultat pour la suite.

          *****

          ETAPE 8 :

          Voila encore un exemple intéressant :)

          On a le production Ai*Bi=1, un ProductIn=0 du calcul précédant mais surtout un CarryIn=1 qui nous vient du calcul de l'étape 5 !

          On fait la somme des 3 : 1+0+1=2, soit "10" en binaire.

          Ce qui va donner un 0 en ProductIn du calcul suivant et une retenue qui nous servira beaucoup plus tard.

          *****

          Et je vais m'arrêter là, je te laisse poursuivre la logique.

          -
          Edité par lorrio 5 avril 2020 à 23:59:05

          • Partager sur Facebook
          • Partager sur Twitter
            6 avril 2020 à 22:54:05

            Bonjour,

            Je te remercie d'avoir pris le temps de répondre mais je pense qu'il y a un truc que je saisi pas et ce avant même d'arriver au calcul.   :-(

            Concrètement , à l'étape 3 , je ne sais pas comment tu fais pour trouver Ai*Bi=0. 

            Car pour moi ca a toujours été 1 (voir en bleue). Et même à l'étape 2 tu avais trouvé 1 pour du  1*1 pourtant.

            • Partager sur Facebook
            • Partager sur Twitter
              7 avril 2020 à 3:49:56

              Salut,
              J'ai codé ceci récemment en langage C. Je ne sais pas si les circuits électroniques modernes fonctionnent de cette façon.
              Le '&' est le AND, le '|' est le OR, le '^' est le XOR
              -
              // Simulation d'un additionneur en n'utilisant que des opérateurs logiques (AND, OR, XOR).
              #include <stdio.h>

              // Extraire un bit dans un octet (unsigned ...)
              #define bit(c,b) (((c)>>(b))&1)

              // Calcul du digit résultant de la somme des bits avec le carry.
              #define digit(a,b,c) ( ((a) ^ (b)) ^ (c) )

              // Calcul du carry résultant de la combinaison des bits des nombres et du carry précédent.
              #define carry(a,b,c) ( ((a) & (b)) | ((a) & (c)) | ((b) & (c)) )

              // Programme principal.
              int main() { // et c'est parti ...
                // Pour toutes les valeurs de a et b entre 0 et 255 (un octet).
                for(int a=0; a<256; a++) {
                  for(int b=0; b<256; b++) {
                    int c=0; // Carry de départ.
                    int r=0; // Résultat de départ.
                    // Faire une addition simulée sur 8 bits.
                    for(int i=0; i<8; i++) {
                      r += digit(bit(a,i), bit(b,i), c) << i;
                      c = carry(bit(a,i), bit(b,i), c);
                    } // fin calcul
                    r %= 256; // Ne garder que 8 bits.
                    // Comparer avec la somme modulo 256 (8 bits).
                    if(r != (a+b) % 256) {
                      printf("a=%d,  b=%d,  a+b=%d,  r=%d\n", a, b, (a+b)%256, r);
                    } // fin if
                  } // fin b
                } // fin a
                return(0);
              } // enfin! J'ai fini ...

              -
              Edité par PierrotLeFou 7 avril 2020 à 4:26:02

              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                7 avril 2020 à 9:48:28

                Tu te trompes sur la sélection des Ai*Bi, c'est de la que viens ton erreur ;)

                Souviens toi de tes cours de primaire où tu apprenaient à faire des multiplications sur le papier, c'est la même chose.

                La deuxième ligne de résultat intermédiaire s’obtient en prenant tous les chiffres de A qui l'on multiplie un par un par le deuxième chiffre des B.

                Vu qu'un chiffre B vaut soit 0, soit 1, la ligne est facile à obtenir :

                - si B=0, alors on met toute la ligne à 0 (ce qui explique pourquoi on a 0000 sur la ligne 4)

                - si B=1, alors on recopie la ligne A

                   

                • Partager sur Facebook
                • Partager sur Twitter
                  9 avril 2020 à 13:24:47

                  Bonjour,

                  sur l'aspect "calcul" j'ai compris cela oui. Mais c'est plus sur l'aspect du système avec le schéma de la cellule. 

                  Le "Next product" (Product OUT) : de ce que je comprends chaque bit de résultant de l'adder se trouve tout en bas , dans la partie fléché en vert (résultant des "conditions" d'addition avec le triptique carryIN, productIN et Ai.bi) ? C'est ca ?

                  Ou bien je me trompe.

                  EDIT :

                  Bon finalement je pense avoir compris avec ton explication. Merci.

                  En fait le ProductOUT je l'utilisais pour le calcul suivant (au sens littéral) , de manière "horizontal" , je ne faisais pas "descendre" le productOUT pour le calcul du bas.

                  Alors du coup j'ai fais l'essai avec l'exemple mais je trouve  0101010  , ce qui fait bien 42 mais sur l'exemple du cours c'est 00101010  (donc un "0" de plus) qui fait également 42. D'où vient ce "0" ?

                  Merci.

                  -
                  Edité par HarrietRaymund 9 avril 2020 à 14:14:35

                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 avril 2020 à 20:45:25

                    Chaque bloc dispose d'une entrée Product In, d'une entrée Carry In, et d'une zone de calcul pour le Ai*Bi.

                    Et chaque bloc dispose d'une sortie Product Out et une sortie Carry Out.

                    Ce qui nous donne ceci :

                    Tous ces blocs sont en cascade les uns les autres avec décalage, exactement comme on a représenté la multiplication :

                    Le résultat est donc sur 8 bits.

                    Et pour répondre à ta question, le dernier 0 correspond à la sortie Carry Out du bloc tout en bas à gauche.

                    -
                    Edité par lorrio 9 avril 2020 à 20:46:00

                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 avril 2020 à 20:53:13

                      C'est super. C'est exactement l'explication que j'attendais. 

                      Un grand merci !

                      -
                      Edité par HarrietRaymund 9 avril 2020 à 20:54:55

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Circuit combinatoire : multiplieur

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown