【问题标题】:VHDL: Determine bit size from integer range attributeVHDL:从整数范围属性确定位大小
【发布时间】:2013-03-10 11:29:15
【问题描述】:

假设我有以下实体声明的通用部分:

实体示例是

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 是用户函数,可能在外部包中定义。有没有办法做到这一点?

【问题讨论】:

    标签: types integer vhdl


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      不,它不是:attributes(您在此处需要)在 TypesArraysSignalsEntities 上定义,但您的情况都不是。您提供的范围是模拟或综合的属性。您要么必须将计数器的下限和上限指定为单独的常量,要么为其定义记录类型。

      事后思考:我目前不知道如果你提供合成会产生什么,即 3 作为下限。你能评论一下吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-21
        • 2013-10-04
        • 2011-04-30
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        相关资源
        最近更新 更多