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
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
Mögliches Duplikat von [Häufigkeit von Montgomery Multiplier] (http://stackoverflow.com/questions/42274589/frequency-of-montgomery-multiplier) – Hida
Wenn Sie 3 sequentielle Bühne verwenden, dann sollten Sie in der Lage sein, sie gleichzeitig auszuführen Frequenz denke ich. –