我設計了一個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
可能更適合http://electronics.stackexchange.com/ – toolic
您的FPGA工具可能已經決定使用不同類型的乘法器來優化配置。您需要使用約束約束工具的自由度。但坦率地說,我很難理解你想要做什麼。這些看似隨機的計數器值是什麼?爲什麼test_mul16通過寄存器傳遞乘法以延遲輸出?在使用之前,reg0不會被設置爲一個值。 – Hida
有幾個問題來確認問題。這是一個計時問題嗎?你是否說過,當執行一個乘法器時,設計的時鐘頻率爲1.55Ghz,但當串行乘法器執行時,只有500Mhz的時間?有一個狀態變量(count),似乎在做很多無用的循環,所以我相當肯定這是一個後端計時問題,但想確認一下。 –