2017-02-16 1 views
-1

J'ai conçu un multiplicateur Montgomery 16 * 16. Le code utilise un multiplicateur 16 * 16 pour effectuer trois multiplications. Les multiplications sont effectuées les unes après les autres en utilisant le même multiplicateur et le résultat de chaque multiplication est stocké dans les registres. Le seul multiplicateur 16 * 16 fonctionne à une fréquence d'environ 1550 MHz, mais la fréquence du multiplicateur de Montgomery (qui utilise trois fois un multiplicateur 16 * 16) est réduite à près de 500 MHz lorsque les trois multiplications sont effectuées en série. Je veux éviter la baisse de fréquence et vouloir l'exploiter à la fréquence du multiplicateur unique. Besoin d'aide pour ça.Fréquence du multiplicateur de Montgomery

Le code est fourni avec. (Seulement multiplications sont fournis dans ce cas. Les ajouts, le déplacement a été exclu pour la simplicité)

`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 

else begin 

if (count == 11) 
reg2 <= p; 
if (count == 12) 
begin x <= reg0[15:0]; y <=`mbar; end 
if (count == 27) 
reg1 <= p; 
else if (count == 28) 
begin 
x <= reg1[15:0]; 
y <= `m; 
end 
else if (count == 39) 
begin 
reg2 <= p; 
end 

count = count+1; 

end 
end 

endmodule 

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; 
end 
endmodule 
+0

Peut-être mieux adapté pour http://electronics.stackexchange.com/ – toolic

+1

Votre outil FPGA peut avoir décidé qu'un type de multiplicateur différent est plus optimal pour la configuration. Vous devrez contraindre la liberté de l'outil en utilisant des contraintes. Mais franchement, j'ai de la difficulté à comprendre ce que vous essayez de faire. Quelles sont ces contre-valeurs apparemment aléatoires? Pourquoi test_mul16 passe-t-il la multiplication à travers des registres pour retarder la sortie?Et reg0 ne reçoit pas de valeur avant d'être utilisée. – Hida

+0

Quelques questions pour confirmer le problème. Est-ce une question de timing? Êtes-vous en train de dire que la conception a cadencé à une fréquence d'horloge de 1,55 GHz lors de l'exécution d'un seul multiplicateur, mais seulement à 500 MHz lorsque des multiplicateurs en série sont effectuées? Il y a une variable d'état (count), qui semble faire beaucoup de cycles de ne rien faire, donc je suis à peu près certain que c'est une question de synchronisation de backend, mais je veux confirmer. –

Répondre

0

Ok, donc basée sur le commentaire où Hida dit que c'est un problème de synchronisation, je pense qu'il pourrait y avoir quelques choses qui se passent ici. Je peux vous aider à améliorer le timing, mais je ne suis pas certain que nous puissions atteindre 1,5 GHz. Vous devez nous indiquer le fournisseur que vous utilisez également.

Vous avez un si avec une réinitialisation, mais vous ne réinitialisez pas toutes les variables. C'est correct tant que vous savez que vous n'avez rien d'initialisé. Mais la vraie chose ici est que de nombreuses nouvelles technologies FPGA, ne veulent pas que vous utilisiez réinitialiser si vous n'avez pas à le faire. Je remarque que vous êtes en train de réinitialiser, x et y avec les entrées a et b. Avez-vous à faire cela? Si vous n'avez pas à réinitialiser, x et y à a et b respectivement, vous pouvez les supprimer de la réinitialisation et cela permettra d'améliorer la synchronisation.

Votre machine d'état, (en utilisant l'état variable) n'est pas une machine à chaud. Vous pouvez regarder coder pour en utiliser un chaud et cela vous donnera un petit coup de pouce. Pour ce faire, faites compter les registres à 40 bits, remettez-le à 40'h00001, puis à l'horloge attribuez-le en tant que tel compte < = {compte [38: 0], compte [39]}; puis utilisez le bit individuel pour déclencher votre logique.

Ensuite, jetez un oeil à vos si vous avez un tas de one-off si. Dans certains cas, vous avez plusieurs si vous assignez la même variable. C'est probablement correct, mais le synthétiseur doit probablement travailler sur certaines choses, et ce n'est peut-être pas aussi efficace que si vous le codiez différemment. Essayez d'utiliser une déclaration de cas. Si vous suivez la suggestion d'un chaud au-dessus de vos déclarations de cas sera comme ce cas (chiffre) 40'd11: commencer faire des choses fin 40'd12: commencer faire quelques autres trucs fin etc .. endcase

Enfin, également dans vos FI, vous en avez si et si d'autre part. Faites-les masser dans cette déclaration de cas ci-dessus, car vous êtes essentiellement assignable priorité aux chefs 27, 28 et 39. Pour une variable, il peut et ne devrait pas y avoir de priorité entre les valeurs. La valeur est soit 27, 28 ou 39, soit quelque chose d'autre, et la logique n'aura jamais l'occasion de choisir un état plutôt qu'un autre.

Si vous effectuez certains de ces changements, votre vitesse devrait augmenter. Voudrais vraiment savoir quel vendeur dit que vous atteignez 1,5 GHz cependant.