2

在 QuestaSim 中编译 VHDL 时,我收到一个我不明白的警告:

(vcom-1514) 范围选择方向 (downto) 不能确定聚合索引范围方向 (to)。

触发警告的代码类似于

signal foo : unsigned(4 downto 0);

在架构之前begin,然后在一些过程中

if foo = (foo'high => '1', foo'high - 1 downto foo'low => '0') then

上面的行将触发警告,而

if foo = (foo'high => '1', foo'low to foo'high - 1 => '0') then

没有,即使fooisdownto和 not的索引方向to

有谁知道为什么在这种情况下我应该使用to而不是使用索引downto

4

1 回答 1

4

聚合体

(foo'high => '1', foo'high - 1 downto foo'low => '0')

具有索引范围方向“到”。您的警告是说:不要仅仅因为您在其中包含一个定义为 'downto' 的数组,就认为它的方向是 'downto'

为什么默认方向是“到”?好吧,我们需要考虑一下这个聚合是什么类型。(来吧 - 这是 VHDL - 它必须有一个类型)。

在我的代码中,它的类型是unsigned. 为什么?好吧,因为我已将它与 type 过程的输入相关联unsigned。在您的代码中,它的类型也是unsigned. 为什么?好吧,因为它是=运算符的右手参数,其左手参数肯定是unsigned。只有一种可能的=运算符版本,即测试两个unsigneds 的版本。

现在,我们需要看看该类型unsigned是如何声明的,当我们这样做时,我们看到它被声明为一个索引类型为 的无约束数组natural

type unsigned is array (natural range <>) of std_logic;

type 的左侧值为natural0。因此,这就是您的聚合具有索引范围方向“到”的原因。


如果执行此代码,您可以看到 VHDL 如何定义聚合上的索引:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity E is
end entity ;

architecture A of E is
  signal foo : unsigned(4 downto 0);
begin

  process
    procedure display (constant foo : in unsigned) is
    begin
      report "foo'left= " & integer'image(foo'left);
      report "foo'right= " & integer'image(foo'right);
      report "foo'high= " & integer'image(foo'high);
      report "foo'low= " & integer'image(foo'low);
     end procedure;
  begin
    display((foo'high => '1', foo'high - 1 downto foo'low => '0'));
    wait;
  end process;

end architecture A;
于 2019-03-19T12:07:17.747 回答