2015-04-05 76 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时,该行仍然有效,例如,如果长度取决于泛型。