2017-02-16 67 views
-1

我設計了一個16 * 16蒙哥馬利乘數。該代碼使用16 * 16乘法器執行三次乘法。乘法運算使用相同的乘法器一個接一個地執行,每個乘法的結果存儲在寄存器中。單個16×16乘法器以大約1550MHz的頻率執行,但是當三個乘法串聯執行時,蒙哥馬利乘法器(其使用單個16×16乘法器三次)的頻率減小到接近500MHz。我想避免頻率下降,並希望以單倍頻的頻率操作。在這方面需要幫助。蒙哥馬利乘數的頻率

的代碼與一起提供。

`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。您應該讓我們知道您正在使用哪個供應商。

你有一個如果重置,但你不重置所有變量。沒關係,只要你知道你沒有任何未初始化的東西。但這裏真正的事情是許多新的FPGA技術,如果你不需要,不希望你使用重置。我注意到你正在重置x和y,輸入a和b。你必須這樣做嗎?如果不需要重置,分別將x和y分別設置爲a和b,則可以將它們從重置中移除,這將有助於提高時序。

你的狀態機(使用變量狀態)不是一個熱點。你可以看看使用一個熱門代碼,這會給你一點點刺激。

爲此,計數一個40位寄存器,將其重置爲40'h00001,然後在時鐘上將其賦值爲這樣的計數< = {count [38:0],count [39]}; 然後使用個人位來觸發你的邏輯。

接下來,看看你的if你有一堆一次性if。在某些情況下,您有多個if分配相同的變量。這可能是可以的,但合成器可能不得不處理一些事情,如果你對它進行不同的編碼,效果可能不那麼有效。嘗試使用case語句。如果你按照上面的case語句的一個熱的建議會是這樣 情況下(計數) 40'd11:開始 做一些東西 結束 40'd12:開始 做一些其他的東西 結束 等。 endcase

最後,同樣在你的IF中,你有一些if和if其他情況。將上面這些情況按照這種情況說明進行處理,因爲基本上可以優先選擇27,28和39.對於一個變量,值之間可以也應該沒有優先級。值是27,28或39,或其他值,邏輯將永遠不會有一個情況來選擇一個狀態而不是另一個狀態。

如果您進行了一些更改,您的速度應該會提高。真的很想知道哪個廠商說你打1.5Ghz。