Тип приращения в VHDL - PullRequest
0 голосов
/ 28 ноября 2018

В 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 голосов
/ 28 ноября 2018

Вы можете указать тип параметра цикла, где дискретный диапазон - это диапазон значений указанного скалярного типа:

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 (информативный)резюме, нормативно.

0 голосов
/ 28 ноября 2018

Это то, что вам нужно:

for i in tp'left to tp'right loop
   <something>
end loop;

`left и` right называются атрибутами типа .Они полезны в вашем тестовом стенде, но не рекомендуются для вашего дизайна.Это потому, что вы, синтезатор, можете изменить порядок перечислений, что может вызвать проблемы.

...