回答:
他の人が言ったようにieee.numeric_std
、ieee.std_logic_unsigned
実際にはIEEEパッケージではない、neverを使用してください。
ただし、VHDL 2008をサポートするツールを使用している場合は、新しいパッケージを使用できますieee.numeric_std_unsigned
。これにより、基本的にstd_logic_vector
署名なしのように動作します。
また、明示的に記載されていなかったため、(符号なし)整数からに変換する実際のコード例を次に示しますstd_logic_vector
。
use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));
LoneTechが言うように、use ieee.numeric_std
あなたの友達です。a std_logic_vector
をに変換することもできinteger
ますがsigned
、unsigned
最初にキャストする必要があります(コンパイラーが意味を理解していないため)。VHDLは強く型付けされた言語です。私がきた多くの書かれたこのテーマに私のブログに
基本的に、7segコンバーターを変更してinteger
(またはnatural
、正の数のみを処理する場合は実際に)に変換します-変換は単純な配列ルックアップになります。変換を使用して定数配列を設定し、エンティティで入力として使用する整数を使用してインデックスを作成します。
4ビットカウンターにINTEGER出力SOME_INTEGERがあり、それを4ビットSTD_LOGIC_VECTORに変換するとします。
SOME_VECTOR <= conv_std_logic_vector(SOME_INTEGER, 4);
また、これを使用して、意味のある数字でベクトルを初期化することもできます
SOME_VECTOR <= conv_std_logic_vector(9, 4); -- instead of "1001"
「use IEEE.STD_LOGIC_ARITH.ALL;」を追加する必要があるかもしれません。および/またはSTD_LOGIC_UNSIGNED。
補完的な操作はconv_integer(vector)です。私は比較をするときにこれを使うのが好きです。だから私は宣言するかもしれない
constant SOME_CONSTANT : integer := 999;
そして、後で、ifステートメントでこれを使用できます
if (conv_integer(SOME_VECTOR)=SOME_CONSTANT)
then OTHER_VECTOR <= (others => '0');
end if;
編集:変数を整数として宣言する必要はありません。代わりに宣言をstd_logic_vectorに変更してみてください。+および-演算子はstd_logic_vectorsで機能します。
主な答えが示すように、推奨される方法は次のとおりです。
use ieee.numeric_std.all;
...
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));
ただし、これが推奨される理由と、VHDLが整数をstd_logic_vectorsに変換する一見複雑な方法を持っている理由について詳しく説明したいと思います。
これらのタイプがツールによってどのように表示されるかにかかっています。
standard_logic_vectorは、文字通り1または0の集まりです。10001があります。これは何番ですか?まあ、それは依存します。署名されているか署名されていませんか?Ths SLVは知りませんし、気にしません。何ビット?さて、SLVはどれくらいですか?
整数は符号付きで、通常は32ビットです(正しく覚えている場合)。
ステージ1:整数を短くし、符号なしにします。これがこの部分です。
to_unsigned(my_int, my_slv'length));
「この整数があり、符号なしであり、SLVの長さに収まるようにします。」
ステージ2:次に、これらのビットを取得して、my_slvを駆動します。
my_slv <= std_logic_vector(...)
「これらのビットを取り、それを使用して私のslvを駆動します」
(用語に関する注記A <= B
。VHDLでは「AはBによって駆動される」と読み上げられます)
組み合わせると、次のようになります。
my_slv <= std_logic_vector(to_unsigned(my_int, my_slv'length));
従来のプログラミングの背景から来た場合、プログラミングの考え方にとらわれやすくなります。ただし、VHDLでは、記述するコードはハードウェアに物理的に影響します。この方法が機能し、推奨される理由を知ることは、ハードウェア用語で何を書いているのかを考えることに一歩近づきます。
おまけのヒント:to_で始まる関数は、オペランドを短縮/変更する関数です。それらは、それらを符号なしまたは特定の長さ、あるいはその両方にします。これが、to_unsignedで長さを指定する必要がある理由です。型が既に直接互換性がある場合、to_のない関数(この例ではまっすぐstd_logic_vector(...))が使用されます。「これらのビットを取り、このタイプに詰め込みます。変更は不要です」。両側はすでに同じであるため、これらには長さの引数はありません。そのため、このようなものを構築するとき、私はそれを調べる必要はありません。データをどのように変更するかを考えるだけです。
整数をstd_logic_vectorに変換するには、いくつかのオプションがあります。numeric_stdを使用:
vect <= std_logic_vector( to_unsigned( your_int, vect'length));
または
vect <= std_logic_vector( to_signed( your_int, vect'length));
std_logic_arithを使用:
vect <= conv_std_logic_vector( your_int, vect'length);
std_logic_arithはIEEE標準ではありませんが、ほとんどのツールはIEEEライブラリにコンパイルし、広く使用されています。