- •Учебник по языку 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
Объявления псевдоимен конечных автоматов (Machine Alias Declaration)
Используя процедуру объявления псевдоимени конечного автомата в разделе описания переменных, можно описать псевдоимя для данного, описанного или импортированного из другого файла конечного автомата. После указанной процедуры можно пользоваться псевдоименем конечного автомата наравне с его исходным. Например:
FUNCTION ss_def (clock, reset, count)
RETURNS (MACHINE ss_out);
VARIABLE
ss : MACHINE;
BEGIN
ss = ss_def (sys_clk, reset, !hold);
IF ss == s0 THEN
ELSIF ss == s1 THEN
END;
Процедура объявления псевдоимени конечного автомата имеет следующие характеристики:
Псевдоним представляет собой символическое имя. За псевдонимом следует символ двоеточия и далее ключевое слово MACHINE. В примере, показанном выше, символическое имя ss является псевдонимом конечного автомата.
Предусмотрена возможность импортирования и экспортирования конечных автоматов между текстовыми файлами проектов, а также другими файлами проектов путем определения входных и выходных портов с использованием ключевых слов MACHINE INPUT или MACHINE OUTPUT в разделе Subdesign.
При импортировании и экспортировании конечных автоматов прототип функции, представляющий файл описания конечного автомата должен определять какие входы и выходы являются конечными автоматами. В примере, показанном выше, ss_out является именем конечного автомата.
Декларация псевдонима конечного автомата заканчивается символом (;).
Порты типов MACHINE INPUT и MACHINE OUTPUT не могут использоваться в файлах проектов верхнего уровня.
Раздел тела проекта (Logic)
Раздел Logic определяет логическое функционирование текстового файла проекта (TDF) и является собственно его телом.
Раздел Logic заключается в ключевые слова BEGIN и END. За ключевым словом END следует символ (;), заканчивающий раздел. Если используется оператор Defaults, то он должен предшествовать всем другим операторам в этом разделе.
AHDL является параллельным языком. Компилятор анализирует поведенческую модель, описанную в разделе Logic, параллельно. Выражения, осуществляющие множественные присваивания объекту, имеющему тип NODE или переменной, объединяются в соответствии с функцией монтажное ИЛИ.
В разделе Logic могут быть многократно использованы следующие операторы и разделы:
Булевские выражения.
Управляющие булевские выражения.
Оператор Case.
Оператор Defaults.
Оператор If Then.
Оператор If Generate
Оператор If Generate
Оператор таблицы истинности
Раздел Logic может также содержать оператор Assert.
Задание исходных значений (Defaults Statment)
Оператор Defaults позволяет определять значения по умолчанию, применяемые в таблицах истинности, а также в операторах If Then и Case. Поскольку активно- высокие сигналы автоматически имеют значения по умолчанию GND, то оператор Default необходим лишь в случае использования активно-низких сигналов.
Не следует путать значения по умолчанию, присваиваемые переменным со значениями по умолчанию, присваиваемыми портам в разделе Subdesign.
Следующий пример демонстрирует использование оператора Defaults:
BEGIN
DEFAULTS
a = VCC;
END DEFAULTS;
IF y & z THEN
a = GND; % a активный низкий %
ENDIF;
END;
Оператор Defaults имеет следующие характеристики:
Значения по умолчанию заключаются в ключевые слова DEFAULTS и END DEFAULTS. Оператор заканчивается символом (;).
Тело оператора Defaults состоит из одного или более логических выражений, присваиваемых константам или переменным. В примере, показанном выше, значение по умолчанию VCC присваивается переменной a.
Каждое выражение заканчивается символом (;).
Оператор Default активизируется в том случае, когда какая-либо переменная, включенная в список оператора Default в каком-либо из операторов, оказывается неопределенной. В примере, показанном выше, переменная aоказывается неопределенной, еслиy и zимеют значения логического нуля; таким образом активизируется выражение (a= VCC) в операторе Default.
При использовании оператора Default необходимо соблюдать следующие правила:
В разделе Logic допускается использовать не более одного оператора Default и кроме того при его использовании он должен располагаться сразу за ключевым словом BEGIN.
Если в операторе Default в отношении одной и той же переменной производятся многократные присваивания, то все присваивания за исключением последней игнорируются.
Оператор Default не может использоваться для присваивания значения X (безразлично) переменным.
Многократные присваивания значений узлу, имеющему тип NODE, объединяются в соответствии с функцией логическое ИЛИ, за исключением того случая, когда значением по умолчанию для этой переменной является VCC. Следующий пример текстового файла проекта (TDF) иллюстрирует значения по умолчанию для двух переменных: aс значением по умолчанию GND иbnс значением по умолчаниюVCC:
BEGIN
DEFAULTS
a = GND;
bn = VCC;
END DEFAULTS;
IF c1 THEN
a = a1;
bn = b1n;
END IF;
IF c2 THEN
a = a2;
bn = b2n;
END IF;
END;
Этот пример эквивалентен следующему выражению:
a = c1 & a1 # c2 & a2;
bn = (!c1 # b1n) & (!c2 # b2n);
Переменные, имеющие активно низкий уровень и участвующие в многократных присваиваниях, должны иметь значение по умолчанию VCC. В следующем примере reg[].clrn имеет значение по умолчанию VCC:
SUBDESIGN 5bcount
(
d[5..1] : INPUT;
clk : INPUT;
clr : INPUT;
sys_reset : INPUT;
enable : INPUT;
load : INPUT;
q[5..1] : OUTPUT;
)
VARIABLE
reg[5..1] : DFF;
BEGIN
DEFAULTS
reg[].clrn = VCC;
END DEFAULTS;
reg[].clk = clk;
q[] = reg[];
IF sys_reset # clr THEN
reg[].clrn = GND;
END IF;
!reg[].prn = (load & d[]) & !clr;
!reg[].clrn = load & !d[];
reg[] = reg[] + (0, enable);
END;