TD: Représentation des nombres, opérateurs de calcul séquentiels et combinatoires

Un multiplieur de nombres représentés en virgule fixe

Nous disposons d’un module de calcul Multiplieur calculant le produit P de deux nombres A et B. Les nombres A et B sont deux entiers signés codés sur 8 bits ;

Question 1  : Déterminez les valeurs minimales et maximales pouvant être atteintes par A et B.

Question 2  : Déterminez les valeurs minimales et maximales pouvant être atteintes par P. En déduire le nombre de bits nécessaires au codage de P.

Nous voulons utiliser ce module pour traiter une représentation en virgule fixe de nombres réels. Pour cela les nombres A et B seront interprétés de la façon suivante:

  • Les 4 bits de poids fort représentent la partie entière du nombre.

  • Les 4 bits de poids faible représentent la partie fractionnaire du nombre.

  • Nous nommerons cette représentation FIX4.4

Question 3  : Déterminez sous la forme de fraction rationnelle les valeurs maximales et minimales pouvant être atteintes par A et B.

Question 4  : Faut il modifier le multiplieur pour calculer la multiplication ?

Question 5  : Où se situe la virgule dans le résultat P ?

Nous voulons coder le résultat en représentation FIX4.4, cela nécessite de tronquer la sortie P.

Question 6  : Quels bits de P devons nous conserver ?

Nous voulons mettre en place un dispositif de saturation si le nombre P n’est pas représentable en FIX4.4.

Question 7  : Déterminez une condition simple permettant de détecter un dépassement de capacité sur un nombre positif, et permettant de choisir la valeur maximale atteignable dans ce cas.

Question 8  : Déterminez une condition simple permettant de détecter un dépassement de capacité sur un nombre négatif, et permettant de choisir la valeur minimale dans ce cas.

Architecture de multiplieurs entiers

Nous voulons construire un module de calcul Multiplieur calculant le produit P de deux nombres A et B. Les nombres A et B sont deux entiers non signés codés sur 4 bits ; Dans une première étape, nous construirons une version combinatoire du multiplieur.

Question 1  : En utisant les expressions analytiques $\textbf{A}=\sum_{i=0}^{3} A_i.2^i$ et $\textbf{B}=\sum_{i=0}^{3} B_i.2^i$ exprimez le résultat P sous la forme de deux sommes imbriquées.

Question 2  : Posez le calcul de la multiplication de A par B comme vous l’avez appris à l’école primaire en base 10 et en utilisant les produits partiels exprimés dans la question 1

Question 3  : Quelle fonction logique simple permet de calculer chaque produit partiel ?

Nous supposons que nous disposons des portes logiques suivantes:

  • additioneur 1 bit : $\{cout, s\} = a + b + Cin$

  • fonctions logiques élémentataires à 2 entrées (et, ou, inverseur,...)

Question 4  : Faites le schéma d’une architecture de traitement combinatoire réalisant la multiplication en utilisant ces portes logiques.

Question 5  : En supposant que le temps de calcul de chacune des portes logiques est de 1 (dans une unité arbitraire), calculez le temps de calcul du multiplieur.

Question 6  : Généralisez le précédent résultat pour un multiplieur $N \times N$

Nous voulons maintenant calculer la multiplication de manière itérative et séquentielle.
Le code SystemVerilog suivant est proposé:

module multiplieur2( input  logic [3:0] A,
                     input  logic [3:0] B,
                     output logic [7:0] P ,
                     input  logic valid_in,
                     output logic valid_out,
                     input  logic clk) ;

logic [1:0] cmpt ;
logic       ena;
logic [4:0] somme ;

always @(*) somme <= P[7:4] + (B[cmpt] ? A : 4'd0) ;

always @(posedge clk)
    if(valid_in) begin
        P    <= 0 ;
        cmpt <= 0 ;
        ena  <= 1 ;
        valid_out <= 1'b0 ;
    end else begin
        P <= {somme,P[3:1]} ;
        valid_out <= 1'b0;
        if (ena) begin
           cmpt <= cmpt + 1 ;
           if(cmpt == 3) begin
              ena       <= 1'b0 ;
              valid_out <= 1'b1;
           end
        end
    end
endmodule

Question 7  : Complétez le chronogramme suivant.

Question 8  : Quel est le rôle des signaux valid_in et valid_out ?

Question 9  : Faites un schéma de la structure de calcul utilisée.

Question 10  : Déterminez approximativement le temps de calcul de la structure pour un multiplieur NxN.

Correction des exercices

La correction sera disponible après la dernière séance de TD correspondant.