Я разработал множитель 16 * 16. (работающий на частоте 1550 МГц). Затем я использую один и тот же множитель, чтобы последовательно выполнять три умножения, помещая регистры на входе, которые используются для изменения входных операндов. Результат умножения хранится в регистрах. Когда три умножения выполняются последовательно, частота уменьшается до 500 МГц. Я хочу избежать уменьшения частоты и хочу использовать ее на частоте одиночного множителя.Частота множителя
Поскольку для выполнения операции одиночный множитель требует определенных тактовых циклов, мы поэтому ждем нескольких тактовых циклов, прежде чем приводить множитель в новые операнды. Счетчик используется для этой цели. Счетчик подсчитывает тактовые циклы и обеспечивает задержку, необходимую для завершения умножения.
Процесс завершается следующим образом: начато первое умножение, а затем мы ожидаем несколько циклов синхронизации для вычисления результата, тогда результат сохраняется в регистре, а множитель снабжен новыми операндами, снова умножитель нуждается в некотором тактических циклов, этот процесс продолжается три раза. Я просто хочу, чтобы весь этот код работал на частоте одиночного множителя, который составляет почти 1500 МГц.
код приведен ниже
////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
Есть ли какая-либо конкретная причина, по которой он должен работать на частоте 1500 МГц? Я размышляю здесь, но я предполагаю, что модуль нижнего уровня, вероятно, был выведен как блок DSP, на любой чип, который вы используете. Ваш Fmax поразит вас, как только вы начнете добавлять к нему любую другую логику. Есть несколько возможных вариантов увеличения вашего Fmax с 500 МГц (что уже является высоким), но я подозреваю, что вы не получите нигде около 1500 МГц. – gsm
Возможный дубликат [Частота множителя Монтгомери] (http://stackoverflow.com/questions/42274589/frequency-of-montgomery-multiplier) – Hida
Если вы используете 3 последовательных этапа, то вы должны иметь возможность запускать их при одном и том же частота думаю. –