- •Учебник по языку ahdl Оглавление
- •Введение
- •Общие положения
- •Как работает ahdl?
- •Элементы языкаAhdl
- •Зарезервированные слова
- •Зарезервированные идентификаторы
- •Символы
- •Строковые и символьные имена
- •Способы объявления шин
- •Диапазоны и поддиапазоны шин
- •Числа в ahdl
- •Арифметические выражения
- •Встроенные оценочные функции
- •Логические выражения
- •Операторы логических функций
- •Булевы операторы, использующие not
- •Булевы операторы, использующие and, nand, or, nor, xor, и xnor
- •Арифметические операторы
- •Компараторы
- •Приоритеты логических и арифметических операторов
- •Прототипы логических функций
- •Примитивы
- •Массивы примитивов
- •Макрофункции
- •Мегафункции и библиотеки параметризуемых модулей
- •Не используемые входы примитивов, мегафункций и макрофункций
- •Типы портов:
- •Порты экземпляров
- •Структура описания проекта на языкеAhdl
- •Общая структура
- •Раздел Variable
- •Определение заголовка описания (оператор Title)
- •Определение включаемого текста (оператор Include)
- •Определение констант (оператор Constant)
- •Обозначение арифметических выражений (оператор Define)
- •Определение параметров (оператор Parameters)
- •Определение прототипов логических функций (операторFunctionPrototype).
- •Определение порядка следования битов (оператор Options)
- •Контроль арифметических выражений (оператор Assert)
- •Раздел интерфейса проекта (Subdesign)
- •Раздел переменных проекта (Variable)
- •Раздел Variable может включать следующие операторы и конструкции:
- •Раздел Variable может также содержать операторы If Generate, которые могут быть использованы для генерирования объектов, узлов, регистров, конечных автоматов, и псевдоимен конечных автоматов.
- •Раздел Variable имеет следующие характеристики:
- •Объявление объектов (Instance Declarations)
- •Объявление узлов (Node Declarations)
- •Объявление регистров (Register Declarations)
- •Объявление конечных автоматов (State Machine Declarations)
- •Объявления псевдоимен конечных автоматов (Machine Alias Declaration)
- •Раздел тела проекта (Logic)
- •Задание исходных значений (Defaults Statment)
- •Булевские выражения (Boolean Equations)
- •Управляющие булевские выражения (Boolean Control Equations)
- •Оператор проверки списка (Case.)
- •Оператор проверки логического выражения (If Then.)
- •Оператор проверки логического выражения (If Generate )
- •Оператор цикла (For Generate)
- •Использование ссылок на прототипы функций (In-Line Logic Function Reference)
- •Определение таблицы истинности (Truth Table)
- •Применение языкаAhdl
- •Использование шаблонов ahdl
- •Создание текстового выходного файла
- •Использование чисел
- •Использование констант и оценочных функций
- •Использование итеративно-генерируемой логики
- •Использование условно-генерируемой логики
- •Выполнение контроля выражений с помощью оператора Assert
- •Управление логическим синтезом с помощью примитивов lcell & soft
- •Реализация комбинационной логики
- •Реализация логических выражений и уравнений
- •Именование логических операторов и компараторов
- •Использование узлов
- •Использование шин
- •Реализация условной логики
- •Оператор If Then
- •Оператор Case
- •Оператор If Then против оператора Case
- •Создание дешифраторов
- •Использование значений переменных по умолчанию
- •Реализация логики с активными низкими уровнями
- •Реализация двунаправленных выводов
- •Реализация тристабильных шин
- •Реализация последовательностной логики
- •Объявление регистров
- •Объявление регистровых выходов
- •Создание счетчиков
- •Конечные автоматы
- •Реализация конечных автоматов
- •Управление записью, сбросом и разрешением (Clock, Reset & Enable)
- •Присваивание состояний
- •Конечные автоматы с синхронными выходами
- •Конечные автоматы с асинхронными выходами
- •Выход из некорректных состояний
- •Реализация запоминающих устройств
- •Реализация иерархических проектов
- •Использование непараметрических функций
- •Использование параметрических функций
- •Использование заказных мега- и макрофункций
- •Импорт и экспорт конечных автоматов
- •Синтаксис языкаAhdl
- •Стилизация описаний на языкеAhdl
- •"Золотые" правила использования языкаAhdl
- •Контекстно-зависимая справка по языкуAhdl
Оператор Case
Файл decoder.tdf, приведенный ниже, описывает дешифратор 2 в 4 бита. Он преобразует 2-битный код в унарный код.
SUBDESIGNdecoder
(
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";
ENDCASE;
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;
Создание дешифраторов
В AHDL для создания дешифратора Вы можете использовать или оператор Truth Tableили lpm_compare или lpm_decode функции.
Файл 7segment.tdf, приведенный ниже, является дешифратором для комбинации светоизлучающих диодов (LED). LED отображают шестнадцатеричные числа.
SUBDESIGN7segment
(
i[3..0] :INPUT;
a,b,c,d,e,f,g:OUTPUT;
)
BEGIN
TABLE
i[3..0] => a, b, c, d, e, f, g;
H"0" => 1, 1, 1, 1, 1, 1, 0;
H"1" => 0, 1, 1, 0, 0, 0, 0;
H"2" => 1, 1, 0, 1, 1, 0, 1;
H"3" => 1, 1, 1, 1, 0, 0, 1;
H"4" => 0, 1, 1, 0, 0, 1, 1;
H"5" => 1, 0, 1, 1, 0, 1, 1;
H"6" => 1, 0, 1, 1, 1, 1, 1;
H"7" => 1, 1, 1, 0, 0, 0, 0;
H"8" => 1, 1, 1, 1, 1, 1, 1;
H"9" => 1, 1, 1, 1, 0, 1, 1;
H"A" => 1, 1, 1, 0, 1, 1, 1;
H"B" => 0, 0, 1, 1, 1, 1, 1;
H"C" => 1, 0, 0, 1, 1, 1, 0;
H"D" => 0, 1, 1, 1, 1, 0, 1;
H"E" => 1, 0, 0, 1, 1, 1, 1;
H"F" => 1, 0, 0, 0, 1, 1, 1;
END TABLE;
END;
В этом примере выходной набор для всех 16 возможных входных наборов i[3..0] описан в операторе Truth Table
Файл decode3.tdf, приведенный ниже, является дешифратором адреса для реализации 16-битной микропроцессорной системы.
SUBDESIGN decode3
(
addr[15..0], m/io : INPUT;
rom, ram, print, sp[2..1] : OUTPUT;
)
BEGIN
TABLE
m/io, addr[15..0] => rom, ram, print, sp[];
1, B"00XXXXXXXXXXXXXX" => 1, 0, 0, B"00";
1, B"100XXXXXXXXXXXXX" => 0, 1, 0, B"00";
0, B"0000001010101110" => 0, 0, 1, B"00";
0, B"0000001011011110" => 0, 0, 0, B"01";
0, B"0000001101110000" => 0, 0, 0, B"10";
END TABLE;
END;
В этом примере существуют тысячи входных наборов и описывать их все в операторе Truth Tableнепрактично. Вместо этого Вы можете использовать логический уровень Х для указания того, что выход не зависит от соответствующего входа. Например, в первой строчке оператораTABLEвыход rom должен быть высоким для всех 16,384 входных наборов addr[15..0], начинающихся с 00. Следовательно Вам необходимо точно определить только общую часть входного набора, а для остальных входов использовать символ Х.
При использовании символов Х Вы должны гарантировать отсутствие наложений между битовыми комбинациями в таблице истинности. Язык AHDL предполагает что одновременно только одно условие в таблице истинности может быть истинно.
Файл decode4.tdf, приведенный ниже, использует функцию lpm_decode для получения такой же функциональности как и файл decode1.tdf.
INCLUDE "lpm_decode.inc";
SUBDESIGN decode4
(
address[15..0] : INPUT;
chip_enable : OUTPUT;
)
BEGIN
chip_enable = lpm_decode(.data[]=address[])
WITH (LPM_WIDTH=16, LPM_DECODES=2^10)
RETURNS (.eq[H"0370"]);
END;