Ich habe einen 16 * 16 Montgomery Multiplikator entworfen. Der Code verwendet einen 16 * 16-Multiplikator, um drei Multiplikationen durchzuführen. Die Multiplikationen werden nacheinander unter Verwendung des gleichen Multiplizierers ausgeführt, und das Ergebnis jeder Multiplikation wird in den Registern gespeichert. Der einzelne 16 * 16-Multiplizierer arbeitet mit einer Frequenz von ungefähr 1550 MHz, aber die Frequenz des Montgomery-Multiplizierers (der einen einzelnen 16 * 16-Multiplizierer dreimal verwendet) wird auf fast 500 MHz reduziert, wenn die drei Multiplikationen in Reihe ausgeführt werden. Ich möchte den Frequenzabfall vermeiden und möchte ihn mit der Frequenz eines einzelnen Multiplikators betreiben. Brauche Hilfe dabei.Frequenz von Montgomery Multiplier
Der Code ist vorgesehen, zusammen mit. (Nur Multiplikationen in diesem Fall vorgesehen sind. Ergänzungen, Verschiebung der Einfachheit halber ausgeschlossen wurde)
`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
Möglicherweise besser geeignet für http://electronics.stackexchange.com/ – toolic
Ihr FPGA-Tool möglicherweise entschieden, dass eine andere Art von Multiplikator ist optimal für die Konfiguration. Sie müssen die Freiheit des Werkzeugs mithilfe von Einschränkungen einschränken. Aber ehrlich gesagt fällt es mir schwer zu verstehen, was Sie zu tun versuchen. Was sind diese scheinbar zufälligen Zählerwerte? Warum übergibt test_mul16 die Multiplikation über Register, um die Ausgabe zu verzögern?Und reg0 wird nicht auf einen Wert gesetzt, bevor es benutzt wird. – Hida
Ein paar Fragen, um das Problem zu bestätigen. Ist das eine Timing-Frage? Sagen Sie, dass das Design auf eine Taktfrequenz von 1,55 GHz bei der Ausführung eines einzelnen Multiplikators getaktet ist, aber nur mal auf 500 MHz, wenn serielle Multiplikatoren ausgeführt werden? Es gibt eine Zustandsvariable (count), die scheinbar viele Zyklen macht, also bin ich ziemlich sicher, dass es sich um eine Backend-Timing-Frage handelt, die ich aber bestätigen möchte. –