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
Peut-être mieux adapté pour http://electronics.stackexchange.com/ – toolic
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
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. –