我一直在閱讀關於VHDL編程的文章(不要在前面,所以不能給出標題)。從文本中我很難理解的一個問題是何時使用變量與信號。我認爲我對何時使用信號(內部信號是)有清晰的瞭解,但對變量沒有那麼多。VHDL變量比。 Signal
我注意到文本通常在定義一個進程之前聲明和初始化信號,而在一個進程中聲明一個變量(我猜從未初始化..)。
無論如何,要明確這一點,無論是通過定義還是通過示例將是偉大的!
我一直在閱讀關於VHDL編程的文章(不要在前面,所以不能給出標題)。從文本中我很難理解的一個問題是何時使用變量與信號。我認爲我對何時使用信號(內部信號是)有清晰的瞭解,但對變量沒有那麼多。VHDL變量比。 Signal
我注意到文本通常在定義一個進程之前聲明和初始化信號,而在一個進程中聲明一個變量(我猜從未初始化..)。
無論如何,要明確這一點,無論是通過定義還是通過示例將是偉大的!
變量用於創建序列化代碼,與通常的並行代碼不同。 (序列化意味着命令按順序執行,一個接一個地執行,而不是一起執行)。一個變量只能存在於一個進程內部,並且值的賦值不是平行的。例如,請考慮下面的代碼:
signal a,b : std_logic_vector(0 to 4);
process (CLK)
begin
if (rising_edge(clk)) then
a <= '11111';
b <= a;
end if;
end process;
將投入b
的a
價值的過程中運行之前,並沒有'11111
」。在另一方面,代碼:
signal a,b : std_logic_vector(0 to 4);
process (CLK)
variable var : std_logic_vector(0 to 4);
begin
if (rising_edge(clk)) then
var := '11111';
a <= var;
b <= var;
end if;
end process;
將把價值'11111'
到兩個a
和b
。
坦率地說,根據我的經驗,大多數時間你不需要使用變量,我使用它的唯一地方是在一個循環中,我需要檢查是否有任何一個信號是1:
type BitArray is array (natural range <>) of std_logic;
--...
entity CAU_FARM is
port
(
-- IN --
REQUEST : in BitArray(0 to (FLOW_num -1));
--..
);
end CAU_FARM;
--...
farm_proc: process(CLK_FARM, RESET)
variable request_was_made_var : std_logic;
begin
if RESET = C_INIT then
-- ...
elsif rising_edge(CLK_FARM) then
-- read state machine --
case read_state is
when st_read_idle =>
request_was_made_var := '0';
for i in 0 to (FLOW_num -1) loop
if (REQUEST(i) = '1') then
request_was_made_var := '1';
end if;
end loop;
if (request_was_made_var = '1') and (chosen_cau_read_sig /= 8) then
read_state <= st_read_stage_1;
for i in 0 to (FLOW_num -1) loop
if (i = choice_out_sig) then
ACKNOWLEDGE(i) <= '1';
end if;
end loop;
else
read_state <= st_read_idle;
end if;
------------------------
when st_read_stage_1 =>
--...
變量旨在用於在過程中存儲值。因此它的範圍是有限的。與綜合硬件的關係往往不那麼直接。
變量也會立即得到值,而信號不會。下面的兩個過程有同樣的效果:
signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5);
process (CLK)
Variable TEMP : STD_LOGIC_VECTOR(0 to 5);
begin
if (rising_edge(clk)) then
TEMP := IP;
IP <= NEXTP;
NEXTP <= TEMP(5) & TEMP(0 to 4);
end if;
end process;
signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5);
process (CLK)
begin
if (rising_edge(clk)) then
IP <= NEXTP;
NEXTP <= IP(5) & IP(0 to 4);
end if;
end process;
這是因爲更新獲得計劃,但並沒有真正暫未改變。 <=
包括時間元素。
變量:臨時位置;它們用於在「過程」中存儲中間值。
信號:更新信號值。運行過程由信號變化激活。當過程運行時,系統中的所有信號保持不變。
差異:
變量:他們是局部的,沒有延遲;過程中聲明
信號:他們是全球性的(之前開始);由於電線延遲;在關鍵字開始之前聲明
這很有幫助,謝謝。 – doddy 2015-04-17 17:01:34
在旁註上,變量不能只存在於進程中(也可能存在於進程中),而且它們可以是可從多個進程訪問的共享變量(請參閱:http://www.ics.uci.edu/~jmoorkan/vhdlref/var_dec.html)。
變量 - 他們是當地的一個過程,作爲變量得到一個新值其價值就更新。
共享變量 - 就像變量,但它們可以從不同的進程訪問。
信號 - 它們的範圍越大,每一個過程可以訪問體系結構或特定的塊中聲明的信號(如果有的話)。在進程暫停或遇到等待語句後,值會更新。
隨着VHDL-2000/2002更新,共享變量不允許與常規類型一起使用。相反,它們只能用於受保護的類型。受保護的類型不允許分配。因此,共享變量更像是對象的句柄,而不是變量。 – 2017-05-12 17:03:55
謝謝你們兩位!我選擇了LLya的答案,因爲答案明確指出只有變量**存在於序列化代碼的進程中。看起來你們都說同樣的事情,但對我來說,'唯一'這個關鍵詞使得它更加清晰。 – doddy 2013-03-25 17:55:54