Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AHDL.doc
Скачиваний:
29
Добавлен:
08.11.2018
Размер:
869.89 Кб
Скачать

Оператор if generate

содержит список операторов, активизирующихся в случае положительного результата оценки арифметического выражения.

Пример:

IF DEVICE_FAMILY == "FLEX8K" GENERATE

c[] = 8kadder(a[], b[], cin);

ELSE GENERATE

c[] = otheradder(a[], b[], cin);

END GENERATE;

Оператор If Generate имеет следующие характеристики:

  1. Между ключевыми словами If Generate заключается арифметическое выражение, значение которого подвергается оценке. За ключевым словом GENERATE следует список операторов, каждый из которых заканчивается символом (;). Операторы активизируются в том случае, если арифметическое выражение принимает истинное значение.

  2. За ключевыми словами ELSE GENERATE следует один или более операторов, которые активизируются в случае, если арифметическое выражение принимает ложное значение.

  3. Оператор If Generate заканчивается ключевыми словами END GENERATE, за которыми следует символ (;)

  4. Оператор If Generate может использоваться в разделах Logic и Variable.

В отличие от операторов If Then, которые могут оценивать лишь значения булевских выражений, операторы If Generate могут оценивать значения наборов арифметических выражений. Основное различие между операторами If Then и If Generate состоит в том, что в первом случае значение булевского выражения оценивается аппаратным способом (в кристалле), а во втором случае значение набора арифметических выражений оценивается на этапе компиляции.

Оператор If Generate особенно часто используется с операторами For Generate, что позволяет различным образом обрабатывать особые ситуации, например младший значащий бит в многокаскадном умножителе. Этот оператор может также использоваться для тестирования значений параметров, как показано в последнем примере.

Оператор for generate

Пример:

CONSTANT NUM_OF_ADDERS = 8;

SUBDESIGN 4gentst

(

a[NUM_OF_ADDERS..1], b[NUM_OF_ADDERS..1], cin : INPUT;

c[NUM_OF_ADDERS..1], cout : OUTPUT;

)

VARIABLE

carry_out[(NUM_OF_ADDERS+1)..1] : NODE;

BEGIN

carry_out[1] = cin;

FOR i IN 1 TO NUM_OF_ADDERS GENERATE

c[i] = a[i] $ b[i] $ carry_out[i]; % Полный сумматор %

carry_out[i+1] = a[i] & b[i] # carry_out[i] & (a[i] $ b[i]);

END GENERATE;

cout = carry_out[NUM_OF_ADDERS+1];

END;

Оператор For Generate имеет следующие характеристики:

  1. Между ключевыми словами FOR и GENERATE заключаются следующие параметры:

– временная переменная, представляющая собой символическое имя. Эта переменная используется лишь в пределах оператора For Generate и заканчивает свое существование после того, как компилятор обработает этот оператор. В примере, показанном выше, такой переменной является переменная i. Это имя не может использоваться в качестве имени константы, параметра или узла в пределах данного проекта;

– за ключевым словом IN следует диапазон, ограниченный двумя арифметическими выражениями. Арифметические выражения разделяются между собой ключевым словом TO. В примере, показанном выше, арифметическими выражениями являются 1 и NUM_OF_ ADDRESS. Границы диапазона могут содержать выражения, состоящие только из констант и параметров; использование переменных при этом недопустимо.

2. За ключевым словом GENERATE следует один или более логических операторов, каждый из которых заканчивается символом (;).

3. Оператор If Generate заканчивается ключевыми словами END GENERATE, за которыми следует символ (;)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]