8
votes

Comment concevoir un multiplicateur de tableau 64 x 64 bits dans Verilog?

Je sais comment concevoir un multiplicateur de tableau 4x4, mais si je suis la même logique, le codage devient fastidieux.

  • 4 x 4 - 16 produits partiels
  • 64 x 64 - 4096 Produits partiels.

    Avec 8 advecteurs complètes et 4 demi-advecteurs, combien de advecteurs complètes et de mi-additionneurs ont-ils besoin pour 64 x 64 bits. Comment réduire le nombre de produits partiels? Y a-t-il un moyen simple de résoudre ce problème?


0 commentaires

3 Réponses :


10
votes

Chaque fois que vous devez coder fastidieusement un motif répétitif, vous devez utiliser une instruction Generate:

module array_multiplier_pipeline(clk, a, b, y);

parameter width = 8;

input clk;
input [width-1:0] a, b;
output [width-1:0] y;

reg [width-1:0] a_pipeline [0:width-2];
reg [width-1:0] b_pipeline [0:width-2];
reg [width-1:0] partials [0:width-1];
integer i;

always @(posedge clk) begin
    a_pipeline[0] <= a;
    b_pipeline[0] <= b;
    for (i = 1; i < width-1; i = i+1) begin
        a_pipeline[i] <= a_pipeline[i-1];
        b_pipeline[i] <= b_pipeline[i-1];
    end

    partials[0] <= a[0] ? b : 0;
    for (i = 1; i < width; i = i+1)
        partials[i] <= (a_pipeline[i-1][i] ? b_pipeline[i-1] << i : 0) +
                partials[i-1];
end

assign y = partials[width-1];

endmodule


5 commentaires

Et si je dois le pipeler? Comment ferais-je cela, n'est-ce pas un peu plus difficile?


J'ai maintenant également ajouté une version pipeline à ma réponse (voir Modifier ci-dessus).


Je sais que c'est une longue période. Pour réévaluer votre code? sortie [largeur-1: 0] y; // ne devrait-il pas être [2 * largeur - 1] y;


@chitranna Vous pouvez bien sûr créer également un multiplicateur qui a 2 * taille de sortie de largeur. Mais il aurait besoin de plus de changements que de simplement la taille de 'y': pour le multiplier non signé, il devrait suffire à augmenter la taille des partiels. Pour la signature multipliée, cela devient un peu plus compliqué. (Tant que la largeur d'entrée et de sortie est la même que nous n'avons pas besoin de distinction entre la multiplication signée et non signée), j'aime également ajouter cela dans la pratique, vous utiliseriez quelque chose comme une épargne de transport d'une éventuelle adverse au lieu des adjoncteurs «normaux» pour implémenter la multiplication .


Cela n'aurait-il pas entraîné une perte de précision? De plus, si je veux écrire du code Verilog pour la multiplication du nombre de 64 bits non signé, la précision va bien comprendre? Pouvons-nous en discuter à ce sujet dans la salle de discussion?



0
votes

[Comment] réduire le nombre de produits partiels?
Une méthode quelque peu courante utilisée pour être codage de cabine modifiée :
Au coût de la sélection des addits plus compliqués, il est au moins presque presque leur nombre.
Dans sa forme la plus simple, compte tenu des groupes de trois bits adjacents (chevauchement d'un) de l'un des opérandes, disons, b et sélectionner 0, a, 2a, -2a ou -a comme addend.


0 commentaires

-1
votes

Le code ci-dessous ne génère que la moitié de la sortie. xxx


1 commentaires

C'est toujours une bonne idée de mettre du texte dans votre réponse pour expliquer ce que vous faites, surtout quand il y a déjà une réponse acceptée ou une réponse très appréciée. Lire Comment écrire une bonne réponse