VHDL:INTEGER型からSTD_LOGIC_VECTORへの変換


28

mod-16カウンターを作成し、出力結果はINTEGERです(見たすべての例ではINTEGERを使用しました)。

hex-to-7-segment-displayデコーダーを作成しましたが、その入力はSTD_LOGIC_VECTORです(真理値表を簡単にマップできたため、そのように書きました)。

カウンターの出力をデコーダーの入力に接続したいのですが、QuartusIIでコンパイルしようとすると「タイプの不一致」エラーが発生します。

VHDLリストでINTEGER型からSTD_LOGIC_VECTOR型に変換する方法はありますか?

回答:


20

他の人が言ったようにieee.numeric_stdieee.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));

16

LoneTechが言うように、use ieee.numeric_stdあなたの友達です。a std_logic_vectorをに変換することもできintegerますがsignedunsigned最初にキャストする必要があります(コンパイラーが意味を理解していないため)。VHDLは強く型付けされた言語です。私がきた多くの書かれたこのテーマに私のブログに

基本的に、7segコンバーターを変更してinteger(またはnatural、正の数のみを処理する場合は実際に)に変換します-変換は単純な配列ルックアップになります。変換を使用して定数配列を設定し、エンティティで入力として使用する整数を使用してインデックスを作成します。


これをありがとう。コメントありがとうございます。私は、ある種のTAの立場にあり、プログラミングの概念に少し不安を感じていた教授を始めるためにVHDLを学びました。私は彼にあなたの情報を伝えます-私たちが使った教科書はVHDLの「道徳」の質問を掘り下げていませんでした。
J.ポルファー

1
それは一貫性を保証するものではなく、「道徳」の問題ではありません。numeric_stdライブラリはIEEEによって制定された実際の標準であり、std_logic_unsignedライブラリはベンダーによって作成され、実際の正式な定義なしに業界で採用されています。通常は正常に機能しますが、非標準のライブラリとベンダー間の互換性の保証はありません。しかし、今は標準に移行するのが良い形です。
-MattG

1

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で機能します。


3
しないでください!numeric_stdを使用します(LoneTechの回答と私の回答を参照)
マーティントンプソン

より良い方法があればそれで構いませんが、私の提案はうまくいくので、あなたの反対票は不要だと思う。私は何年もstd_logic_arithを使用してきましたが、問題はありませんでした。ベンダーが実装を変更することに対する懸念は根拠がないと思います。彼らの正しい考えのどのベンダーが顧客の設計を壊す危険があるでしょうか?
ajs410

1
IEEEのネームスペースにベンダー固有のものを意図的に入れるベンダーについては、すでに答えがあります。特に符号付きおよび符号なしの値を扱う場合は、粗雑なままです。
ヤンバーニエ

「+および-演算子はstd_logic_vectorsで機能します。」私があなたの意味を誤解しない限り、彼らは機能しません。通常、最初に符号付き/符号なしデータを保持する型にキャストする必要があります。
スタンリ

1

あなたはタイプを使用することに興味があるかもしれないunsignedsignedieee.numeric_std。これらはと互換性std_logic_vectorがありますが、数値の解釈(バイナリまたは2の補数)があります。このような解釈を適用するオプションもありますstd_logic_vectorが、これは推奨されません


0

主な答えが示すように、推奨される方法は次のとおりです。

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(...))が使用されます。「これらのビットを取り、このタイプに詰め込みます。変更は不要です」。両側はすでに同じであるため、これらには長さの引数はありません。そのため、このようなものを構築するとき、私はそれを調べる必要はありません。データをどのように変更するかを考えるだけです。


0

整数を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ライブラリにコンパイルし、広く使用されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.