在赋值语句中,“others=>'0'”是什么意思?

14
cmd_register: process (rst_n, clk)
begin
   if (rst_n='0') then
    cmd_r<= (others=>'0');
   elsif (clk'event and clk='1') then
    cmd_r<=...;
   end if;
end process cmd_register;

我知道"<="表示赋值,但是others是什么?=>又是做什么的呢?


http://www.eda.org/comp.lang.vhdl/FAQ1.html#aggregates - fru1tbat
(不是一个确切的答案,但由于这是一种常见问题,我认为首先应该指向那里) - fru1tbat
4个回答

33

cmd_r被定义为一个std_logic_vectorunsignedsigned信号。让我们看看这些信号类型是如何定义的:

type std_logic_vector is array (natural range <>) of std_logic; 
type unsigned         is array (natural range <>) of std_logic; 
type signed           is array (natural range <>) of std_logic;

请注意,这3种类型与std_logic项数组具有相同的定义。

语句“Others => '0'”是VHDL的一个特性,当编码者想要在数组中定义多个项目为同一值时使用。

在您的示例中,数组中的所有std_logic项目都设置为“0”。

此语句的另一个应用是将某些项设置为特定值,而将所有其他项设置为默认值:

cmd_r <= (0      => '1',
          4      => '1',
          others => '0');

在这种情况下,第0位和第4位被设置为“1”,而所有其他位都被设置为“0”。

最后要注意的是,没有办法写出这样的东西:

  cmd_r <= (0          => '1',
            4 downto 2 => "111", -- this line is wrong !!!
            others     => '0');

4
我相信使用 VHDL-2008 可以实现最后一段代码。 - fru1tbat

8
它仅仅意味着将所有位都设置为0!!

6

( others => '0')是一个表达式,将元素聚合成复合类型。

在没有看到cmd_r的声明之前,我们可以想象它是一个数组类型,数组类型是由一个或多个元素组成的复合类型。

聚合将一个或多个值作为元素组合成复合类型。

 aggregate ::=
     ( element_association { , element_association } )

请注意,必须使用开放和关闭括号。

对于记录类型,这些元素可以通过名称在位置上关联,对于数组类型,则可以通过索引值位置进行关联。

 element_association ::=
     [ choices => ] expression

元素的关联由选择决定。
 choices ::=  choice { | choice }

元素关联可以涵盖多个选项。
 choice ::=
        simple_expression
     | discrete_range
     | element_simple_name
     | others

一个选择可以代表一个或多个元素。

对于记录类型或带有枚举类型索引类型的数组类型,使用元素简单名称。

others总是最后一个选择,并代表该类型的所有剩余选择。可以通过目标赋值来发现类型。在某些情况下,需要显式提供类型,例如限定表达式。

元素关联others => '0'代表聚合类型的所有其他元素。在这种情况下,cmd_r的类型和子类型可以通过子类型指示指定std_logic_vector的元素范围索引。

表达式'0'必须是元素类型,聚合体(others => '0')代表cmd_r的每个元素中包含'0'的子类型的值。


6
表达式 (others=>’O’) 的意思是所有元素都被分配为 '0'。
如果 cmd_r 是 8 位,则将 00000000 分配给 cmd_r。如果 cmd_r 是二维的,则同样会分配相同的值 (others =>(others =>'0'))。

1
似乎是多余的语法噪音。为什么不直接允许 cmd_r<= '0' 呢? - Motorhead
这将会产生歧义。有时候这只会把最低有效位赋值为零。我曾经遇到过这种情况。所以我总是确保当向量被呈现时,如果应该为零,则不会丢失语法。只是为了避免额外的调试工作。 - TRoa
1
@S.N. 不确定它是否能编译。您必须明确指定所有电线的分配。 - Ayoub Bargach
如果cmd_r被声明为:signal cmd_r : unsigned (7 downto 0),我还能使用:cmd_r <= (others => '0')将cmd_r中的所有位设置为零吗? - Cindy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接