首页 文章

VHDL:从整数范围属性确定位大小

提问于
浏览
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 将是一个用户函数,可能在外部包中定义 . 有没有办法做到这一点?

2 回答

  • 0

    您无法直接从泛型中提取范围值 . 但是,如果为通用使用命名类型或子类型,则可以使用其属性:

    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);
    

    函数体可能涉及日志函数和舍入,并在值范围内进行仔细测试:如果丑陋的话,粗略的案例陈述可能更简单,更安全!

    我通常以相反的方式执行此操作:从单词宽度开始并从中获取其他所有内容更简单 .

    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;
    
  • 1

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

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

相关问题