Язык AHDL содержит следующие ключевые (служащие для построения синтаксических конструкций) слова.
and function output
assert generate parameters
begin gnd report
bidir help_id returns
bits if segments
buried include severity
case input states
clique is subdesign
connected_pins log2 table
constant machine then
defaults mod title
define nand to
design node tri_state_node
device nor variable
div not vcc
else of when
elsif options with
end or xnor
for others xor
Кроме ключевых слов в языке AHDL для служебных целей зарезервированы следующие имена
carry jkffe srffe
cascade jkff srff
ceil latch tffe
dffe lcell tff
dff mcell tri
exp memory used
floor opendrn wire
global soft x
Ключевые слова и зарезервированные имена не могут быть использованы разработчиком для создания имен переменных.
Однако в случае специального вида имен – заключенных в одиночные кавычки – они могут быть использованы для именования модулей и портов, а ключевые слова – также и для именования переменных (см. раздел 2.4 "Имена").
2.4. Имена
Именами называются определяемые пользователем слова из допустимых символов языка, предназначенные для идентификации различных объектов в текстовом описании устройства. В оригинальном описании языка AHDL имена разделяются на три группы.
Символические имена могут быть присвоены:
· внутренним и внешним узлам и группам;
· константам;
· конечным автоматам, их состояниям и битам состояний;
· экземплярам примитивов и модулей (функций);
· параметрам;
· сегментам памяти;
· вычисляемым функциям;
· именованным операторам.
Имена модулей (subdesign names) – это имена проектов нижнего уровня (модулей). Должны быть такими же, как и имена конструкторских файлов (*.tdf) с описанием этих модулей.
Имена портов – имена входных и выходных выводов модулей.
В отличие от использования имен в языках программирования в языке AHDL все три группы имен могут быть представлены в двух формах: в обычной форме (без кавычек) и в одинарных кавычках.
Примеры:
a; int; outs[];
'stable'; '_dec';
При создании графического символа модуля, с целью последующего использования данного модуля в проектах с графическим вводом данных, имена портов в кавычках будут отображаться в символе без кавычек.
Для всех имен могут быть использованы следующие символы:
· латинские буквы от A до Z и от a до z;
· арабские цифры от 0 до 9;
· знак подчеркивания _.
При создании имен модулей в кавычках и без кавычек нельзя использовать знак "/". В других именах применение этого символа допустимо.
Символ "-", а также ключевые слова нельзя использовать во всех именах без кавычек. В именах с кавычками они допустимы.
Все имена, за исключением символических имен без кавычек, могут состоять только из цифр. В частности, такие имена присвоены фирмой Altera готовым модулям, представляющим реализацию типовых устройств из набора ранее выпускавшихся дискретных микросхем серии 74XXX. Зарезервированные имена могут быть использованы только в именах модулей и портов, заключенных в кавычки.
2.5. Комментарии
В языке AHDL существуют два типа комментариев (текста пояснений, не воспринимаемых компилятором). Первый – многострочный комментарий. Он начинается и заканчивается символом процента "%".
Пример:
variable
a : node;
% переменная a введена для упрощения %
Второй тип комментария – однострочный. Он начинается символом
"--" и продолжается до конца текущей строки.
Пример:
a[7..0] : input; --входная шина адреса
2.6. Константы
2.6.1. Литеральные константы
Литеральные константы не имеют имени и представляются в выражениях своим непосредственным значением. В языке AHDL употребляются литеральные константы трех типов.
Логические константы
Предназначены для присваивания портам и узлам (выводам и сигнальным линиям) постоянных логических значений vcc (логическая 1) и gnd (логический 0). Такое присваивание означает подключение порта или узла к линии питающего напряжения или к земле.
Пример:
ina = vcc; --подключение узла ina к логической 1
Числовые константы
(В оригинальном описании языка называются числами – numbers.) Предназначены для использования в логических выражениях при присваивании логических значений группам сигнальных линий (шинам). Используются также для служебных целей, таких как указание числа элементов в группе, номеров линий в группе и т. п.
Числовые литеральные константы должны быть целыми числами без знака. Эти константы могут быть представлены в четырех видах:
· в десятичной системе последовательностью цифр от 0 до 9;
· в двоичной системе латинской буквой b и набором нулей, единиц и латинских букв x, заключенным в двойные кавычки (буква x, применяемая только в двоичном представлении, обозначает разряды, логическое значение которых безразлично);
· в восьмеричной системе латинскими буквами o или q и набором цифр из диапазона 0..7, заключенным в двойные кавычки;
· в шестнадцатеричной системе латинскими буквами x или h и набором шестнадцатеричных цифр из диапазонов 0..9 и a..f, заключенным в двойные кавычки.
Примеры:
10; 541; 1001 – десятичное представление;
b"0011xx11"; B"1110" – двоичное представление;
o"1777"; O"157"; q"77"; Q"771" – восьмеричное представление;
x"0ffa"; X"1100"; h"f000"; H"00fe" – шестнадцатеричное представление.
В качестве операндов логических выражений любые числовые константы интерпретируются компилятором как двоичные.
Целесообразно в логических выражениях и операторах использовать двоичное или шестнадцатеричное представление констант, а для обозначения размерности групп и т. п. – десятичное представление.
Строковые константы
Представляют собой заключенные в двойные кавычки последовательности из любых символов в количестве не более 255. Могут применяться в логическом операторе if generate и в служебных операторах parameters, assert, title.
В случае необходимости употребления внутри строковой константы двойных кавычек они должны вводиться дважды.
Пример:
title "Controller ""M021""";
parameters
(
mod_type = "add";
)
subdesign example_01
(
ina[7..0] :input;
outs[7..0] :output;
)
begin
if (mod_type == "add") generate
. . .
2.6.2. Именованные константы
Именованные константы позволяют с помощью одной строки изменять значение константы одновременного во всех строках описания, в которых это значение используется. При этом исключается появление пропусков и ошибок, возможных в случае использования большого количества одинаковых литеральных констант.
Именованные константы объявляются в предварительном разделе с помощью оператора constant. Для каждой константы необходим отдельный оператор. В операторе после ключевого слова constant следуют имя константы, знак операции присваивания и значение константы. Завершается оператор точкой с запятой. В качестве присваиваемого значения может быть применено вычисляемое арифметическое выражение.
Пример:
constant prn_data = h"378";
constant u_limit = 12 + 5 div 2;
2.6.3. Параметры
Параметры – это специальный вид констант языка AHDL, позволяющий конфигурировать так называемые параметризируемые модули для конкретных условий их применения. В этих модулях некоторые свойства, такие, например, как разрядность данных, могут принимать значения, устанавливаемые разработчиком. Такая гибкость позволяет уменьшать количество библиотечных модулей, а также экономно расходовать аппаратные ресурсы ПЛИС.
Параметры объявляются в конструкторском файле описания параметризируемого модуля, а значения им присваиваются в конструкторском файле проекта, использующего модуль как компонент.
Объявление параметров осуществляется с помощью оператора parameters, который может быть употреблен в файле произвольное количество раз. Этот оператор должен располагаться в предварительном разделе. Список объявляемых в операторе параметров, отделяемых друг от друга запятыми, заключается в круглые скобки. Имена параметров определяются разработчиком. Могут быть использованы имена, предопределенные фирмой Altera, например DEVICE_FAMILY – семейство микросхем. При объявлении параметру может быть присвоено необязательное значение по умолчанию, которое будет применено компилятором в случае, если при использовании модуля параметру не будет присвоено иное значение. Оператор заканчивается точкой с запятой.
Пример:
parameters
(
width,
addr_w = 8,
device_family = "FLEX10K"
);
В приведенном примере первому параметру width не присвоено значения по умолчанию. Второму и третьему – присвоено.
Значения параметров могут быть числовыми константами, арифметическими выражениями или строковыми константами. Присваиваемое значение можно выражать через другой параметр, значение которому присвоено ранее.
Присваивание требуемого значения параметру осуществляется в разделе переменных (variable section) файла, в котором используется параметризируемый модуль. Это делается с помощью ключевого слова with при объявлении экземпляра (instance) модуля.
Пример:
variable
reg1 :lpm_rg with (width = 16);
begin. . .
В приведенном примере объявлен один экземпляр модуля lpm_rg с именем reg1. При объявлении параметру width присвоено значение 16. После присвоения значения параметр может использоваться на протяжении всего текущего файла как именованная константа.
2.7. Переменные
Простые переменные в языках описания аппаратуры представляют собой именованные линии (узлы) проектируемой электрической схемы. Операция присваивания значения переменной определяет присоединение одной линии к другой. Присоединяемая линия может не иметь имени и быть результатом реализации логического выражения над несколькими сигналами. Это выражение должно находиться справа от знака операции присваивания "=". Имя линии, к которой происходит присоединение, должно находиться слева от знака операции.
Пример:
trig_a. d = datain;
trig_b. d = datain and strob;
В приведенном примере ко входу d триггера с именем trig_a подключен узел datain. Ко входу d триггера с именем trig_b подключен сигнал, являющийся результатом логической операции И (and) над сигналами datain и strob.
В языке AHDL возможно повторное присваивание переменной еще одного значения. Оно предполагает присоединение ко входу второго сигнала вместе с предыдущим. Каким будет результирующее логическое значение данной переменной, если присоединенные сигналы будут разного логического уровня, определяется типом переменной, которой присваиваются сигналы.
Необходимо отметить, что все логические уравнения, входящие в описание устройства, реализуются в виде электрической схемы одновременно, а не последовательно во времени.
2.7.1. Простые типы переменных
Порты
Порт – это входной или выходной вывод логического устройства (модуля). В языке AHDL описание модуля может быть файлом верхнего уровня, т. е. описанием всего устройства целиком, или файлом нижнего уровня, т. е. описанием отдельного блока. Один и тот же файл может быть представлен на верхнем уровне иерархии, если кроме него в устройстве (микросхеме) нет других блоков, и на нижнем уровне, если он является только частью более сложного устройства. Поэтому порты фигурируют в конструкторских файлах в двух видах.
1. Внешние порты являются входами и выходами устройства, описываемого в данном конструкторском файле. В случае когда файл представляет описание верхнего уровня иерархии, эти порты будут являться внешними выводами микросхемы. Они объявляются в интерфейсном разделе (subdesign section) и могут быть следующих типов:
· input (входной вывод);
· output (выходной вывод);
· bidir (двунаправленный вывод);
· machine input (входной вывод конечного автомата);
· machine output (выходной вывод конечного автомата).
Последние два типа предназначены только для файлов нижнего уровня в проекте, т. е. не могут подключаться к выводам микросхемы.
Порты типа input могут быть использованы в логических выражениях только справа от знака присваивания, а порты типа output – только слева. Порты типа bidir могут быть задействованы и в том и в другом вариантах.
При объявлении портов типа input и bidir им могут быть назначены значения "по умолчанию" vcc или gnd, следующие после знака операции присваивания. Эти значения будут использованы компилятором только в случае, когда данное устройство будет входить в конструкторский файл более высокого уровня иерархии, в котором рассматриваемые выводы окажутся по какой-либо причине неподключенными.
Порты типа bidir предназначены для выводов, по которым сигналы, в зависимости от ситуации, либо поступают в устройство, либо выводятся из него. Внутренняя и внешняя логика работы устройства должна обеспечивать бесконфликтное функционирование этих режимов.
2. Порты (внутренние) модулей нижнего уровня, используемых в данном конструкторском файле, являются входными и выходными линиями этих модулей (блоков). Модули могут быть предопределенными примитивами языка AHDL (буферами и триггерами), компонентами библиотеки фирмы Altera (в оригинальном описании непараметризированными и параметризированными функциями) или устройствами, созданными разработчиком.
Внутренние порты объявляются ранее в файлах описания самих модулей, где они выступают как внешние порты (см. п. 1 данного раздела). В конструкторском же файле верхнего уровня они представляют собой выводы внутренних блоков, т. е. изначально присущие им атрибуты.
Сами модули, вернее их именованные экземпляры, поскольку в одном устройстве может быть установлено несколько одинаковых модулей, объявляются в разделе переменных (variable section) конструкторского файла верхнего уровня. Обращение к внутренним портам модулей реализует соединения с входами или выходами этих модулей. Соединения описываются с помощью операции присваивания в логическом разделе (logic section). Обращение к порту экземпляра модуля начинается с имени экземпляра модуля, за которым после точки следует имя его внутреннего порта.
Пример:
subdesign example_02
(
data, clock :input;
out :output;
)
variable
a_trig, b_trig :dff;
begin
a_trig. clk = clock;
b_trig. clk = clock;
a_trig. d = b_trig. q;
. . .
В приведенном примере в разделе переменных объявляются два экземпляра триггера типа dff (примитивы AHDL) с именами a_trig и b_trig. В логическом разделе к внутренним портам clk обоих триггеров подключается внешний входной порт всего устройства clock, объявленный в интерфейсном разделе. Выходной порт q триггера b_trig присоединяется к входному порту d триггера a_trig.
Узлы
Узлами (nodes) являются именованные внутренние линии передачи сигналов. Узлы, если в них есть необходимость, объявляются в разделе переменных. В приведенном выше примере example_02 линия соединения входа d триггера a_trig с выходом q триггера b_trig не является узлом, так как специально не объявлена и не снабжена именем.
Узлы применяются для упрощения логических выражений.
Пример:
begin
outa = in1 and in2;
outb = not (in1 and in2);
. . .
Представленные два логических выражения можно записать иначе, объявив вспомогательный узел a типа node:
variable
a :node;
begin
a = in1 and in2;
outa = a;
outb = not a;
. . .
Узлы могут быть двух типов: node и tri_state_node. Оба типа узлов, в отличие от портов, могут использоваться в логических выражениях и слева, и справа от знака операции присваивания. Узлы типа node предназначены для создания обычных сигнальных линий. Узлы типа tri_state_node предназначены для создания линий с тремя состояниями. К узлам типа tri_state_node могут подключаться только следующие порты и примитивы языка AHDL:
· выход примитива tri (буфер с тремя состояниями на выходе);
· внешний порт типа input данного конструкторского файла;
· внутренние порты типа output и bidir модулей нижнего уровня, входящих в данных конструкторский файл;
· другие узлы типа tri_state_node данного файла.
Кроме этого, типы узлов отличаются способом реализации компилятором многократного присваивания значений узлам. Для узлов типа node многократное присваивание, т. е. присоединение к узлу нескольких линий, воплощается компилятором аппаратно как монтажное И или монтажное ИЛИ над логическими значениями подключаемых сигналов. При этом операция И (and) выполняется, если значение по умолчанию для этого узла, определенное с помощью оператора defaults (см. ниже), равно vcc, а операция ИЛИ (or) – если значение по умолчанию равно gnd. (Если значение по умолчанию явно не определено в операторе defaults, то таким значением является gnd.)
Многократное присваивание значений узлам типа tri_state_node обеспечивает подключение всех сигналов к узлу без каких-либо логических операций над ними. Поэтому присоединение к узлам типа tri_state_node нескольких выходов с тремя состояниями (выходы буферов tri) должно контролироваться схемой управления таким образом, чтобы одновременно обеспечивалось разрешение работы только одного из буферов (остальные должны быть в третьем состоянии).
Группы
Группы в языке AHDL являются наборами узлов, портов, примитивов или модулей, используемых в логических выражениях как единое целое. Если речь идет о группах одноименных узлов или портов, то подходящим для них названием является термин "шина".
В языке AHDL группы могут быть трех типов.
1. Одномерная группа одноименных элементов. Такая группа подобна одномерному массиву в языках программирования и объявляется похожим образом.
Пример:
constant w = 4;
subdesign example_03
(
ina[3..0] :input;
qa[4..1] :output;
)
variable
tr[w-1..0] :dff;
begin
. . .
В приведенном примере в интерфейсном разделе объявлены одномерная группа из четырех портов типа input с именем ina и одномерная группа из четырех портов типа output с именем qa. Указанные при объявлении в квадратных скобках числа определяют верхнюю и нижнюю границы номеров элементов группы. Границы могут быть числами или арифметическими выражениями, содержащими ранее определенные числовые константы (см. объявление группы tr в примере).
Для обращения к отдельному элементу группы существует два способа:
· по имени группы и номеру в квадратных скобках (qa[3] = =gnd; – присоединение к 4-й линии группы qa логического нуля);
· по имени группы, включающему в себя номер элемента, записываемого без разделяющего пробела (qa3 = gnd; – это присваивание эквивалентно предыдущему).
Второй способ накладывает ограничения на правила образования имен.
Во избежание неправильной трактовки описания компилятором не следует давать одиночным узлам, портам и примитивам имена, оканчивающиеся цифрой. Кроме того, число символов в имени группы вместе с самым длинным номером элемента не должно превышать 32.
Для одновременного обращения ко всем элементам группы в выражениях (но не при объявлении группы) можно использовать квадратные скобки без указания индексов.
Пример:
outa[] = gnd;
В приведенном примере все элементы группы outa будут подключены к "земле".
В логическом выражении можно обращаться к части элементов группы с подряд идущими номерами.
Пример:
variable
a[7..0] :node;
begin
a[7..4] = vcc;
a[3..0] = gnd;
2. Двухмерная группа одноименных элементов. Такая группа подобна двухмерному массиву в языках программирования.
Пример:
subdesign example_04
(
a[7..0][2..1] :input;
. . .
Обращаться к отдельным элементам двухмерной группы также можно двумя способами: с помощью двух номеров в отдельных квадратных скобках и по этим же номерам, вставляемым в имя группы и разделяемым знаком подчеркивания.
Пример:
ina[5][1] = clk;
ina5_1 = clk;
Приведенные выше две строки эквивалентны.
3. Временная (последовательная) группа. Такая группа специально не объявляется, а создается из отдельных узлов и обычных групп или их частей для использования в одном логическом выражении. Список объединяемых в такую группу элементов заключается в круглые скобки. Внутри списка элементы разделяются запятыми, при этом левый элемент списка будет старшим значащим битом, а правый – младшим.
Пример:
subdesign example_05
(
a[7..0] :output;
b[7..0] :input;
)
begin
a[] = (gnd, b0,gnd, b[4..1],vcc);
end;
В приведенном примере элементам одномерной группы a[] присвоены значения битов временной группы (gnd, b0, gnd, b[4..1],vcc). Положение битов в группе определяет следующую схему присоединения линий:
a[0] = vcc; --младший бит
a[1] = b[1];
a[2] = b[2];
a[3] = b[3];
a[4] = b[4];
a[5] = gnd;
a[6] = b[0];
a[7] = gnd; --старший бит
Если временная группа используется в логическом выражении слева от знака присваивания, то отдельные элементы в ней могут быть пропущены (между запятыми). В этом случае соответствующие пропущенным местам элементы группы, стоящей справа от знака присваивания, не будут подключены в данной операции. В нижеприведенном примере это сигналы a[6], a[5] и a[0].
Пример:
subdesign example_06
(
a[7..0] :input;
b[4..0] :output;
)
begin
(b0,,,b[4..1],) = a[];
end;
При выполнении операций присваивания с участием групп необходимо выполнять следующие правила.
1. Группе присваивается другая группа:
а) группы должны быть одинакового размера, например
a[2..0]=(b[1..0],c);
б) стоящая справа от знака присваивания группа может быть меньшего размера, чем стоящая слева, но в этом случае число элементов левой группы должно нацело делиться на число элементов правой; например, выражение
a[5..0]=b[1..0];
обеспечивает следующее подсоединение элементов групп:
a[0]=b[0];
a[1]=b[1];
a[2]=b[0];
a[3]=b[1];
a[4]=b[0];
a[5]=b[1];.
2. Группе присваивается одиночный узел или логическая константа. Узел или константа присоединяется к каждому элементу группы.
Примеры:
а) d[3..1]=a;
это выражение эквивалентно следующим трем:
d[1]=a;
d[2]=a;
d[3]=a;
б) c[2..0]=gnd;
такое выражение эквивалентно следующим:
c[0]=gnd;
c[1]=gnd;
c[2]=gnd;
в) и, наконец,
z[3..0]=vcc;
обеспечивает следующее присваивание:
z[0]=vcc;
z[1]=vcc;
z[2]=vcc;
z[3]=vcc;.
3. Группе присваивается числовая константа. В этом случае константа интерпретируется как двоичное число и допускаются два варианта:
а) число элементов группы и число двоичных разрядов константы совпадают – каждому элементу группы присваивается соответствующий разряд константы, при этом единичному значению разряда приписывается логическое значение vcc , а нулевому – gnd, например, выражение
y[3..0]=b"1101";
обеспечивает следующее присваивание элементам группы:
y[0]=vcc;
y[1]=gnd;
y[2]=vcc;
y[3]=vcc;
б) число двоичных разрядов константы меньше числа элементов группы – недостающие слева разряды константы заполняются нулями:
a[3..0]=2;
двоичное представление числа 2 (b"10") дополняется слева двумя нулями – b"0010", что дает следующий результат:
a[0]=gnd;
a[1]=vcc;
a[2]=gnd;
a[3]=gnd;.
Частными случаями последнего правила являются следующие:
а) уравнение a[3..0]=0; эквивалентно следующим четырем:
a[0]=gnd;
a[1]=gnd;
a[2]=gnd;
a[3]=gnd;
б) уравнение a[3..0]=1; - следующим:
a[0]=vcc;
a[1]=gnd;
a[2]=gnd;
a[3]=gnd;
2.7.2. Сложные типы переменных
Примитивы
В языке AHDL в качестве готовых логических блоков могут быть использованы встроенные примитивы буферов и триггеров. Наиболее легко воспринимаемым способом их использования в описании устройства является объявление именованного экземпляра примитива в разделе переменных. После такого объявления в логическом разделе описания можно обращаться к портам (выводам) примитива.
Пример:
subdesign example5
(
data[3..0], clk :input;
outd :output;
)
variable
a: dff; %объявление экземпляра примитива%
begin
a. d=data[0]; %подключение порта d примитива%
a. clk=clk; %подключение порта clk%
outd=a. q; %подключение выходного порта q примитива%
. . .
Для корректного использования примитива необходимо знать имена, назначение и последовательность перечисления всех входных и выходных его портов.
1. Встроенные примитивы буферов. В языке AHDL определены следующие основные примитивы буферов:
· carry_sum – буфер переноса, обеспечивает аппаратное формирование переноса между соседними разрядами в устройствах типа сумматоров и счетчиков; примитив содержит два входа sin и cin (суммы и переноса) и два выхода sout и cout (выходных суммы и переноса);
· global – буфер глобальной цепи, обозначает что сигнал является глобальным синхронизирующим и должен распространяться по выделенной линии связи (global routing paths); содержит один вход in и один выход out; выход может подключаться ко входам clk, clrn, prn, ena примитивов триггеров (см. ниже) или линиям разрешения чтения или записи памяти;
· lcell – буфер размещения логической ячейки, обеспечивает использование отдельной логической ячейки для сигнала; содержит один вход in и один выход out; буфер не может быть удален компилятором в ходе оптимизации схемы;
· soft – удаляемый буфер размещения логической ячейки, резервирует возможность использования логической ячейки в случае, если компилятор установит целесообразность такого варианта; содержит один вход in и один выход out; в процессе компиляции или удаляется или заменяется на lcell;
· tri – буфер с третьим состоянием, содержит сигнальный вход in, вход управления oe и выход out; если на вход oe подан высокий логический уровень (vcc), то выход out повторяет сигнал на входе in; если на входе oe установлен низкий логический уровень (gnd), то выход out переходит в третье состояние;
· opndrn – буфер с открытым стоком, содержит один вход in и один выход out; если на входе in установлен низкий логический уровень (gnd), то на выходе out также устанавливается уровень gnd; если на вход in подан высокий логический уровень (vcc) – на выходе устанавливается третье состояние.
В ранних версиях САПР фирмы Altera существовали и другие примитивы буферов, но в новых разработках они не должны применяться.
2. Встроенные примитивы триггеров. Примитивы триггеров обеспечивают реализацию последовательностных устройств (устройств с памятью). В современных семействах FPGA фирмы Altera (ACEX 1K, Cyclone, FLEX 10K, HardCopy Stratix, Mercury, Stratix, Stratix II и Stratix GX) используется один примитив триггера – dffea. Все примитивы триггеров, определенные в языке AHDL, представлены в табл. 2.2.
Таблица 2.2
Примитивы триггеров языка AHDL
ИМЯ | ТИП ТРИГГЕРА | ВХОДНЫЕ ПОРТЫ |
dffea | D-триггер с управлением синхронной и асинхронной загрузкой | d, clk, clrn, prn, ena, adata, aload |
dff | D-триггер | d, clk, clrn, prn |
dffe | D-триггер с управлением синхронной загрузкой | d, clk, clrn, prn, ena |
tff | T-триггер | t, clk, clrn, prn |
tffe | T-триггер с управлением синхронной загрузкой | t, clk, clrn, prn, ena |
jkff | JK-триггер | j, k, clk, clrn, prn |
jkffe | JK-триггер с управлением синхронной загрузкой | j, k, clk, clrn, prn, ena |
srff | SR-триггер | s, r, clk, clrn, prn |
srffe | SR-триггер с управлением синхронной загрузкой | s, r, clk, clrn, prn, ena |
latch | Триггер-защелка | d, ena |
Порты d и clk всех триггеров и порт ena триггера-защелки должны быть обязательно подключены в устройстве.
Все триггеры содержат единственный выходной порт q. Входные порты, в случае использования примитивов триггеров без объявления именованных экземпляров (способ "по ссылке" – см. ниже по тексту), должны указываться в порядке, приведенном в табл. 6.1.
Входные порты d, t, j, k, s, r триггеров предназначены для подключения сигнальных линий данных. Порт clk предназначен для подачи сигнала синхронизации на триггеры. Триггеры перебрасываются в состояние, определяемое линиями данных, по переднему (возрастающему) фронту сигнала clk. При этом для триггеров с управлением синхронной загрузкой на входе ena должен быть установлен активный (высокий) уровень. В противном случае синхронная загрузка блокируется. Для триггера-защелки вход ena обеспечивает режим прозрачности при высоком уровне (сигнал на выходе триггера равен входному) и режим хранения при низком уровне.
Вход clrn предназначен для асинхронного сброса триггера (установки 0 на выходе). Активный уровень этого входа – низкий (gnd). Вход prn обеспечивает асинхронную установку триггера (1 на выходе). Активный уровень этого входа также gnd.
Вход aload триггера dffea при уровне 1 включает режим асинхронной загрузки триггера данными со входа adata. Этот режим несовместим с активными уровнями (0) на входах clrn и prn.
Входные порты d и clk триггеров, а также вход ena триггера-защелки должны быть обязательно подключены к каким-либо линиям устройства.
Для использования примитивов кроме способа, основанного на объявлении именованных экземпляров, в языке AHDL существует еще один – так называемый "вызов по ссылке". При его реализации имя примитива без предварительного объявления используется непосредственно в логическом уравнении. При этом имя примитива ставится справа от знака операции присваивания и воспринимается компилятором как его выходной порт (для триггеров это выход q). На входные порты примитива сигналы подаются путем указания имен подключаемых узлов в списке, представляющем собой временную группу. Этот список следует сразу же за именем примитива в круглых скобках. Положение узла в списке в порядке слева направо однозначно определяет внутренний входной порт примитива, к которому он подключается. Это положение строго задано описанием примитива (прототипом) и для триггеров представлено в табл. 2.2.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 |


