Verilog 倍增器的频率

Verilog 倍增器的频率,verilog,fpga,Verilog,Fpga,我设计了一个16*16乘法器。(在1550 MHz的频率下工作)然后,我使用相同的乘法器通过在输入端放置用于更改输入操作数的寄存器来执行三次串联乘法。乘法的结果存储在寄存器中。当三个乘法器串联执行时,频率降低到500 MHz。我希望避免频率降低,并希望在单个乘法器的频率下操作它 由于单个乘法器需要特定的时钟周期来完成操作,因此我们在给乘法器提供新的操作数之前要等待几个时钟周期。用于此目的的计数器。计数器对时钟周期进行计数,并提供完成乘法所需的延迟 该过程按如下方式完成:开始第一次乘法,然后等待几

我设计了一个16*16乘法器。(在1550 MHz的频率下工作)然后,我使用相同的乘法器通过在输入端放置用于更改输入操作数的寄存器来执行三次串联乘法。乘法的结果存储在寄存器中。当三个乘法器串联执行时,频率降低到500 MHz。我希望避免频率降低,并希望在单个乘法器的频率下操作它

由于单个乘法器需要特定的时钟周期来完成操作,因此我们在给乘法器提供新的操作数之前要等待几个时钟周期。用于此目的的计数器。计数器对时钟周期进行计数,并提供完成乘法所需的延迟

该过程按如下方式完成:开始第一次乘法,然后等待几个时钟周期来计算结果,然后将结果存储在寄存器中,并为乘法器提供新的操作数,再次乘法器需要一些时钟周期,此过程继续三次。我只想让整个代码在单乘法器的频率下工作,几乎1500 MHz

代码如下所示

////3 multiplications are carried out in this module

`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       // first operands given
else begin                                    // and counter started 

 if (count == 11)                       // first multiplication completed
reg2 <= p;                              // result moved to register
if (count == 12)
begin x <= reg0[15:0]; y <=`mbar; end   // new operands
if (count == 27)                       // second multiplication completed
reg1 <= p;                            // second result to register
else if (count == 28)
begin                              // new operands for 3rd multiplication
x <= reg1[15:0];
y <= `m;
end
else if (count == 39)            // multiplication completed
begin
reg2 <= p;                       // result moved to register
end
count = count+1;                 // counter incremented
end
end
endmodule


//// this multiplier operates at a frequency of 1550 MHz
//// This is then called in the upper module

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;         // just to increase some clock cycles- nothing else
end
endmodule
///3乘法在此模块中执行
`定义m 11
`定义mbar245
模块测试模块(a、b、时钟、reg2、复位);
输入[15:0]a,b;
输入时钟,复位;
输出reg[31:0]reg2;
reg[15:0]x,y;
reg[31:0]reg0,reg1;
reg[5:0]计数;
金属丝[31:0]p;
测试mul16 a1(x,y,clk,p);
始终@(posedge clk)
开始
如果(重置)

开始你的问题中有一些未知数,所以我做了一些假设来弥补这些差距。请随意更正我所做的任何错误假设

在问题的开头部分,您陈述:

当三个乘法串联执行时

我最初认为您试图以直通方式依次执行三次乘法(即,以某种方式将一个乘法器的输出馈送到下一个乘法器的输入,记住结果的大小大于输入操作数)。但是,在查看代码和后面的语句后:

由于单个乘法器需要特定的时钟周期来完成操作,因此我们在给乘法器提供新的操作数之前要等待几个时钟周期

看起来好像您只想将多个值(在本例中为三个)输入到一个乘法器中并获得结果。如果是这种情况,您只需在每个时钟周期将它们输入较低级别的
test\u mul16
模块即可。如果较低级别模块被推断为DSP(假设;即使不是,如果设计正确,以下内容也适用),则它将能够在每个时钟周期获取一组新的操作数。生成初始结果所需的周期数将取决于您在DSP块周围推断的寄存器数量,以及块本身内的级数(这可能会有所不同,取决于供应商及其配置方式)

一旦得到初始结果,您就可以开始使用它以及后续的值(假设您在每个周期中加载一个新的集合,这些值将在此后的每个时钟周期中生成)。你到底在做什么还不得而知(不过,我假设它与蒙哥马利乘法有关)。这一概念被称为流水线,它使FPGA在某些处理任务中非常有效

如果后续结果以某种方式相关,则可以开始以某种方式组合它们。相反,如果需要单独处理输出值,可以将输出(可能使用计数器选择)多路复用到各个寄存器中,以便根据需要对执行进一步的操作


最后一点值得一提。假设您使用的是底层DSP块,根据您必须实现的“附加逻辑”,可能会在DSP块本身中实现其中一些功能(即mult、accumulate、rounding、saturation等。这些功能因供应商而异)。

是否有特定原因需要在1500MHz下运行?我在这里猜测,但我想低层模块可能被推断为DSP块,在您使用的任何芯片上。一旦您开始添加任何其他相关逻辑,您的Fmax就会受到影响。有几个可能的选项可以将Fmax从500MHz(已经很高)增加到1500MHz。如果使用3个顺序级,可能会重复,那么应该能够以相同的频率运行它们。