Вы можете указать тип параметра цикла, где дискретный диапазон - это диапазон значений указанного скалярного типа:
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
Стандарт IEEE1076-2008 10.10 Оператор цикла
iteration_scheme :: =
, а условие
| для loop _parameter_specification
parameter_specification :: =
идентификатор в discrete_range
и
Для оператора цикла с для схемы итерации спецификация параметра цикла является объявлением параметра цикла с данным идентификатором.Параметр цикла - это объект, тип которого является базовым типом дискретного диапазона.В последовательности операторов параметр цикла является константой.Следовательно, параметр цикла не разрешен в качестве цели оператора присваивания.Аналогично, параметр цикла не должен быть задан как фактическое значение, соответствующее формальному из режима out или inout в списке ассоциаций.
Для выполнения цикла с для итерационной схемы сначала оценивается дискретный диапазон.Если дискретный диапазон является нулевым диапазоном, говорят, что схема итерации complete и, следовательно, выполнение оператора цикла завершено;в противном случае последовательность операторов выполняется один раз для каждого значения дискретного диапазона (при условии, что цикл не останется вследствие выполнения следующего оператора, оператора выхода или оператора возврата), после чего схема итерацииговорят, что завершено .Перед каждой такой итерацией соответствующее значение дискретного диапазона присваивается параметру цикла.Эти значения присваиваются в порядке слева направо.
5.3.2 Типы массивов, 5.3.2.1 Общие
discrete_range :: = discrete _subtype_indication |диапазон
5.3.2.2 Указания подтипов
указатель подтипа :: =
[разрешение_индекса] type_mark [ограничение]
ограничение :: =
range_constraint
|array_constraint
|record_constraint
5.2 Скалярные типы 5.2.1 Общие сведения
range_constraint :: = range range
range :: = range_attribute_name
|Направление simple_expression simple_expression
direction :: = to | downto
Это помогает понять, как работает определение диапазона как дискретного диапазона.Без указания указания подтипа в дискретном диапазоне тип выводится из простых выражений в диапазоне.Тип числового литерала (литералы 9.3.2): universal_integer , преобразуемый в тип integer.Тип также может быть предоставлен атрибутом, как показывает Мэтью Тейлор.Только опуская палец в термине simple_expression (9.1) -> factor -> primary, первичным может быть имя (имя атрибута, 8.6) или литерал.
BNF, отличный от синтаксиса в Приложении C (информативный)резюме, нормативно.