【问题标题】:What does "others=>'0'" mean in an assignment statement?赋值语句中的“others=>'0'”是什么意思?
【发布时间】:2014-10-22 09:37:32
【问题描述】:
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 是什么? =&gt; 是做什么的?

【问题讨论】:

标签: if-statement process vhdl fpga


【解决方案1】:

cmd_r 定义为 std_logic_vector,或 unsignedsigned 信号。让我们看看这个信号类型是如何定义的:

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');

【讨论】:

  • 我相信 VHDL-2008 可以实现最后一点代码。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    ( others =&gt; '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 =&gt; '0' 代表聚合类型的所有其他元素。在这种情况下,cmd_r 的类型和子类型,其中子类型指示指定 std_logic_vector 元素的范围索引。

    表达式'0' 必须是元素类型,聚合(others =&gt; '0') 代表cmd_r 子类型的值,由'0' 的每个cmd_r 元素组成在这种情况下。

    【讨论】:

      【解决方案4】:

      表达式 (others=&gt;’O’) 表示所有元素都分配给“0”。
      如果cmd_r 是 8 位,那么它会将00000000 分配给cmd_r。如果 cmd_r 是二维的,那么同样的东西将是 (others =>(others =>'0'))。

      【讨论】:

      • 似乎是额外的句法噪音。为什么不只允许cmd_r&lt;= '0'
      • 这会产生歧义。有时这会将 LSB 分配为零。我有一个发生这种情况的代码。所以我总是确保当一个向量出现时,如果它应该为零,那么不会丢失语法。只是为了避免额外的调试工作。
      • @S.N.不确定它会编译。您必须明确分配所有电线。
      • 如果 cmd_r 声明为:signal cmd_r : unsigned (7 downto 0),我还能使用:cmd_r '0') 将 cmd_r 中的所有位设置为零吗?
      猜你喜欢
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 2011-08-15
      • 2017-02-20
      • 2012-05-07
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多