2017-02-16 6 views
-1

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 
+0

Möglicherweise besser geeignet für http://electronics.stackexchange.com/ – toolic

+1

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

+0

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. –

Antwort

0

Ok, also auf der Grundlage der Kommentar in dem Hida sagt, dass dies eine ist Timing-Problem, ich denke, es könnte ein paar Dinge hier los sein. Ich kann Ihnen helfen, das Timing zu verbessern, aber ich bin mir nicht sicher, ob wir 1,5 GHz erreichen können. Sie sollten uns auch mitteilen, welchen Anbieter Sie verwenden.

Sie haben ein if mit einem Reset, aber Sie setzen nicht alle Variablen zurück. Das ist in Ordnung, solange du weißt, dass du nichts Uninitialisiertes hast. Aber das wahre Ding hier ist, dass viele neue FPGA-Technologien, wollen Sie nicht, um Reset zu verwenden, wenn Sie nicht müssen. Ich bemerke, dass Sie x und y mit den Eingängen a und b zurücksetzen. Müssen Sie das tun? Wenn Sie x und y nicht auf a bzw. b zurücksetzen müssen, können Sie sie vom Zurücksetzen entfernen, wodurch sich das Timing verbessert.

Ihre Zustandsmaschine, (mit dem variablen Zustand) ist nicht eine heiße. Sie können sehen, Codierung, um eine heiße verwenden, und das wird Ihnen einen kleinen Schub geben.

Um dies zu tun, zählen Sie ein 40-Bit-Register, setzen Sie es auf 40'h00001, und dann auf Uhr zuweisen Sie als solche zählen < = {count [38: 0], zählen [39]}; Verwenden Sie dann das individuelle Bit, um Ihre Logik auszulösen.

Als nächstes werfen Sie einen Blick auf Ihre if's Sie haben eine Reihe von einmaligen if's. In einigen Fällen weisen Sie mehrere ifs auf, die dieselbe Variable zuweisen. Das ist wahrscheinlich in Ordnung, aber der Synthesizer muss wahrscheinlich einige Dinge erledigen, und es ist vielleicht nicht so effizient, wie es sein könnte, wenn Sie es anders kodieren. Versuchen Sie es mit einer case-Anweisung. Wenn Sie den One-Hot-Vorschlag über die Case-Anweisungen folgen wie dieser Fall sein (count) 40'd11: begin ein paar Sachen Ende tun 40'd12: begin Ende etc einig andere Sachen tun .. endcase

Schließlich, auch in Ihrem IFs, haben Sie einige, wenn und wenn auch weiter gehen. Lassen Sie diese in die obige Fallaussage einmassieren, da Sie grundsätzlich den Zählungen 27, 28 und 39 zuweisbar sind. Für eine Variable kann und sollte zwischen den Werten keine Priorität liegen. Der Wert ist entweder 27, 28 oder 39 oder etwas anderes, und die Logik wird niemals einen Fall haben, um einen Zustand gegenüber einem anderen zu wählen.

Wenn Sie einige dieser Änderungen vornehmen, sollte Ihre Geschwindigkeit steigen. Möchte wirklich wissen, welcher Anbieter sagt, dass Sie 1.5Ghz obwohl schlagen.