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、将来変更される可能性があるためです。では、ここで必要な値を作成するにはどうすればよいでしょうか? 0文字通り 40秒とsを入力するよりも良い方法はあり1ますか?

4

1 に答える 1

2

値に応じて、いくつかの方法があります。

  1. 16 進数リテラルを使用すると、任意の数値に適し、スペースを少し節約できます。x"1FFFFFFFF"
  2. 集合代入は、パターンを指定する方法を提供します (例: 任意のサイズに対して、1 つのゼロの後にすべて 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 に答える