Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебники / Язык AHDL.DOC
Скачиваний:
56
Добавлен:
13.06.2014
Размер:
995.84 Кб
Скачать
        1. Реализация условной логики

Операторы If ThenиCaseидеально подходят для реализации условной логики. ОператорыIf Thenоценивают одно или несколько булевых выражений и описывают поведение для различных значений выражения. ОператорыCaseявляются списком альтернатив, которые доступны для каждого значения выражения. Они оценивают выражение, а затем выбирают направление действия на основе значения выражения.

Условную логику, реализуемую с помощью операторов If ThenиCase, не следует путать с логикой, создаваемой условно операторомIf Generate. Эта логика не обязательно является условной.

          1. Оператор If Then

Файл priority.tdf, приведенный ниже, демонстрирует приоритетный шифратор, который преобразует уровень активного входа с наивысшим приоритетом в значение.

SUBDESIGN priority

(

low, middle, high : INPUT;

highest_level[1..0] : OUTPUT;

)

BEGIN

IF high THEN

highest_level[] = 3;

ELSIF middle THEN

highest_level[] = 2;

ELSIF low THEN

highest_level[] = 1;

ELSE

highest_level[] = 0;

END IF;

END;

В этом примере входы high, middle, и low оцениваются для определения того, является ли их уровни равными VCC. Оператор If Thenактивизирует уравнения, которые следуют за активной IF или ELSE областями и, если вход high высокий, то highest_level[] равен 3.

Если активизируется более одного входа, то оператор If Thenоценивает приоритет входов в порядке следования областей IF и ELSIF ( первая область имеет наивысший приоритет).

Если ни один из входов не активизирован, по срабатывает уравнение, следующие за ключевым словом ELSE.

          1. Оператор Case

Файл decoder.tdf, приведенный ниже, описывает дешифратор 2 в 4 бита. Он преобразует 2-битный код в унарный код.

SUBDESIGN decoder

(

code[1..0] : INPUT;

out[3..0] : OUTPUT;

)

BEGIN

CASE code[] IS

WHEN 0 => out[] = B"0001";

WHEN 1 => out[] = B"0010";

WHEN 2 => out[] = B"0100";

WHEN 3 => out[] = B"1000";

END CASE;

END;

В этом примере входной код шины имеет значения 0, 1, 2 или 3. В операторе Case за символом => следует активизируемое уравнение. Например, если code[] равен 1, то выход out1 устанавливается в B"0010". Поскольку все значения выражения различны, в одно время можно активизировать только одну область WHEN

          1. Оператор If Then против оператора Case

Операторы If ThenиCaseподобны. В некоторый случаях Вы можете использовать любой из двух операторов для получения того же самого результата.

Но между ними существует важное различие:

  • В операторе If Thenможно использовать любые виды булевых выражений. Каждое выражение, следующее за IF или ELSIF областями, может быть несвязанно с другими выражениями в операторе. В операторе Case, напротив, только одно булево выражение сравнивается с константой в каждой WHEN области.

  • Использование ELSIF предложения может привести к логике, которая слишком сложна для компилятора, так как каждое следующее друг за другом предложение ELSIF должно еще проверять, ложность предыдущих IF/ELSIF предложений. Следующий пример показывает как компилятор интерпретирует оператор If Then. Если a и b сложные выражения, тогда инверсия этих выражений даст, возможно, даже более сложные выражения.

Оператор If ThenИнтерпретация компилятора

IF a THEN IF a THEN

c = d; c = d;

END IF;

ELSIF b THEN IF !a & b THEN

c = e; c = e;

END IF;

ELSE IF !a & !b THEN

c = f; c = f;

END IF; END IF;