VHDL中的增量枚举类型

时间:2018-11-28 13:35:44

标签: vhdl increment enumeration

在vhdl中,我可以定义自己的枚举类型并创建此类型的信号:

type tp is (red,green,blue,yellow);
signal sg: tp := red;

但是现在我想要一个for循环来运行所有这些状态。像

for i in sg'min to sg'max loop
   <something>
end loop;

在c ++中,有用于此目的的迭代器。但是在VHDL中,我只能找到sg'pos,它将信号转换为可以递增的数字。但是我似乎找不到找到将数字转换回信号的方法。

2 个答案:

答案 0 :(得分:1)

您可以指定循环参数的类型,其中离散范围是指定标量类型的值的范围:

entity enum is
end entity;

architecture enum_range of enum is
    type tp is (red,green,blue,yellow);
    signal sg: tp := red;
begin
    process (sg)
    begin
        for i in tp range red to yellow loop
            if sg = i then
                report "sg = " & tp'image(sg);
            end if;
        end loop;
    end process;
end architecture;

这将产生:

  

enum.vhdl:12:17:@ 0ms :(报告注释):sg =红色



TL; DR说明

IEEE Std 1076-2008 10.10循环语句

  

iteration_scheme :: =
  同时条件
  | 用于 循环 _parameter_specification

     

parameter_specification :: =
  标识符离散范围内

  

对于具有 for 迭代方案的循环语句, loop参数规范是具有给定标识符的循环参数的声明。 loop参数是一个对象,其类型是离散范围的基本类型。在语句序列中,循环参数是一个常量。因此,不允许将循环参数作为赋值语句的目标。同样,在关联列表中,不应将loop参数指定为与模式 out inout 的形式相对应的实际值。

     

对于使用 for 迭代方案执行循环,首先评估离散范围。如果离散范围是空范围,则迭代方案称为 complete ,因此循环语句的执行已完成;否则,将对离散范围的每个值执行一次语句序列(取决于下一条语句,exit语句或return语句的执行结果,不会留下循环),然后执行迭代方案据说是完整。在每次这样的迭代之前,将离散范围的对应值分配给循环参数。这些值是从左到右分配的。

5.3.2数组类型,5.3.2.1常规

  

离散范围:: = 离散 _subtype_indication |范围

5.3.2.2子类型指示

  

subtype_indication :: =
  [resolution_indication] type_mark [约束]

     

约束:: =
  range_constraint
  | array_constraint
  | record_constraint

5.2标量类型5.2.1常规

  

range_constraint :: = 范围范围

     

范围:: = range_attribute_name
  | simple_expression方向simple_expression

     

方向:: = | 向下

有助于理解如何将离散范围定义为范围。在不指定离散范围内的子类型指示的情况下,类型是从范围内的简单表达式派生的。数字文字(9.3.2文字)的类型可以转换为 universal_integer 到整数类型。该类型也可以按属性提供,如Matthew Taylor所示。仅将脚趾插入simple_expression(9.1)术语-> factor-> primary中,primary可以是名称(属性名称8.6)或文字。

BNF是附件C(信息性)语法摘要中未发现的,是规范性的。

答案 1 :(得分:0)

这就是您需要的:

for i in tp'left to tp'right loop
   <something>
end loop;
左侧和右侧的

称为 type属性。它们在您的测试平台中很有用,但不建议用于您的设计。这是因为合成器可能会更改枚举的顺序,这可能会给您带来麻烦。