1

エンティティ宣言の次の一般的な部分があるとしましょう。

エンティティの例は

Generic
   (G_INTEGER_A : integer range C_INT_LEFT_A to C_INT_RIGHT_A;

    G_INTEGER_B : integer range C_INT_LEFT_B to C_INT_RIGHT_B);
Port
    (...)

その整数範囲属性を使用して、この範囲内の値を表すためにstd_logic_vectorまたは符号なし配列の次元を設定するための同等のビットサイズを決定する簡単な方法はありますか?

カウンターのサイズなどを一般的な方法で次のように定義するために、作成時にのみ使用したいと思います。

constant C_A_SIZE: integer := f_int_size(G_INTEGER_A'range);

signal s_bit_cnt : unsigned(C_A_SIZE - 1 downto 0);

f_int_size外部パッケージで定義されている可能性のあるユーザー関数はどこにありますか。これを行う方法はありますか?

4

2 に答える 2

1

ジェネリックから範囲値を直接抽出することはできません。ただし、ジェネリックに名前付きの型またはサブタイプを使用する場合は、その属性を使用できます。

subtype Count_Range_A is natural range C_INT_LEFT_A to C_INT_RIGHT_A;

Generic ( G_Integer_A : Count_Range_A; ... )

function range_size(Start,End : natural return Natural is ...

constant C_A_SIZE: natural := range_size(Count_Range_A'Left, Count_Range_A'Right);

関数本体には、ログ関数と丸め、および値の範囲全体での慎重なテストが含まれる場合があります。粗雑な case ステートメントは、醜い場合でも、おそらくより単純で安全です!

私は通常、これを逆に行います。幅という単語から始めて、そこから他のすべてを導き出す方が簡単です。

package Types is

    constant Packet_Bits : natural := <some value>
    -- Related declarations below are derived from it.
    constant Packet_Size : natural := 2**Packet_Bits;
    subtype Packet_Address is natural range 0 to Packet_Size - 1;
    subtype Packet_Address_Word is unsigned(Packet_Bits-1 downto 0);

end Types;
于 2013-03-11T09:58:50.400 に答える
0

いいえ、そうではありません:属性(ここで必要になります) はTypesArraysSignals、およびEntitiesで定義されていますが、ケースはどちらでもありません。指定した範囲は、シミュレーションまたは合成の属性です。カウンタの下限と上限を個別の定数として指定するか、そのレコード タイプを定義する必要があります。

後付けとして: 下限として 3 を指定した場合、合成が何を生成するかは現在のところわかりません。コメントいただけますか?

于 2013-03-11T08:50:19.333 に答える