2014-01-25 45 views

回答

1

是的,在VHDL過程中使用的變量是可合成的。

+0

但是,這將如何納入綜合網表。或者等效硬件如何看起來像 – Maximus

+1

這取決於你使用變量的方式。它可以表示組合邏輯(門)或寄存器,取決於在時鐘進程中使用它之前還是之後分配它。 –

3

正如Brian Drummond所寫,您可以合成具有變量的流程,網表結果取決於變量是在分配之前還是之後讀取的。

如果變量被讀之前分配,則變量將來自先前時間到當前時間的值 ,和存儲(通常觸發器 或鎖存器)是必需的,以保持狀態隨着時間的推移。示例代碼,其中兩個 sigvar將導致觸發器,由於可變var分配之前被讀取 :

process (clk_i) is 
    variable var : std_logic; 
begin 
    if rising_edge(clk_i) then 
    sig <= var; 
    var := arg; 
    end if; 
end process; 

如果變量之後分配讀取,那麼任何一個變量值是 未使用,所以沒有存儲在網表中實現。因此該變量僅用於產生中間值,例如以便於編寫代碼。 實施例的代碼,其中僅sig將導致觸發器,由於可變 var分配後讀取:

process (clk_i) is 
    variable var : std_logic; 
begin 
    if rising_edge(clk_i) then 
    var := arg; 
    sig <= var; 
    end if; 
end process; 

在更復雜的(現實的)代碼,它可能難以確保變量 僅分配後讀取,因此不會推斷意外存儲 (觸發器或鎖存器)。一種有用的編碼風格是在代碼的開頭爲所有變量分配 未知('X')。如果在 指定之前讀取變量,則通常會在模擬和調試時發現該錯誤。 示例代碼:

process (clk_i) is 
    variable var : std_logic; 
begin 
    if rising_edge(clk_i) then 
    var := `X`; -- Ensure variable assign before any use to avoid storage 
    var := arg; 
    sig <= var; 
    end if; 
end process; 

注意,在模擬它通常需要額外的努力包括在波形 變量; ModelSim例如在 單獨的「本地」視圖中顯示過程變量。如果保持狀態的變量不在 波形中,則調試要困難得多,因爲波形然後是 只顯示了一半的故事。

因此,一種實用的編碼風格是在變量中只使用變量中的中間值,因此在分配後總是進行讀取。

+1

+1爲了很好的解釋。如果「如果變量在*之前/之後被讀取」,你會考慮重寫「如果變量被使用*之前/之後」嗎?我認爲,在這種情況下具體說明會使你的觀點更有效。 – rick

+0

文字相應更新;好點子。 –