J'ai conçu un multiplicateur 16 * 16. (fonctionnant à la fréquence de 1550 MHz) J'utilise alors le même multiplicateur pour effectuer trois multiplications en série en mettant des registres en entrée qui servent à modifier les opérandes d'entrée. Le résultat des multiplications est stocké dans les registres. Lorsque trois multiplications sont effectuées en série, la fréquence se réduit à 500 MHz. Je veux éviter la diminution de la fréquence et vouloir la faire fonctionner à la fréquence du multiplicateur unique. Comme le multiplicateur unique nécessite certains cycles d'horloge pour terminer l'opération, nous attendons donc quelques cycles d'horloge avant de multiplier les nouveaux opérandes. Un compteur est utilisé à cette fin. Le compteur compte les cycles d'horloge et fournit le délai nécessaire pour terminer la multiplication. Le processus est complété comme suit: La première multiplication est démarrée, puis nous attendons quelques cycles d'horloge pour calculer le résultat, le résultat est ensuite stocké dans le registre et le multiplicateur est fourni avec de nouveaux opérandes, encore une fois le multiplicateur a besoin de cycles d'horloge, ce processus se poursuit trois fois. Je veux juste que tout ce code fonctionne à la fréquence du multiplicateur unique qui est presque 1500 MHz.Fréquence du multiplicateur
Le code est donné ci-dessous
////3 multiplications are carried out in this module
`define m 11
`define mbar 245
module test_mul(a,b,clk,reg2,reset);
input [15:0] a,b;
input clk,reset;
output reg [31:0] reg2;
reg [15:0] x,y;
reg [31:0] reg0,reg1;
reg [5:0] count;
wire [31:0]p;
test_mul16 a1 (x,y,clk, p);
always @ (posedge clk)
begin
if (reset)
begin x <= a; y <= b; count= 6'd0; end // first operands given
else begin // and counter started
if (count == 11) // first multiplication completed
reg2 <= p; // result moved to register
if (count == 12)
begin x <= reg0[15:0]; y <=`mbar; end // new operands
if (count == 27) // second multiplication completed
reg1 <= p; // second result to register
else if (count == 28)
begin // new operands for 3rd multiplication
x <= reg1[15:0];
y <= `m;
end
else if (count == 39) // multiplication completed
begin
reg2 <= p; // result moved to register
end
count = count+1; // counter incremented
end
end
endmodule
//// this multiplier operates at a frequency of 1550 MHz
//// This is then called in the upper module
module test_mul16(a,b,clk,reg2);
input [15:0] a,b;
input clk;
output reg [31:0] reg2;
reg [31:0] reg0, reg1;
always @ (posedge clk)
begin
reg0<= a*b;
reg1<=reg0;
reg2<=reg1; // just to increase some clock cycles- nothing else
end
endmodule
Y at-il une raison spécifique pour laquelle il doit fonctionner à 1500 MHz? Je spécule ici, mais j'imagine que le module de niveau inférieur était probablement déduit comme un bloc DSP, sur n'importe quelle puce que vous utilisez. Votre Fmax va prendre un coup dès que vous commencez à ajouter une autre logique autour de cela. Il y a quelques options possibles pour augmenter votre Fmax de 500MHz (qui est déjà élevé), mais je suppose que vous n'obtiendrez pas près de 1500MHz. – gsm
Copie possible de [Fréquence du multiplicateur de Montgomery] (http://stackoverflow.com/questions/42274589/frequency-of-montgomery-multiplier) – Hida
Si vous utilisez 3 étapes séquentielles, alors vous devriez être capable de les exécuter en même temps fréquence je pense. –