在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
,它将信号转换为可以递增的数字。但是我似乎找不到找到将数字转换回信号的方法。
答案 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_specificationparameter_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属性。它们在您的测试平台中很有用,但不建议用于您的设计。这是因为合成器可能会更改枚举的顺序,这可能会给您带来麻烦。