在以下类型和常量声明中,数组中的最后一个值实际上不是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 0
和1
s更好的方法?
答案 0 :(得分:2)
根据价值,有几种方法可以做到。
x"1FFFFFFFF"
(X_SIZE-1 downto 35 => '0', others => '1')
- 但是要注意,如果您尝试将其与其他运算符或函数组合,编译器将无法推断出所需的向量大小。您需要执行以下操作:(X_SIZE-1 downto 35 => '1', 35 downto 0 => '0')
。此时你可能不会节省太多空间,但取决于你正在做什么,它可能会使你的意图比文字更清晰。shift_left(to_unsigned(1, X_SIZE), 35) - 1
。