假设我有以下实体声明的通用部分:
实体示例
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
是用户函数,可能在外部包中定义。有没有办法做到这一点?
答案 0 :(得分: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);
函数体可能涉及日志函数和舍入,并在值范围内仔细测试:如果丑陋的话,粗略的案例陈述可能更简单,更安全!
我通常以相反的方式执行此操作:从单词宽度开始并从中获取其他所有内容更简单。
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 :(得分:0)
不,不是:attributes(此处需要)在Types
,Arrays
,Signals
和Entities
上定义,但你的情况不属于他们。您提供的范围是模拟或合成的属性。您必须将计数器的下限和上限指定为单独的常量,或者为其定义记录类型。
作为事后的想法:如果你提供,我目前不知道合成会产生什么,即3作为下限。你能发表评论吗?