2013-04-09 76 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上,兩個程序塊都會執行,您無法知道哪一個會最後執行,因此它可能在不同的模擬器上產生不同的結果。