乘数的频率

时间:2017-02-20 12:38:23

标签: verilog fpga

我设计了一个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

1 个答案:

答案 0 :(得分:0)

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

在问题的最初部分,您声明:

  

当串联执行三次乘法时...

我最初认为你试图按照馈送方式顺序执行三次乘法(即,以某种方式将一个乘法器的输出馈送到下一个乘法器的输入中,同时记住结果的大小大于输入操作数)。但是,在查看代码和后来的声明之后:

  

由于单个乘法器需要某些时钟周期才能完成操作,因此我们等待几个时钟周期再给出新操作数的乘法器。

似乎您只想将多个值(在本例中为三个)输入到乘数中并获得结果。如果是这种情况,您可以在每个时钟周期将它们简单地送入较低级test_mul16模块。如果将较低级别的模块推断为DSP(假设;即使如果设计不正确,则以下将保持为真),它将能够在每个时钟周期采用一组新的操作数。生成初始结果所需的周期数取决于您在DSP模块周围推断的寄存器数量,以及模块本身内的级数(这可能会有所不同,具体取决于供应商以及它是如何配置的。)

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

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

值得一提的最后一点。假设您正在使用基础DSP模块,根据您必须实现的“附加逻辑”,可以在DSP模块本身中实现其中的一些(即多重,累加,舍入,饱和等。供应商之间的功能不同。)