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é:
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.