2017-02-20 2 views
0

Ich habe einen 16 * 16 Multiplikator entworfen. (Betrieb bei einer Frequenz von 1550 MHz) Dann benutze ich den gleichen Multiplizierer, um drei Multiplikationen in Serie durchzuführen, indem Register am Eingang angelegt werden, die zum Ändern der Eingangsoperanden verwendet werden. Das Ergebnis der Multiplikationen wird in den Registern gespeichert. Wenn drei Multiplikationen in Reihe ausgeführt werden, reduziert sich die Frequenz auf 500 MHz. Ich möchte die Frequenzabnahme vermeiden und möchte sie mit der Frequenz eines einzelnen Multiplizierers betreiben.Frequenz des Multiplikators

Da der einzelne Multiplizierer bestimmte Taktzyklen benötigt, um die Operation abzuschließen, warten wir daher einige Taktzyklen ab, bevor wir die neuen Operanden multiplizieren. Zu diesem Zweck wird ein Zähler verwendet. Der Zähler zählt die Taktzyklen und stellt die Verzögerung zur Verfügung, die erforderlich ist, um die Multiplikation abzuschließen.

Der Vorgang ist wie folgt abgeschlossen: Die erste Multiplikation wird gestartet, dann warten wir auf wenige Taktzyklen, um das Ergebnis zu berechnen, das Ergebnis wird dann im Register gespeichert und der Multiplikator wird mit neuen Operanden versehen, wiederum benötigt der Multiplikator einige Taktzyklen, dieser Prozess wird dreimal fortgesetzt. Ich möchte nur, dass dieser ganze Code mit der Frequenz eines einzelnen Multiplikators arbeitet, der fast 1500 MHz beträgt.

Der Code ist unten angegeben

////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 
+1

Gibt es einen bestimmten Grund, warum es bei 1500 MHz laufen muss? Ich spekuliere hier, aber ich stelle mir vor, dass das Modul der unteren Ebene wahrscheinlich als DSP-Block gedeutet wurde, auf welchem ​​Chip auch immer. Ihr Fmax wird einen Treffer erzielen, sobald Sie damit beginnen, eine andere Logik hinzuzufügen. Es gibt ein paar mögliche Optionen, um Fmax von 500MHz zu erhöhen (was bereits hoch ist), aber ich vermute, dass Sie nicht in der Nähe von 1500MHz ankommen werden. – gsm

+1

Mögliches Duplikat von [Häufigkeit von Montgomery Multiplier] (http://stackoverflow.com/questions/42274589/frequency-of-montgomery-multiplier) – Hida

+0

Wenn Sie 3 sequentielle Bühne verwenden, dann sollten Sie in der Lage sein, sie gleichzeitig auszuführen Frequenz denke ich. –

Antwort

0

Es gibt ein paar Unbekannte in Ihrer Frage sind, so habe ich einige Annahmen gemacht, um die Lücken zu überbrücken. Fühlen Sie sich frei, falsche Annahmen, die ich getroffen habe, zu korrigieren.

Im Anfangsteil der Frage, geben Sie:

Wenn drei Multiplikationen in Serie ...

ausgeführt werden

Ich dachte zunächst versuchen Sie drei Multiplikationen auszuführen, nacheinander, in einer Durchführungsweise (dh Einspeisen des Ausgangs eines Multiplizierers in den Eingang des nächsten in irgendeiner Weise, wobei zu berücksichtigen ist, dass die Größe des Ergebnisses größer ist als die Eingabeoperanden). Nach dem Blick auf den Code und Ihre spätere Aussage:

Da der einzelne Multiplizierer bestimmte Taktzyklen erfordert, um die Operation abzuschließen, warten wir daher für einige Taktzyklen, bevor Multiplikator die neuen Operanden geben.

Es scheint, als ob Sie nur mehrere Werte (in diesem Fall drei) in einen Multiplikator einspeisen und die Ergebnisse erhalten möchten. Wenn dies der Fall ist, können Sie sie einfach in das untergeordnete Modul test_mul16 bei jedem Taktzyklus einspeisen. Wenn das Modul der unteren Ebene als ein DSP abgeleitet wird (Annahme; auch wenn es nicht der Fall ist, wird das Folgende korrekt sein, wenn es richtig entworfen wird), wird es in der Lage sein, einen neuen Satz von Operanden in jedem Taktzyklus zu nehmen. Die Anzahl der Zyklen, die zur Generierung des anfänglichen Ergebnisses erforderlich sind, hängt von der Anzahl der Register um den DSP-Block sowie von der Anzahl der Stufen innerhalb des Blocks ab (dies kann je nach Hersteller und Konfiguration unterschiedlich sein)).

Sobald Sie dieses erste Ergebnis erhalten haben, können Sie beginnen, damit zu arbeiten, sowie nachfolgende Werte (die dann jeden Taktzyklus erzeugt werden, vorausgesetzt, Sie laden in jedem Zyklus einen neuen Satz). Was Sie genau machen, ist unbekannt (obwohl ich annehme, dass es mit der Multiplikation von Montgomery zusammenhängt). Dieses Konzept wird als Pipelining bezeichnet und macht FPGAs bei bestimmten Verarbeitungsaufgaben äußerst effektiv.

Wenn nachfolgende Ergebnisse in irgendeiner Weise zusammenhängen, können Sie kombinieren sie in irgendeiner Weise starten. Umgekehrt können Sie, wenn Sie die Ausgabewerte getrennt behandeln müssen, die Ausgaben (möglicherweise unter Verwendung eines Zählers zur Auswahl) in einzelne Register muxen, um weitere Operationen nach Bedarf auszuführen.

Eine letzte Anmerkung, die erwähnenswert ist. Unter der Annahme, dass Sie einen zugrunde liegenden DSP-Block verwenden, kann es je nach der zu implementierenden "zusätzlichen Logik" möglich sein, einen Teil davon im DSP-Block selbst zu implementieren (dh mult, accumulate, runding, saturation usw.) Funktionen unterscheiden sich zwischen den Anbietern).