2

在以下类型和常量声明中,数组中的最后一个值实际上不是2**35-1,因为大于2**31-1的整数不是标准 VHDL (2002)

library ieee;
use ieee.numeric_std.all;

-- Boilerplate elided...

constant X_SIZE : natural := 40; -- Really, anything greater than 32
type x_array is array(natural range <>) of signed;

constant XS : x_array := (
    to_signed(0, X_SIZE),
    to_signed(1, X_SIZE),
    to_signed(2**35 - 1, X_SIZE) -- Not possible!
);

我不能这样做to_signed(2, X_SIZE)**35 - 1,因为没有在signed. 我不愿意输入完整的数组,因为它看起来很笨重,并且X_SIZE将来可能会改变。那么如何在这里创造我想要的价值呢?有没有比直接输入 40 0s 和1s 更好的方法?

4

1 回答 1

2

根据价值,有几种方法可以做到这一点。

  1. 使用十六进制文字对任意数字都有好处,并且会节省一些空间:x"1FFFFFFFF"
  2. 聚合赋值提供了一种指定模式的方法(例如,对于任何大小,一个 0 后跟所有 1):(X_SIZE-1 downto 35 => '0', others => '1')- 但请注意,如果您尝试将其与其他运算符或函数结合使用,编译器将无法推断所需的向量大小。您需要执行以下操作:(X_SIZE-1 downto 35 => '1', 35 downto 0 => '0'). 在这一点上,您可能不会节省太多空间,但取决于您在做什么,它可能会使您的意图比文字更清晰。
  3. 您还可以构建所需类型的单元,并将其移动:shift_left(to_unsigned(1, X_SIZE), 35) - 1.
于 2012-06-27T06:12:59.977 回答