2015-04-05 80 views
1

我是一個學習VHDL的學生,我的教科書中的示例代碼在幾處顯示類似於以下內容的行:「當別人」在VHDL case語句中行?

when "000" => tmp_result <= a and b; 
when "001" => tmp_result <= a or b; 
... 
when others => tmp_result <= (others => '0'); 

我發現VHDL的語法總體上非常不直觀,但我真的不會「得到」這條線。

我真的很困惑,爲什麼上面的線是不是隻是:

when others => tmp_result <= '0' 

爲什麼會這樣呢?

我試過谷歌搜索,但一直沒能找到解釋。

回答

2

STD_LOGIC_VECTOR具有固定大小。所以,當你將值分配給它,而不是明確地定義每個位,你可以只使用

(others => '0') 

表示你想要的其餘位設置爲0。由於變量的大小是固定的,因此編譯器會知道要設置多少位。您可以將其與其他一些陳述混合使用,例如

tmp_result <= (1=>'1', OTHERS => '0'); 

一種情況它可以派上用場是這樣的:

ENTITY test IS 
    GENERIC (n : INTEGER := 7); 
    PORT (a : OUT STD_LOGIC_VECTOR (n DOWNTO 0) 
     ); 
END test; 

你看,我們可以每次都改變大小,這就是爲什麼我們要定義一個變量generic。使用(others => '0')將其設置爲0將使我們不必再一次更改整個程序。

2

這是因爲tmp_result被定義爲std_logic_vector(而不是簡單地STD_LOGIC)。

tmp_result <= '0';    -- tmp_result is std_logic (single-quotes) 
tmp_result <= "0000000";  -- tmp_result is std_logic_vector (double quotes) 
tmp_result <= (others => '0'); -- same as previous line, but does not need to know length of tmp_result 

在分配std_logic_vector的所有位爲相同的值('0',在這種情況下),這是常見的做法是使用語法(others => '0'),基本上轉化爲「給我一個std_logic_vector同一長度爲tmp_result填充'0'「。這樣做更好,因爲當長度爲tmp_result時,該行仍然有效,例如,如果長度取決於泛型。