回答
是的,在VHDL過程中使用的變量是可合成的。
正如Brian Drummond所寫,您可以合成具有變量的流程,網表結果取決於變量是在分配之前還是之後讀取的。
如果變量被讀之前分配,則變量將來自先前時間到當前時間的值 ,和存儲(通常觸發器 或鎖存器)是必需的,以保持狀態隨着時間的推移。示例代碼,其中兩個 sig
和var
將導致觸發器,由於可變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爲了很好的解釋。如果「如果變量在*之前/之後被讀取」,你會考慮重寫「如果變量被使用*之前/之後」嗎?我認爲,在這種情況下具體說明會使你的觀點更有效。 – rick
文字相應更新;好點子。 –
- 1. 不可合成的VHDL代碼
- 2. 如何使這個VHDL代碼可以合成?
- 3. VHDL代碼綜合錯誤
- 4. 是否有可能將C++代碼集成到Wix項目中
- 5. 是否有可能將代碼分成兩個類文件?
- 6. 是否有可能從代碼內生成衛星組件?
- 7. 的Python:代碼VHDL代碼生成
- 8. State_Machine VHDL代碼,請你檢查它爲什麼不起作用!它合成好
- 9. 是否有可能實現雙通道與下面的代碼
- 10. 是否有可能將C代碼編譯爲Javascript代碼?
- 11. 是否有可能在vhdl中有泛型類型?
- 12. 是否有可能與VS2010
- 13. 是否有可能與Java
- 14. 是否有可能與CSS
- 15. 是否有可能與svg.marker
- 16. 使MP3解碼器VHDL代碼合成的
- 17. 它可能是什麼樣的代碼?
- 18. 是代數聲音合成可能嗎?
- 19. 是否有可能在運行時生成並運行TemplateHaskell生成的代碼?
- 20. 我如何知道我的代碼是否可合成? [Verilog]
- 21. 是否有JavaScript的代碼合同庫?
- 22. 是否有可能取代使用jQuery的顏色代碼?
- 23. 代碼,以生成所有可能的組合
- 24. VHDL:信號s不能合成
- 25. std_logic_vector與賽靈思VHDL整數合成
- 26. 是否有可能直接在代碼中有錯誤描述?
- 27. 是否有可能擁有多個共享代碼的項目?
- 28. 是否有可能在JavaScript函數中有php代碼?
- 29. 從VHDL代碼生成狀態機圖?
- 30. 是否有可能看到代碼合同靜態分析器的進度?
但是,這將如何納入綜合網表。或者等效硬件如何看起來像 – Maximus
這取決於你使用變量的方式。它可以表示組合邏輯(門)或寄存器,取決於在時鐘進程中使用它之前還是之後分配它。 –