2017-02-16 4 views
-1

Я разработал множитель 16 * 16 Монтгомери. В коде используется множитель 16 * 16 для выполнения трех умножений. Умножения выполняются один за другим с использованием одного и того же множителя, и результат каждого умножения сохраняется в регистрах. Единичный множитель 16 * 16 работает на частоте около 1550 МГц, но частота множителя Монтгомери (который использует один умножитель 16 * 16 три раза) уменьшается до почти 500 МГц, когда три умножения выполняются последовательно. Я хочу избежать уменьшения частоты и хочу работать с частотой одиночного множителя. Нужна помощь в этом.Частота множителя Монтгомери

код предоставляются вместе с. (Только умножения предусмотрены в этом случае. Дополнения, переключение было исключены для простоты)

`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

Может быть лучше подходит для http://electronics.stackexchange.com/ – toolic

+1

Ваш FPGA-инструмент, возможно, решил, что другой тип мультипликатора более оптимален для конфигурации. Вы должны ограничить свободу инструмента, используя ограничения. Но, честно говоря, мне трудно понять, что вы пытаетесь сделать. Каковы эти, казалось бы, случайные значения счетчика? Почему test_mul16 передает умножение через регистры, чтобы задержать выход?И reg0 не получает значение до его использования. – Hida

+0

Пара вопросов для подтверждения проблемы. Это вопрос времени? Вы говорите, что дизайн приурочен к тактовой частоте 1,55 ГГц при выполнении одного множителя, но только раз до 500 МГц при серийном умножителе? Существует переменная состояния (count), которая, похоже, делает много циклов бездействия, поэтому я вполне уверен, что это вопрос времени в фоновом режиме, но вы хотите подтвердить. –

ответ

0

Итак, основываясь на комментарии, где Хид говорит, что это вопрос синхронизации, я думаю, здесь может быть пара вещей. Я могу помочь вам улучшить время, но я не уверен, что мы можем добраться до 1.5 ГГц. Вы должны сообщить нам, какой поставщик вы используете.

У вас есть с сбросом, но вы не сбрасываете все переменные. Это нормально, если вы знаете, что у вас нет ничего неинициализированного. Но реальная вещь здесь в том, что многие новые технологии FPGA, не хотят, чтобы вы использовали сброс, если вам это не нужно. Я замечаю, что вы перерегистрируете x и y с входами a и b. Вам нужно это сделать? Если вам не нужно перезагружать, x и y в a и b соответственно, вы можете удалить их из сброса, и это поможет улучшить время.

Ваш конечный автомат (используя переменное состояние) не горячий. Вы можете взглянуть на кодирование, чтобы использовать один горячий, и это даст вам небольшой импульс.

Для этого сделайте подсчет 40-битных регистров, сбросьте его до 40'h00001, а затем на часы назначьте его как таковой < = {count [38: 0], count [39]}; , затем используйте отдельный бит для запуска вашей логики.

Далее, взгляните на свое, если у вас есть куча одноразовых, если есть. В некоторых случаях у вас есть несколько, если назначить одну и ту же переменную. Это, вероятно, все в порядке, но синтезатор, вероятно, должен работать над некоторыми вещами, и это может быть не так эффективно, как могло бы быть, если бы вы закодировали его по-другому. Попробуйте использовать оператор case. Если вы будете следовать один-горячее предложению выше ваших заявлений случае будут как этот случае (количество) 40'd11: начать сделать некоторые вещи конца 40'd12: начать сделать некоторые другие вещи конца и т.д .. endcase

Наконец, также в ваших IF, у вас есть некоторые, если и если что-то происходит. Получите те, которые массируются в этом случае выше, потому что вы в основном назначаете приоритет для счетчиков 27, 28 и 39. Для одной переменной может быть и не должно быть приоритета между значениями. Значение равно 27, 28 или 39, или что-то еще, и логика никогда не будет иметь возможность выбрать одно состояние над другим.

Если вы делаете некоторые из этих изменений, ваша скорость должна повышаться. Хотелось бы узнать, какой поставщик говорит, что вы достигли 1.5Ghz.

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