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
是什么? =>
做了什么?
答案 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'))。