我设计了一个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 :(得分:0)
好的,基于Hida说这是一个时间问题的评论,我认为这里可能会发生一些事情。我可以帮助你改善时间,但我不确定我们能达到1.5Ghz。您应该告诉我们您使用的是哪个供应商。
你有一个if复位,但你不重置所有变量。只要你知道你没有任何未初始化的东西,这是可以的。但真正的问题是许多新的FPGA技术,如果你不必要的话,不要让你使用重置。我注意到你正在使用输入a和b重新设置x和y。你必须这样做吗?如果您不必分别将x和y复位到a和b,则可以将它们从复位中移除,这将有助于提高时序。
您的状态机(使用变量状态)并不热。你可以看一下使用一个热点的编码,这会给你一点提升。
为此,将40位寄存器计数,将其复位为40&#39; h00001,然后在时钟上将其分配为计数&lt; = {count [38:0],count [39]}; 然后使用单个位来触发你的逻辑。
接下来,看看你是否有一堆一次性的问题。在某些情况下,您有多个if,如果指定相同的变量。这可能没问题,但是合成器可能不得不解决一些问题,如果你用不同的方式编码它可能效率不高。尝试使用案例陈述。如果您遵循上述一个热门建议,您的案例陈述将是这样的 情况(计数) 40&#39; d11:开始 做一些事情 结束 40&#39; d12:开始 做一些其他的事情 结束 等等... ENDCASE
最后,同样在你的IF中,你有一些if和if else继续。将那些按摩到上面的这个案例陈述中,因为你基本上可以优先考虑27,28和39的计数。对于一个变量,这些值之间可以而且应该没有优先权。该值为27,28或39,或其他东西,逻辑将永远不会选择一个状态而不是另一个状态。
如果你做了一些改变,你的速度应该会提高。真的想知道哪家供应商说你打1.5Ghz。