複製代碼我有一個代碼清單是充滿了類似下面的代碼,但更大的塊。避免在VHDL
if (m = '00000') then
done <= '1';
else
done <= '0';
end if;
有沒有使這個像類似的#define一個C的功能,這樣我就不用寫相同的代碼所有的地方的什麼辦法?
複製代碼我有一個代碼清單是充滿了類似下面的代碼,但更大的塊。避免在VHDL
if (m = '00000') then
done <= '1';
else
done <= '0';
end if;
有沒有使這個像類似的#define一個C的功能,這樣我就不用寫相同的代碼所有的地方的什麼辦法?
此代碼是不是擺在首位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手工編寫的實際代碼。