2017-02-16 3 views
-1

저는 16 * 16 몽고메리 승수를 설계했습니다. 이 코드는 16 * 16 배수를 사용하여 세 배의 곱셈을 수행합니다. 곱셈은 ​​동일한 곱셈기를 사용하여 차례로 수행되고 각 곱셈의 결과는 레지스터에 저장됩니다. 단일 16 * 16 승산기는 약 1550 MHz의 주파수에서 수행되지만 3 회의 승수가 직렬로 수행 될 때 Montgomery 승수 (단일 16 * 16 승수를 3 번 ​​사용함)의 주파수는 거의 500 MHz로 감소합니다. 주파수의 감소를 피하고 단일 승수의 주파수에서 작동시키고 싶습니다. 이것에 도움이 필요합니다.몽고메리 승수의 빈도

코드가 함께 제공됩니다. (단 곱셈이 경우에 제공됩니다. 추가, 이동이 단순화를 위해 제외 된)

`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.55Ghz의 클록 주파수에 맞춰 설계를 수행하지만 500Mhz까지만 시간을 계산한다고 말하고 있습니까? 상태 변수 (count)가 있습니다.이 변수는 순환을 전혀하지 않는 것으로 보입니다. 그래서 이것은 백엔드 타이밍 질문이지만 확신하고 싶습니다. –

답변

0

이 좋아, 그래서 히다이은을이다라는 의견에 따라 타이밍 문제, 나는 여기에 몇 가지 일이있을 수 있다고 생각합니다. 타이밍 개선에 도움을 드릴 수는 있지만 1.5Ghz까지 도달 할 수 있을지 확신 할 수 없습니다. 사용중인 공급 업체를 알려야합니다.

if가 재설정되었지만 모든 변수를 재설정하지 않았습니다. 초기화되지 않은 항목이 없다는 것을 알고있는 한 괜찮습니다. 그러나 여기 실제적인 것은 새로운 많은 FPGA 기술입니다. 사용자가하지 않아도 재설정을 사용하지 않으려 고합니다. 나는 당신이 입력 a와 b로 x와 y를 다시 설정하고 있음을 알아 차렸다. 이 일을해야합니까? x 및 y를 각각 a 및 b로 재설정 할 필요가없는 경우 재설정에서 제거 할 수 있으며 이는 타이밍 개선에 도움이됩니다.

상태 머신 (가변 상태 사용)은 뜨겁지 않습니다. 당신은 하나의 뜨겁게 사용하는 코딩을 볼 수 있습니다 그리고 당신에게 조금 부스트를 줄 것이다.

이 작업을 수행하려면 40 비트 레지스터를 카운트하고 40'h00001로 재설정 한 다음 시계에서 해당 카운트로 할당하십시오. < = {count [38 : 0], count [39]}; 그런 다음 개별 비트를 사용하여 논리를 트리거하십시오.

다음으로 if의 모습을 살펴 보시기 바랍니다. 동일한 변수를 여러 개 할당하는 경우가 있습니다. 이것은 아마도 괜찮은 편이지만, 신디사이저는 아마도 일부 작업을해야 할 필요가있을 것입니다. 다른 방식으로 코딩하면 신디사이저가 효율적이지 않을 수도 있습니다. case 문을 사용해보십시오. 몇 가지 물건 끝 40'd12을 을 시작 :이 경우처럼하게 될 경우 문 위 원 뜨거운 제안을 따르는 경우에 40'd11 (계산) 이 다른 물건 끝 등을 시작 .. endcase

마지막으로 IF의 경우에도 if 및 if else가 계속 발생합니다. 기본적으로 할당 수 27, 28 및 39에 우선 순위가 있기 때문에 위의 사례에 대한 설명을 참조하십시오. 한 변수의 경우 값 사이에 우선 순위가 없어야합니다. 값은 27, 28 또는 39이거나 그 밖의 값이며, 논리는 절대로 하나의 상태를 선택할 수 없습니다.

이러한 변경 사항 중 일부를 수행하면 속도가 올라갈 것입니다. 그래도 어떤 공급 업체가 1.5Ghz를 사용한다고 말하는지 알고 싶습니다.