- •Язык ahdl
- •Введение
- •Как пользоваться языком ahdl
- •Вставка шаблонов ahdl
- •Создание текстового выходного файла
- •Использование чисел
- •Использование констант и оценочных функций
- •Комбинаторная логика
- •Реализация булевых выражений и уравнений
- •Именование булевых операторов и компараторов
- •Объявление узлов
- •Определение шин
- •Реализация условной логики
- •Оператор If Then
- •Оператор Case
- •Оператор If Then против оператора Case
- •Создание дешифраторов
- •Использование для переменных значений по умолчанию
- •Реализация логики с активными низкими уровнями
- •Реализация двунаправленных выводов
- •Реализация тристабильных шин
- •Последовательностная логика
- •Объявление регистров
- •Объявление регистровых выходов
- •Создание счетчиков
- •Конечные автоматы
- •Реализация конечных автоматов
- •Установка сигналов Clock, Reset & Enable
- •Присваивание состояний
- •Конечные автоматы с синхронными выходами
- •Конечные автоматы с асинхронными выходами
- •Выход из некорректных состояний
- •Реализация иерархических проектов
- •Использование непараметрических функций
- •Использование параметрических функций
- •Использование заказных мега и макро функций
- •Импорт и экспорт конечных автоматов
- •Реализация lcell & soft примитивов
- •Реализация ram & rom
- •Использование итеративно-генерируемой логики
- •Использование условно-генерируемой логики
- •Использование оператора Assert
- •Элементы
- •Зарезервированные слова
- •Зарезервированные идентификаторы
- •Символы
- •Строковые и символьные имена
- •Диапазоны и поддиапазоны шин
- •Числа в ahdl
- •Арифметические выражения
- •Встроенные оценочные функции
- •Булевы выражения
- •Логические операторы
- •Булевы операторы, использующие not
- •Булевы операторы, использующие and, nand, or, nor, xor, и xnor
- •Арифметические операторы в булевых выражения
- •Компараторы
- •Приоритеты булевых операторов и компараторов
- •Логические функции
- •Мегафункции/lpm
- •Макрофункции
- •Примитивы
- •Структура проекта.
- •Раздел Variable
- •Оператор Title
- •Оператор Parameters
- •Оператор Include
- •Оператор Constant
- •Оператор Define
- •Оператор Function Prototype.
- •Оператор Options
- •Оператор Assert
- •Раздел Subdesign
- •Раздел Variable
- •Раздел Variable может включать следующие операторы и конструкции:
- •Раздел Variable имеет следующие характеристики:
- •Описание объектов.
- •Описание узлов.
- •Объявление регистров.
- •Объявление конечных автоматов.
- •Объявления псевдоимен конечных автоматов.
- •Раздел Logic
- •Булевские выражения.
- •Управляющие булевские выражения.
- •Оператор Case.
- •Оператор Defaults.
- •Оператор If Then.
- •Оператор If Generate
- •Оператор For Generate.
- •Подставляемая ссылка для реализации логической функции (In-Line Logic Function Reference).
- •Оператор Truth Table.
- •Синтаксис
- •Стилизация
- •Золотые правила
- •Контекстно-зависимая помощь
Реализация условной логики
Операторы If ThenиCaseидеально подходят для реализации условной логики. ОператорыIf Thenоценивают одно или несколько булевых выражений и описывают поведение для различных значений выражения. ОператорыCaseявляются списком альтернатив, которые доступны для каждого значения выражения. Они оценивают выражение, а затем выбирают направление действия на основе значения выражения.
Условную логику, реализуемую с помощью операторов If ThenиCase, не следует путать с логикой, создаваемой условно операторомIf Generate. Эта логика не обязательно является условной.
Оператор 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.
Оператор 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
Оператор 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;