2013-04-09 122 views
3

for循环工作正常,但一切都在单个时钟周期内发生。我如何让它每个周期运行一次迭代?如何在多个时钟周期内执行for循环?

`timescale 1ns/10ps 
    module multiplier (clock,multiplier,multiplicand,start,done,product); 

    input [7:0] multiplier ,multiplicand; 
    input   start; 
    input   clock; 
    output [15:0] product; 
    output   done; 

    reg  [15:0] multiplierF ,multiplicandF; 
    reg  [15:0] productF; 
    reg    doneF; 

    integer i; 

    assign product = productF; 
    assign done  = doneF; 

    task rpa_16; 

    input [15:0]  multiplierF; 
    inout [15:0]  productF; 

    assign productF = multiplierF + productF; 

    endtask 

    always @ (posedge clock or posedge start) 
    begin 
    if(start) 
     begin 
      multiplierF  = 0 ; 
      multiplicandF = 0 ; 
      productF  = 0 ; 
      doneF   = 0 ; 
     end 
    else 
     begin 
      multiplierF  = {8'b0,multiplier}; 
      multiplicandF = {8'b0,multiplicand}; 
     end   
    end 


    always @(posedge clk) 
    begin 
      if(!doneF) 
       begin 
        for (i=0;i<7;i=i+1) 
         begin 
          if(multiplicand[i]) 
           begin 
           rpa_16(multiplierF,productF); 
           multiplierF = multiplierF << 1; 
           productF  = productF;      
           end 
          else 
           begin 
           multiplierF = multiplierF << 1; 
           end 
         end 
        doneF = 1; 
       end 
    end 
+0

我不能粘贴波形的图片,但我希望我在每个积极的边缘后增加。但是,最近发生的事情是,for循环在单个时钟周期中执行并且我得到输出。 – user2128682 2013-04-09 04:52:03

回答

4

我不能粘贴波形的图片,但我想我给每个上升沿后增加。但是,最近发生的事情是,for循环在单个时钟周期中执行并且我得到输出。

For循环并不意味着verilog中的任何顺序。如果你想要一个循环,需要8个时钟周期,那么你就必须有一个明确的计数器变量,或许是这样的重写一遍:

always @(posedge clk or negedge reset_) 
if(!reset_) begin 
    multiplierF <= 0; 
    loopcount <= 0; 
    doneF  <= 0; 
end else begin 
    if(!doneF) begin 
    loopcount <= loopcount + 1; 
    if(multiplicand[loopcount]) begin 
     rpa_16(multiplierF,productF); 
     multiplierF = multiplierF << 1; 
     productF = productF;      
    end else begin 
     multiplierF = multiplierF << 1; 
    end 
    end 
    if(loopcount == 7) doneF <= 1; 
end 

而且,你不应该像multiplierF多个始终分配变量块,你会得到非确定性的行为,并可能无法合成。在posedge clk上,两个程序块都会执行,您无法知道哪一个会最后执行,因此它可能在不同的模拟器上产生不同的结果。