Enums VHDL:为什么是';未为枚举定义长度?

Enums VHDL:为什么是';未为枚举定义长度?,enums,vhdl,Enums,Vhdl,我有以下枚举声明: type T_STATUS is ( -- position / index STATUS_INIT, -- pos = 0 STATUS_RECONFIGURING, -- pos = 1 STATUS_RELOADING, -- pos = 2 STATUS_READY, -- pos = 3 STATUS_ERROR -- pos = 4 ); 为什么不能使用T\u STAT

我有以下枚举声明:

type T_STATUS is (   -- position / index
  STATUS_INIT,           -- pos = 0
  STATUS_RECONFIGURING,  -- pos = 1
  STATUS_RELOADING,      -- pos = 2
  STATUS_READY,          -- pos = 3
  STATUS_ERROR           -- pos = 4
);
为什么不能使用
T\u STATUS'length
获取
T\u STATUS
成员的计数?

示例代码:

constant Count : POSITIVE := T_STATUS'length;
解决方法:
使用
T_STATUS'high
T_STATUS'pos
可以获得该数字,如下所示:

constant Count : POSITIVE := T_STATUS'pos(T_STATUS'high) + 1;
这是可行的,因为
'high
给出了最后一个枚举成员,而
'pos
将此成员转换为它在枚举列表中的位置。因为位置从0开始,所以必须加1才能获得正确的计数/长度。

@paebells

以前的任何修订都没有人要求这样做。顺便说一句,工作组需要更多有经验的用户,比如你自己来参与。这将有助于确保我们为下一次修订完成相关工作

此请求在此处捕获:

我们的twiki从这里开始:

目前的建议如下:

会议信息如下:

IEEE 1076是一个基于个人的工作组,鼓励VHDL社区的参与。没有特殊的会员资格要求参加。帮助塑造下一个版本,加入我们

吉姆·刘易斯
1076更确切地说,枚举类型是标量类型而不是数组类型

IEEE Std 1076-2008 16.2.3阵列的预定义属性中规定了长度

以及5.2.2枚举类型,5.2.2.1概述,第5段:

每个枚举文字产生不同的枚举值。枚举值之间预定义的顺序关系遵循相应位置编号的顺序。列出的第一个枚举文字的值的位置号为零;每个附加枚举文字的位置号比其在列表中的前一个多一个

我们看到,每个枚举文字表示一个基于其声明顺序的位置号,第一个值的位置号为零(您的“变通方法”的基础)


所有这些都是因为VHDL是一种形式符号。长度并不描述值的范围,它描述数组中元素的数量。

我将更新EnumAttributes页面,并在“使用模型”部分添加我的用例。这是不知情的方式吗?我使用这个构造将枚举序列化/反序列化为字符串或std_逻辑_向量,反之亦然。如果合成工具支持文件I/O,则在调试方面会有很大帮助:)。因为其他工具可以读回导出的信息。要序列化为字符串,我只需要使用
'image
'value
。但这对std_逻辑_向量没有帮助,尽管
的enum_编码可能会有帮助。@briandrummond哦,对不起,我的评论有点简短。对于序列化为字符串,我也使用“image”并非所有工具都支持该值。我的解决方法是循环测试所有的图像结果,直到匹配:)。好的,对于数组大小来说,长度是一个很好的属性名称。枚举大小的计数如何?我认为我们应该将讨论转移到VHDL邮件列表:)。David的评论是1076目前只对数组使用“长度”。这并不妨碍1076工作组扩展其含义。我认为我们需要使用用户社区的自然资源。如果这是计数,我可以接受它,但就像@Paebbels一样,当我试图使用它时,我自然会想为什么不延长“长度”。参见。不太清楚的是知道枚举类型中的位置数有什么好处,也许你可以启发读者。@DavidKoontz:使用的例子是,枚举类型的值有时通过通用FIFO或RAM中的
std\u logic\u vector
进行传输,而
std_logic_vector
的最小长度则取决于枚举类型中元素的数量。@DavidKoontz在某些情况下,需要将枚举传递给通用模块,如fifo、交叉时钟同步器等。或者需要将枚举连接到集成逻辑分析器,如ChipScope。所有这些情况都需要对std_逻辑_向量使用一种-我称之为-串行化方法,它需要知道需要多少位。我们还可以讨论枚举是否应该有一个
'serialize
属性:)。好的,sun已经启动,我将编辑twiki页面。我希望能够使用泛型类型作为端口定义。如果您要定义一个T_状态的内存,该工具将根据需要对其进行编码/解码,与记录等相同。然而,自定义FIFO实体仅接受std_逻辑_向量作为输入/输出。我希望使用与T_状态的FIFO相同的模块,或者不使用。现在我用to_std_logic_vector/to_t_status函数来处理它。。。间接指出了处理整数的根本缺陷。VHDL不要求整数作为两个互补值实现,也不要求它们完全基于二进制算法。边界的差异在二进制表示中暗示了一些东西,但这并不影响它对基于十进制ALU的整数(早期版本的Ada在big iron上带有早期VHDL预处理器)的意义。这是一个正式的表示法问题,其中没有定义二进制数。