2017-02-20 6 views
0

Я разработал множитель 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 
+1

Есть ли какая-либо конкретная причина, по которой он должен работать на частоте 1500 МГц? Я размышляю здесь, но я предполагаю, что модуль нижнего уровня, вероятно, был выведен как блок DSP, на любой чип, который вы используете. Ваш Fmax поразит вас, как только вы начнете добавлять к нему любую другую логику. Есть несколько возможных вариантов увеличения вашего Fmax с 500 МГц (что уже является высоким), но я подозреваю, что вы не получите нигде около 1500 МГц. – gsm

+1

Возможный дубликат [Частота множителя Монтгомери] (http://stackoverflow.com/questions/42274589/frequency-of-montgomery-multiplier) – Hida

+0

Если вы используете 3 последовательных этапа, то вы должны иметь возможность запускать их при одном и том же частота думаю. –

ответ

0

Есть несколько неизвестных в вашем вопросе, так что я сделал несколько предположений, чтобы ликвидировать пробелы. Не стесняйтесь исправить любые неверные предположения, которые я сделал.

В первой части вопроса, вы заявляете:

Когда три умножений выполняются последовательно ...

Первоначально я думал, что вы пытаетесь выполнить три умножений, последовательно, (например, подавая выход одного умножителя на вход следующего, в некотором роде, имея в виду, что размер результата больше входных операндов). Однако после просмотра кода и вашего последующего заявления:

Поскольку для выполнения операции одиночный множитель требует определенных тактовых циклов, мы поэтому ждем нескольких тактов, прежде чем приводить множитель в новые операнды.

Кажется, вы просто хотите передать несколько значений (в данном случае, три) в множитель и получить результаты. Если это так, вы можете просто подать их на нижний уровень модуля test_mul16 на каждый такт. Если модуль нижнего уровня выводится как DSP (предположение, даже если оно не является следующим, будет истинным, если оно будет правильно спроектировано), он будет способен принимать новый набор операндов каждый такт. Количество циклов, необходимых для генерации начального результата , будет зависеть от количества регистров, которые вы выберете вокруг блока DSP, а также количества этапов внутри самого блока (это может варьироваться в зависимости от поставщика и способа его настройки).

Как только вы получите этот исходный результат, вы сможете начинать с ним делать, а также последующие значения (которые будут производиться после каждого такта после этого, при условии, что вы загружаете новый набор в каждом цикле). То, что вы делаете точно, неизвестно (хотя я предполагаю, что это связано с умножением Монтгомери). Эта концепция известна как конвейерная обработка, и это делает FPGA чрезвычайно эффективными при выполнении определенных задач обработки.

Если последующие результаты связаны каким-либо образом, вы можете начать , объединив их. И наоборот, если вам нужно обрабатывать выходные значения отдельно, вы можете мультиплексировать выходы (возможно, используя счетчик для выбора) в отдельные регистры для выполнения дальнейших операций по необходимости.

Последнее примечание, которое стоит упомянуть. В предположении, что вы используете базовый блок DSP, в зависимости от того, какую «дополнительную логику» вы должны реализовать, может быть возможно реализовать некоторые из них в самом блоке DSP (т. Е. Mult, накапливать, округлять, насыщать и т. Д.). функции различаются между поставщиками).

Смежные вопросы