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
是什么?=>
又是做什么的呢?
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
是什么?=>
又是做什么的呢?
cmd_r被定义为一个std_logic_vector、unsigned或signed信号。让我们看看这些信号类型是如何定义的:
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');
( 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'
的子类型的值。
others=>’O’
) 的意思是所有元素都被分配为 '0
'。cmd_r
是 8 位,则将 00000000
分配给 cmd_r
。如果 cmd_r 是二维的,则同样会分配相同的值 (others =>(others =>'0'))。cmd_r<= '0'
呢? - Motorhead