2015-11-25 28 views
0

我寫了一個對浮點數組內容進行求和的進程。該陣列長度爲6,具有相同的值6次,0.5。所以數組的總和是3.0。[VHDL]爲什麼在sum循環中需要一個輔助變量

的過程是這樣的:

signal array_sum : float32 := to_float(0.0); 
begin 
.... 

sum_proc:process(clk) 
begin 
    if(rising_edge(clk)) then 
     for i in 0 to size_array - 1 loop 
      array_sum <= array_sum + array_float(i); 
     end loop; 
    result <= array_sum; 
    end if; 
end process; 

這樣做的結果是1.5 ..

但是如果我使用輔助值,它的工作原理,其結果是3.0:

sum_proc:process(clk) 
    variable sum_aux : float32; 
begin 
    sum_aux := to_float(0.0); 
    if(rising_edge(clk)) then 
     for i in 0 to size_array - 1 loop 
      sum_aux := sum_aux + array_float(i); 
     end loop; 
    result <= sum_aux; 
    end if; 
end process; 

我似乎無法理解爲什麼發生這種情況。有人可以解釋嗎?

此外,sum_aux初始化爲0.0需要在開始內完成,否則結果不正確。這是因爲只有begin內的代碼被執行多次?

回答

1

要回答以相反的順序這些問題:

sum_aux := to_float(0.0);是必需的,因爲如果沒有這個,變量將保持設定的最後一次運行過程中的價值。請記住,你的總和線看起來像sum_aux := sum_aux +,所以沒有重置,它會變得越來越大。

您的第一個示例不起作用,因爲信號分配僅安排在下一個增量循環中進行,它們在到達時不會實際發生。所有進程在當前週期運行後將發生另一個增量循環。

考慮到這一點,你的「和」只是不斷安排同另外的0.0 + 0.5,那麼array_sum當前值的分配調度result之前。我期望以下序列:

  1. 觀察到第一個時鐘沿。 0.0 + 0.5評價n次。該過程中特定信號的最終分配優先,所以這些結果中的最後一個(0.5)被安排。 array_sum現在仍然是0.0
  2. result計劃分配此值0.0
  3. 過程結束;預定的信號分配現在發生。
  4. 觀察下一個時鐘沿。 0.5 + 0.5評估n次。這些結果中的最後一個(1.0)已計劃。 array_sum現在仍然是0.5
  5. result分配此值0.5
  6. 過程結束;預定的信號分配現在發生。

等等。然後我會期望result在每個後續時鐘邊沿上繼續增加0.5

+0

很好的解釋!非常感謝 –