“其他=>'0'”在赋值语句中的含义是什么?

时间:2014-08-28 13:38:44

标签: if-statement process vhdl fpga

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;

我知道“&lt; =”指定了作业,但others是什么? =>做了什么?

4 个答案:

答案 0 :(得分:12)

cmd_r定义为 std_logic_vector ,或未签名已签名信号。让我们看看如何定义这种信号类型:

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项的数组具有相同的定义。

陈述&#34;其他=&gt; &#39; 0&#39;&#34;是编码器想要在具有相同值的数组中定义多个项目时VHDL的一个特性。

在您的示例中,数组中的所有项std_logic都设置为&#39; 0&#39;。

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

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

在这种情况下,位0和4被设置为&#39; 1&#39;所有其他位都设置为&#39; 0&#39;。

最后一件事,不可能写下这样的内容:

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

答案 1 :(得分:4)

( 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&#39组成的'0'子类型的值;在这种情况下,cmd_r的每个元素都是。

答案 2 :(得分:2)

它只是意味着将所有位设置为零!!

答案 3 :(得分:2)

表达式(others=>’O’)表示所有元素都分配给了“ 0”。
如果cmd_r为8位,则它将00000000分配给cmd_r。如果cmd_r是二维的,则相同的东西将是(others =>(others =>'0'))。