
- •Язык 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.
- •Синтаксис
- •Стилизация
- •Золотые правила
- •Контекстно-зависимая помощь
Реализация тристабильных шин
Примитивы TRI, которые управляют портами OUTPUT или BIDIR, имеют вход разрешения выхода (Output Enable), который переводит выход в высокоимпедансное состояние.
Вы можете создать тристабильную шину путем соединения примитивов TRI и портов OUTPUT или BIDIR вместе с помощью узла TRI_STATE_NODE типа. Схема управления должна обеспечивать разрешение не более одного выхода в одно и тоже время.
Файл tri_bus.tdf, приведенный ниже, реализует тристабильную шину, используя узел TRI_STATE_NODE типа, созданный в объявлении Node.
SUBDESIGN tri_bus
(
in[3..1], oe[3..1] : INPUT;
out1 : OUTPUT;
)
VARIABLE
tnode : TRI_STATE_NODE;
BEGIN
tnode = TRI(in1, oe1);
tnode = TRI(in2, oe2);
tnode = TRI(in3, oe3);
out1 = tnode;
END;
В этом примере несколько присваиваний узлу tnode, связывают сигналы вместе. Для реализации тристабильной шины требуется тип TRI_STATE_NODE, вместо типа NODE: для типа NODE сигналы связываются вместе с помощью проводного И или проводного ИЛИ, тогда как для типа TRI_STATE_NODE сигналы соединяются с тем же самым узлом. Однако, если только одна переменная присваивается узлу TRI_STATE_NODE, то она трактуется как переменная обычного типа NODE.
Последовательностная логика
Последовательную логику в языке AHDL можно реализовать с помощью конечных автоматов, регистров и защелок или используя библиотеку параметрических модулей (LPM). Конечные автоматы особенно удобны для реализации последовательной логики. Другими примерами являются счетчики и контроллеры.
Объявление регистров
Регистры запоминают значения данных и синхронизируют их с помощью сигнала Clock. Вы можете объявить экземпляр регистра с помощью объявления Registerв разделеVariable. ( Вы можете также реализовать регистр используя ссылки на функции в разделеLogic). AHDL предлагает несколько примитивов регистров, а также поддерживает регистровые LPM функции.
После того как Вы объявили регистр, Вы можете соединить его с другой логикой в TDF файле, используя его порты. Порт экземпляра используется в следующем формате:
<имя экземпляра>.<имя порта>
Файл bur_reg.tdf, приведенный ниже, использует объявление Registerдля создания байтного регистра, который фиксирует значения входов d на переднем фронте Clock, когда вход загрузки высокий.
SUBDESIGN bur_reg
(
clk, load, d[7..0] : INPUT;
q[7..0] : OUTPUT;
)
VARIABLE
ff[7..0] : DFFE;
BEGIN
ff[].clk = clk;
ff[].ena = load;
ff[].d = d[];
q[] = ff[].q;
END;
Регистры объявляются в разделе Variableкак DFFE(D триггер с сигналом разрешения). Первое булево уравнение в разделеLogicсоединяет вход clk с портами Clock триггеров ff[7..0].
Второе уравнение соединяет вход загрузки с портами разрешения тактовой частоты. Третье уравнение соединяет входы данных d[7..0] с входными портами триггеров ff[7..0]. И четвертое уравнение соединяет выходы с выходными портами триггеров. Все четыре уравнения оцениваются совместно.
Вы можете также объявить T, JK, и SR триггеры в разделе Variable, а затем использовать в разделеLogic.
Если Вы хотите загрузить регистр на определенном переднем фронте глобального сигнала Clock, Altera рекомендует использовать вход разрешения тактовой частоты одного из DFFE, TFFE, JKFFE, или SRFFE триггеров для управления загрузкой регистра.
Файл lpm_reg.tdf, приведенный ниже, использует ссылку для реализации экземпляра функции lpm_dff, который обладает такой же функциональностью, как и файл bur_reg.tdf.
INCLUDE "lpm_dff.inc";
SUBDESIGN lpm_reg
(
clk, load, d[7..0] : INPUT;
q[7..0] : OUTPUT;
)
BEGIN
q[] = lpm_dff (.clock=clk, .enable=load, .data[]=d[])
WITH (LPM_WIDTH=8)
RETURNS (.q[]);
END;