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 或无符号数组以表示此范围内的值?

我想仅在详细说明时使用它,以通用方式定义 counters 的大小等,如下所示:

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 回答