文章首發於我的個人博客
變量(VARIABLE)
在VHDL中,變量只能在進程(PROCESS)
和子程序(SUBPROGRAM)
中使用。變量不能將信息帶出它所被定義的設計單元。變量的賦值是一種理想的數據傳輸,是立即發生的,沒有延時的。
定義變量的語句
VARIABLE 變量名 : 數據類型;
變量賦值(:=
)
變量名 := 表達式;
其中表達式可以爲運算表達式或者數值。
信號(SIGNAL)
在VHDL中,信號的定義和使用範圍是實體(ENTITY)
,結構體(ARCHITECTURE)
和程序包(PACKAGE)
。在進程和子程序中不允許定義變量。信號是描述硬件系統的基本數據對象,它類似於連線。信號的傳輸過程存在延時。注意,在同一進程中,同一信號賦值目標有多個賦值源時,信號賦值目標獲得的是最後一個賦值源的值,之前的賦值不起作用。
定義信號的語句
SIGNAL 信號名 := 數據類型;
信號賦值(<=
)
信號名 <= 表達式;
信號與變量的區別
(1)在進程中只能將信號加入信號敏感表,而不能將變量加入信號敏感表。因爲只有信號才能將進程外的信息帶入進程內部。
從以下代碼中體會信號和變量的區別。
SIGNAL s1 ,s2 : STD_LOGIC;
SIGNAL svec : STD_LOGIC_VECTOR (0 TO 7);
...
PROCESS ( s1 ,s2 )
VARIABLE v1 ,v2 : STD_LOGIC;
BEGIN
v1 := '1' ; -- 立即將 v1 置位爲 1
v2 := '1' ; -- 立即將 v2 置位爲 1
s1 <= '1' ; -- s1 被賦值爲 1
s2 <= '1' ; -- 由於在本進程中這裏的 s2 不是最後一個,因此此處賦值不起作用
svec(0) <= v1; -- 將 v1 在上面的賦值 1 賦給svec(0)
svec(1) <= v2; -- 將 v2 在上面的賦值 1 賦給svec(1)
svec(2) <= s1; -- 將 s1 在上面的賦值 1 賦給svec(2)
svec(3) <= s2; -- 將最下面的賦予 s2 的值'0' 賦給svec(3)
v1 := '0' ; -- 將 v1 置入新值 0
v2 := '0' ; -- 將 v2 置入新值 0
s2 <= '0' ; -- 由於這是 s2 最後一次賦值 賦值有效,此'0'將上面準備賦入的'1'覆蓋掉 svec(4) <= v1; -- 將 v1 在上面的賦值 0 賦給svec(4)
svec(5) <= v2; -- 將 v2 在上面的賦值 0 賦給svec(5)
svec(6) <= s1; -- 將 s1 在上面的賦值 1 賦給svec(6)
svec(7) <= s2; -- 將 s2 在上面的賦值 0 賦給svec(7)
END PROCESS ;