VHDL:合成用の整数?


17

合成信号やポートなどにVHDLで整数を使用する必要があるかどうかについて少し混乱しています。

トップレベルのポートでstd_logicを使用していますが、内部的に至る所で範囲付き整数を使用していました。ただし、合成ターゲットコードには符号付き/符号なしのみを使用する必要があると言っている人々への参照に出くわしました。

私は現在のプロジェクトに行って、署名なしを使用するように作り直しました...そして、それは明らかにいです。

整数を使用するのは悪い習慣ですか?どうしたの?ツールが整数をマップする幅に不確実性はありますか?


良い質問。私はそのことを疑問に思っていました。整数型、ポジティブ型、その他の型をあちこちで使用することから始めましたが、適切に合成するには非常に難しいことがわかりました。誰もが高度に型付けされた言語でstd_logicを使用することになった理由を説明できる人を望んでいます。
トリグヴェLaugstøl

1
うん。クレイジーじゃないですか?現在の慣例で高度に型指定すると、多くのDATA_I <= TO_UNSIGNED(32010、DATA_I'LENGTH)になる傾向があります。タイプのもの...それは誰も気にしませんか?:)それは確かに多くの不必要な荷物のようです。(特にSTD_LOGIC_VECTOR()を追加するとき)私は自分のタイプとサイズを宣言しました。これはDATA_I <= 32010でなければなりませんそれは暗黙的でなければなりません。符号付き/符号なしなどの間を移動することは明示的であり、そうである必要があります...しかし、整数に対するまっすぐで明白な割り当てまたは操作は暗黙的でなければなりません。
ダロン

回答:


15

整数は合成では問題ありません。常に使用しています。

私はトップレベルのポートでstd_logicを使用していますが、内部的には至る所で範囲付き整数を使用していました

それはいいです!

注意してください:

  • 最初にシミュレートしているのはあなたではありません:)-整数型は、シミュレーションで自動的に「ロールオーバー」しません-指定した範囲外に出るのはエラーです。ロールオーバー動作が必要な場合は、明示的にコーディングする必要があります。
  • 2311+2311231unsignedsigned
  • あなたがそれらを制約していない場合は、次のことができ、時には(シンセとその後のツールは、彼らが離れてビットを最適化することができることを「見る」ことができない場合)少ないだろう32ビットカウンタで終わります。

利点:

  • 符号なし/符号付きベクトルよりもシミュレーションがはるかに高速です
  • シミュレーションでは自動的にロールオーバーしません(はい、両方のリストにあります:)。これは便利です。たとえば、カウンターが小さすぎるという早期警告が表示されます。

あなたが使用するベクトルの種類を行うと、使用しているieee.numeric_stdいないieee.std_logic_arithあなたではありませんか?

できる限りintegers を使用しますが、「ロールオーバーnビットカウンター」が明示的に必要な場合は、を使用する傾向がありますunsigned


はい、numeric_stdを使用します。ザイリンクスツールについてほとんど心配していると思います...それらはまだすべてに対してstd_logic_vectorを生成し、「UNSIGNED」は構文の強調表示にさえありません。
ダロン

1
@darron構文の強調表示について心配する必要はありません。エディターとその構文ハイライターは、合成ツールとはまったく異なるソフトウェアです。また、unsignedは「単なる」データ型です。言語自体ではなく、標準ライブラリの一部です。
フィリップ

代わりに下限は-2 ^ 32 + 1ではありませんか?-2 ^ 31-1の場合、1つの数値のみを表すためにもう1ビットだけ必要です-非常に奇妙です。
ブレガラッド

@Bregalad-良いキャッチ-それはかなり間違っていました!
マーティントンプソン

@MartinThompsonまたは、マイナス記号を保持したい場合は、-(2 ^ 32-1)と書くこともできます。
ブレガラッド


6

RTL 自体に整数を使用することには何の問題もありませんが、それを避ける理由がいくつかあります。これは、主観的な「ベストプラクティス」についての質問であり、最終的には自分の好みを見つける必要があります。その助けとして、これに関する私の経験と考えを共有します。

主に、合成のために書くときも(制約付き)整数を使用することに賛成です。私は時々それを行うが、実際には、通常、私はに固執signedしてunsigned。理由を詳しく説明します。

とにかく、デザインの一部でベクトル化されたデータ型を使用する必要があります。

  • ベンダーIPまたはサードパーティIPがintegerポートのタイプを使用することはほとんどありません

  • 例えば、BlockRamを介してデータを送信する場合、たとえそれを推論し、したがってIP /マクロ/プリミティブにインターフェースする必要がないとしても、とにかくベクトル化された型に変換する必要があります。

  • 上記のどちらにも当てはまらない場合でも、主にある時点で他の何か(他に何もない場合はトップレベルのポート)に接続する必要があります。

integer完全な設計には使用できないため、次の理由ですべて一緒にスキップすることをお勧めします。

  • いくつかの点で、とにかく変換​​を行う必要があり、これはinteger最初に使用する点の一部を取り去ります

  • また、シミュレーションの場合、これらの変換は通常、リセット前または他のときにベクター'U'または'X'で呼び出され、そのような関数呼び出しごとにパッケージ関数から警告メッセージが生成され、シミュレーションの警告/プロンプトが乱雑になります

使用の欠点integer

  • ベクトル化された型とは異なり、整数には'U'and はありません'X'。これらはシミュレーションに非常に役立ちます。初期化されていない信号がデザインをどのように伝搬するかがわかります。リセット後に多くの初期化されていない信号が表示された場合は、おそらく反応します。整数を使用する場合、これは当てはまりません。

  • 整数を使用すると、加算または減算してアンダーフロー/オーバーフローが発生するときに、シミュレーション/合成の不一致のリスクが大きくなります。(他の誰かがすでに指摘したように。)

私がinteger本当に良い選択肢だと思う典型的なケース:

  • chipScope / signalTapなどを通じて監視するデバッグ信号/カウンター用

  • 独自のコードに出入りすることのない、完全に内部的なカウンターの表現。はい、そこにあなたがFIFOを書いている場合例えば、このようなケースであり、あなたは、推測航法書き込みされている/信号を形成するために読み込みfullemptyalmostFullなど(ポインタの算術演算ただし、この場合、推測航法よりも良い方法です。 ..)

私自身の結論:私は時々整数を使用しますが、控えめに、そしてほとんど上記の場合に使用します。私が使用して多くのオーバーヘッドが表示されていないunsignedと、signed代わりに整数のため、通常はそれらに固執します。

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