2014-08-28 115 views
0
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=>做什么?“其他=>'0'”在转让声明中的含义是什么?

+0

http://www.eda.org/comp.lang.vhdl/FAQ1.html#aggregates – fru1tbat 2014-08-28 13:58:38

+0

(不是一个确切的答案,但由于这是一种常见问题类型的问题,我以为我会指出你对于初学者来说) – fru1tbat 2014-08-28 14:06:57

回答

2

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项目的数组。

语句“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'); 
+3

我相信在VHDL-2008中最后一段代码是可能的。 – fru1tbat 2014-08-28 18:08:21

1

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

3

(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为每个cmd_r在这种情况下,元件的由'0'的子类型的值。

相关问题