2013-04-22 131 views
1

複製代碼我有一個代碼清單是充滿了類似下面的代碼,但更大的塊。避免在VHDL

if (m = '00000') then 
    done <= '1'; 
else 
    done <= '0'; 
end if; 

有沒有使這個像類似的#define一個C的功能,這樣我就不用寫相同的代碼所有的地方的什麼辦法?

回答

4

此代碼是不是擺在首位VHDL,所以你還有其他的事情擔心。 (這是多一點VHDL-像編輯後)

值得慶幸的是VHDL無關像C的#定義。相反,它具有正確抽象的工具,例如包(非常粗略,C++名稱空間但是正確),函數和過程。

這允許你寫

done <= test_zero(m); 

假設done是一個信號(或done := test_zero(m);如果它是一個變量)

test_zero是那麼功能,像

function test_zero (word : in std_logic_vector) return std_logic is 
begin 
    if word = (word'range => '0') then 
     return '1'; 
    else 
     return '0'; 
    end if; 
end test_zero; 

其中(因爲它使用「範圍」屬性)將使用不同大小的「m」。

您將結束與實用功能的集合:讓他們在一個包,並使用它們整個項目。

的包裝通常會出現兩個部分:包規範(有點像右做了C頭文件)

package my_tools is 

    function test_zero (word : in std_logic_vector) return std_logic; 

end my_tools; 

和含有封裝體的實施方式中

package body my_tools is 

    function test_zero (word : in std_logic_vector) return std_logic is 
     ... 
    end test_zero; 

end my_tools; 

要使用它,它被編譯成一個庫(我們將使用默認的庫「work」,這個庫已經在每個VHDL文件中由一個隱含的library work;聲明)。然後,你可以選擇做在包在你的代碼可見的一切:

use work.my_tools.all; 

或做只有一個函數可見:

use work.my_tools.test_zero; 

或使其明顯,任何閱讀代碼,其中神祕的「 test_zero「函數來自:

done <= my_tools.test_zero(m); 

如果您已經使用C++命名空間,您將認識到這些不同的策略。

什麼使得VHDL等效的「命名空間正確地完成」是VHDL編譯器使用這些聲明來自動跟蹤依賴關係並編譯正確的位,而不需要額外的#includes和外部工具,如必須與makefile保持同步的makefile手工編寫的實際代碼。