6

0から5までの数字を表す信号が必要だとします。明らかに、これを表すには3ビットのstd_logicが必要です(つまり、MAXVAL = 5の場合、bitwidth = { wcalc "floor(logtwo($MAXVAL))+1"})。

私は私ができることを知っています:

SIGNAL myLogicVector : STD_LOGIC_VECTOR(2 downto 0) := 5; 

これを使用して、3つのstd_logic'ビット'の配列を明示的に指定し、初期値を設定します。次に、REPORTを使用して長さ(この場合は3)を出力できます。

report("Bit width of myLogicVector is "& integer'image(myLogicVector'length));

ここまでは順調ですね。しかし、代わりに整数(数値)型を使用するとします。

SIGNAL myInteger : NATURAL range 0 to 5 := 5;

ここで、「コンパイラ」(「シンセサイザー」)は、この整数の範囲が0〜5であるため、3ビットのストレージ長が必要であると自動的に推測すると推測しています。その場合、私の質問は次のとおりです。 REPORTでこのビット幅/長さ/サイズをどうにかして印刷することは可能ですか?

秘訣は、もちろん、次のようなものです。

report("Bit width of myInteger is "& integer'image(myInteger'length));

...失敗します(たとえば、「HDLParsers:3389-属性の長さのプレフィックスは配列オブジェクトである必要があります」)。私が収集する限り、これらの属性はすべて配列VHDL属性の理解)のよう'lengthに、配列'rangeにのみ適用できるためです。一方、整数(自然)は配列ではありません-それは数値です:)(VHDLベクトル整数変換の質問

繰り返しになりますが、log2(符号なし変数の幅を最大値から計算しますか? )を利用できる可能性があることは承知していますが、必要なのは、(合成中に)「ビット」「シンセサイザー」の数をすばやく確認することです。最終的に合成されたデザインに割り当てられるため、最終的なFPGAリソースの観点から使用されるおおよその量(特に「ジェネリック」を使用して整数の特定の最大値を計算する場合)。

さて、よろしくお願いします。

編集:少しコンテキスト:私はISEWebpack9.2を使用しています。'generic'変数/定数をパラメーターとして使用し、方程式を使用してカウンターの最大値を計算しようとしています。この計算は、「コンパイル」時に行われると思います(「ImplementDesign」ではなく「Synthesize」になります)。したがって、ここでレポートメッセージを発生させます(実際、このように取得しました。 std_logic_vectorの場合、合成ログにありますが、動作シミュレーションの開始時にも同じレポートメッセージが表示されます。これは問題ありません)。

そして、これらのレポートメッセージの目的は、私の方程式が正しいことと、シンセサイザーが32ビットカウンターを推測しようとしないことの両方を確認することです-たとえ0から5までを数えたいとしても:)

4

5 に答える 5

6

原則として、VHDL整数の表現は未定義です。

実際には、通常、範囲の制約を考慮して、合成ツールが2の補数表現を使用すると想定できます。したがって、VHDL内からビット幅を報告することはできませんが、範囲制約と実装されたビット幅の関係は簡単です。

于 2011-03-05T12:17:11.497 に答える
2

ここで、「コンパイラ」(「シンセサイザ」) は、この整数の値が 0 から 5 までの範囲にあるため、3 ビットのストレージ長が必要であると自動的に推測すると思います。

仕様によれば必要ですが、必須ではありません。IEEE 1076.6-2004 から:

1.3 用語

「 shall」という言葉は、規格に準拠するために厳密に従う必要があり、逸脱が許されない必須要件を示します (shall が要求されるものと等しい)。shouldという言葉 は、特定の行動方針が望ましいが、必ずしも必要ではないことを示すために使用されます。

8.3.1.2 整数型

合成ツールは、整数のサブタイプを示す信号または変数を、対応するビットのベクトルに変換することをお勧めします。範囲に負の値が含まれていない場合、アイテムは符号なしのバイナリ表現を持つ必要があります。範囲に 1 つ以上の負の値が含まれる場合、アイテムには 2 の補数が実装されている必要があります。ベクトルは、これらの表現と一致する最小の幅を持つ必要があります。

合成ツールは、整数型と正、負、および制約のない (ユニバーサル) 整数をサポートし、その境界は –2 147 483 648 から +2 147 483 647 までの範囲 (32 ビットの 2 の補数を正常にマップする範囲) 内にあります。

例:「INTEGER 範囲 9 から 10」は、「INTEGER 範囲 0 から 15」のサブタイプ表示で定義されたかのように、4 ビットの同等のベクトル長を使用して合成する必要があります。

正式な検証の不一致をデバッグする必要があったため、少なくとも 1 つの合成ツールがこの方法で範囲を使用していないと断言できます。

ザイリンクス FPGA の場合、XST 合成レポートは、どのストレージ エレメントに未使用のビットがあるかを示しますが、単純なワイヤは示しません。

于 2011-03-04T16:26:34.990 に答える
-2

これは次のように解決できます。

最初に、 に使用する範囲を表す新しい (サブ) タイプを宣言しmyIntegerます。myInteger(次に、直接整数範囲ではなく、このタイプのシグナルとして宣言します)。

次に、宣言された範囲をインデックス範囲として使用してダミーの配列型を宣言し、その を使用'lengthます

subtype myInteger_range is natural range 0 to 5;
signal myInteger : myInteger_range;
type myInteger_dummy_array is array (myInteger_range) of boolean; -- or whatever
report integer'image(myInteger_dummy_array'length); --> "6"
于 2016-09-16T21:19:56.380 に答える
-3

いつでも使用できます:

report("myInteger のビット幅は "& integer'image(myInteger'left - myInteger'Right));

于 2015-03-19T19:42:17.530 に答える