1.25.Раздел тела проекта (Logic) Раздел Logic определяет логическое функционирование текстового файла проекта (TDF) и является собственно его телом.
Раздел Logic заключается в ключевые слова BEGIN и END. За ключевым словом END следует символ (;), заканчивающий раздел. Если используется оператор Defaults, то он должен предшествовать всем другим операторам в этом разделе.
AHDL является параллельным языком. Компилятор анализирует поведенческую модель, описанную в разделе Logic, параллельно. Выражения, осуществляющие множественные присваивания объекту, имеющему тип NODE или переменной, объединяются в соответствии с функцией монтажное ИЛИ.
В разделе Logic могут быть многократно использованы следующие операторы и разделы:
Булевские выражения.
Управляющие булевские выражения.
Оператор Case.
Оператор Defaults.
Оператор If Then.
Оператор If Generate
Оператор If Generate
Оператор таблицы истинности
Раздел Logic может также содержать оператор Assert.
1.25.1.Задание исходных значений (Defaults Statment) Оператор Defaults позволяет определять значения по умолчанию, применяемые в таблицах истинности, а также в операторах If Then и Case. Поскольку активно- высокие сигналы автоматически имеют значения по умолчанию GND, то оператор Default необходим лишь в случае использования активно-низких сигналов.
Не следует путать значения по умолчанию, присваиваемые переменным со значениями по умолчанию, присваиваемыми портам в разделе Subdesign.
Следующий пример демонстрирует использование оператора Defaults: BEGIN
DEFAULTS
a = VCC;
END DEFAULTS; IF y & z THEN
a = GND; % a активный низкий %
END IF;
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;
1.25.2.Булевские выражения (Boolean Equations) Булевские выражения используются в разделе Logic текстового файла проекта на языке AHDL для представления соединений узлов, входных и выходных потоков сигналов через входные и выходные выводы, примитивы, макро- и мегафункции и конечные автоматы.
Следующий пример демонстрирует сложное булевское выражение: a[] = ((c[] & -B"001101") + e[6..1]) # (p, q, r, s, t, v); Левая часть выражения может быть символическим именем, именем порта или именем группы. Для инвертирования выражения в левой части выражения можно пользоваться операцией NOT (!). Правая часть равенства представлена булевским выражением, вычисляемым в порядке, описанном в разделе “Приоритеты булевских операторов и операций отношения”.
Символ эквивалентности (=) используется в булевских выражениях для индикации того, что результат булевского выражения, представленного в правой части, является источником сигнала для символического объекта или группы в левой части. Символ (=) отличается от символа (==), используемого как компаратор.
В примере, показанном выше, булевское выражение в правой части равенства вычисляется в соответствии со следующими правилами:
Двоичное число B”001101” меняет знак и принимает вид B”110011”. Унарная операция (-) имеет наивысший приоритет.
B”110011” объединяется по И с группой c[]. Эта операция имеет второй уровень приоритета, потому что она заключена в круглые скобки.
Результат групповой операции, проведенной на втором шаге, прибавляется к группе e[6..1].
Результат, полученный на третьем шаге, объединяется по ИЛИ с группой (p, q, r, s, t, v). Это выражение имеет наименьший уровень приоритета.
Результат операции присваивается группе a[ ]. Для корректного выполнения операций, показанных выше, необходимо, чтобы количество бит в группе в левой части выражения было равно или делилось нацело на число бит в группе в правой части выражения. Биты в левой части выражения отображаются на соответствующие биты в правой части выражения по порядку. В отношении булевских выражений используются следующие правила:
Множественные присваивания, осуществляемые в отношении переменной объединяются в соответствии с монтажным ИЛИ (#), исключая тот случай, когда значением по умолчанию для этой переменной является VCC.
Узлы в левой части булевского выражения однозначно соответствуют узлам в правой части .
Если значение одиночного узла, VCC или GND присваиваются группе, то значение узла или константы копируется до размерности группы . Например, (a, b) = e эквивалентно a = e и b = e.
Если и левая и правая части выражения представляют собой группы одинакового размера, то каждый член группы, расположенной в правой части, соответствует тому члену группы в левой части, который расположен на той же позиции .Например, (a, b) = (c, d) эквивалентно a = c и b = d.
При сложении двух групп в правой части булевского выражения с использованием операции (+) можно добавить символ “0” слева каждой группы для знакового расширения. Этот метод может быть использован для получения дополнительного бита сигнала переноса в группе, расположенной в левой части выражения. В следующем примере группы count[7..0] и delta[7..0] представлены в знакорасширенном формате для получения значения бита переноса, обозначенного символическим именем cout в левой части выражения:
(cout, answer[7..0]) = (0, count[7..0]) + (0, delta[7..0])
Если в левой и правой частях булевского выражения расположены группы разных размерностей, то количество бит в группе слева должно быть равно или делиться нацело на количество бит в правой части выражения. Биты в левой части выражения отображаются на биты в правой части выражения по порядку. Следующая запись является корректной:
a[4..1] = b[2..1]
В данном выражении биты отображаются в следующем порядке:
a4 = b2
a3 = b1
a2 = b2
a1 = b1
Группа узлов или чисел не может быть присвоена одиночному узлу.
Если число в правой части выражения присваивается группе, расположенной в левой части выражения, то число усекается или расширяется путем распространения знака до соответствия размеру группы в левой части. Если при этом происходит усечение значащих битов, то компилятор выдает сообщение об ошибке. Каждый член в правой части выражения присваивается соответствующему члену в левой части выражения по порядку. Например, (a, b) = 1 эквивалентно a = 0; b =1;
Запятые могут использоваться для резервирования места под неупомянутые элементы группы в булевских выражениях Следующий пример демонстрирует использование запятых для резервирования места под отсутствующие элементы группы (a, b, c, d) :
(a, , c, ) = B"1011";
В данном примере элементам a и c присваивается значение “1”.
Каждое выражение заканчивается символом (;).
1.25.3.Управляющие булевские выражения (Boolean Control Equations) Управляющие булевские выражения используются в разделе Logic для определения значений сигналов Clock, Reset и Clock Enable в конечных автоматах.
Следующий пример демонстрирует использование управляющих булевских выражений: ss.clk = clk1;
ss.reset = a & b;
ss.ena = clk1ena; Управляющие булевские выражения имеют следующие характеристики:
Значения сигналов Clock, Reset и Clock Enable для всякого конечного автомата могут быть определены с использованием следующего формата: <имя конечного автомата>.<имя порта>.В примере, показанном выше, значения этих входовопределены для конечного автомата с именем ss.
Имя конечного автомата, определенное на этапе его объявления, может быть использовано в управляющих булевских выражениях.
Тактирующему сигналу <имя конечного автомата>.clk должно быть присвоено значение.
Если в качестве начального значения конечного автомата выбрано ненулевое значение, то должен использоваться сигнал начальной установки <имя конечного автомата>.reset; в противном случае использование этого сигнала необязательно.
Использовать тактирующий сигнал <имя конечного автомата>.ena необязательно.
Каждое выражение заканчивается символом (;).
1.25.4.Оператор проверки списка (Case.) Оператор Case определяет список альтернативных вариантов, которые могут быть активизированы в зависимости от значения переменной, группы или выражения, следующего за ключевым словом CASE.
Следующий пример демонстрирует использование оператора Case: CASE f[].q IS
WHEN H"00" =>
addr[] = 0;
s = a & b;
WHEN H"01" =>
count[].d = count[].q + 1;
WHEN H"02", H"03", H"04" =>
f[3..0].d = addr[4..1];
WHEN OTHERS =>
f[].d = f[].q;
END CASE; Оператор Case имеет следующие характеристики:
Булевское выражение, группа или конечный автомат располагаются между ключевыми словами CASE и IS (в примере, показанном выше, это f[ ].q).
Оператор Case завершается ключевыми словами END CASE за которыми следует символ (;).
Телом оператора Case является список из одного или более неповторяющихся альтернативных вариантов, следующих за ключевым словом WHEN. Каждому альтернативному варианту предшествует ключевое слово WHEN.
Каждый альтернативный вариант представляет собой одно или более отделенных друг от друга запятыми значений констант, за которыми следует символ (=>).
Если значение булевского выражения, стоящего за ключевым словом CASE, соответствует какому - либо альтернативному варианту, то все операторы, следующие за соответствующим символом (=>) активизируются. В примере, приведенном выше, если f[ ].q равно h”01”, то активизируется булевское выражение count[ ].d = count[ ].q + 1.
Если значение булевского выражения, стоящего за ключевым словом CASE не равно ни одному из альтернативных вариантов, то активизируется альтернативный вариант, стоящий за ключевыми словами WHEN OTHERS. В примере, показанном выше, если значение f[ ].q не равно H”00”, H’01” или H”CF”, то активизируется выражение f[ ].d = f[].q.
Оператор Defaults определяет значение по умолчанию для тех случаев, когда ключевые слова WHEN OTHERS не используются.
Если оператор Case используется для определения переходов конечного автомата, то ключевые слова WHEN OTHERS не могут использоваться для выхода из недопустимых состояний. Если состояния конечного автомата определяются n -мерным кодом и при этом автомат имеет 2^n состояний, то использование ключевых слов WHEN OTHERS является допустимым.
Каждый альтернативный вариант должен заканчиваться символом (;).
1.25.5.Оператор проверки логического выражения (If Then.) Оператор If Then содержит список операторов, выполняемых в том случае, если булевское выражение, расположенное между ключевыми словами IF и THEN, принимает истинное значение .
Следующий пример демонстрирует использование оператора If Then: IF a[] == b[] THEN
c[8..1] = H "77";
addr[3..1] = f[3..1].q;
f[].d = addr[] + 1;
ELSIF g3 $ g4 THEN
f[].d = addr[];
ELSE
d = VCC;
END IF; Оператор If Then имеет следующие характеристики:
Между ключевыми словами IF и THEN располагается булевское выражение, в зависимости от значения которого выполняется или не выполняется список операторов, располагающийся за ключевым словом THEN. Каждый оператор в этом списке оканчивается символом (;).
Между ключевыми словами ELSEIF и THEN располагается дополнительное булевское выражение а за ключевым словом THEN также располагается список операторов, выполняемых в зависимости от значения булевского выражения. Эти необязательные ключевые слова и операторы могут повторяться многократно.
Оператор(ы), следующий за ключевым словом THEN, активизируется в том случае, если соответствующее ему булевское выражение принимает истинное значение. При этом последующие конструкции ELSEIF THEN игнорируются.
Ключевое слово ELSE, за которым следует один или более операторов, схоже по своему значению с ключевыми словами WHEN OTHERS в операторе Case. Если ни одно из булевских выражений не приняло истинное значение, то выполняются операторы, следующие за ключевым словом ELSE. В примере, показанном выше, если ни одно из булевских выражений не приняло истинного значения, то выполняется оператор d = VCC. Использование ключевого слова ELSE не является обязательным.
Значения булевских выражений, следующих за ключевыми словами IF и ELSEIF оцениваются последовательно.
Оператор If Then заканчивается ключевыми словами END IF за которыми следует символ (;).
Оператор If Then может генерировать логические схемы, которые слишком сложны для компилятора. Если оператор If Then содержит сложные булевские выражения, то учет инверсии каждого из этих выражений вероятно приведет к еще более сложным булевским выражениям. Например, если a и b сложные выражения, то инверсия этих выражений может быть еще более сложной. Оператор If: Интерпретация компилятором:
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;
В отличие от операторов If Then, которые могут оценивать лишь значения булевских выражений, операторы If Generate могут оценивать значения наборов арифметических выражений. Основное различие между операторами If Then и If Generate состоит в том, что в первом случае значение булевского выражения оценивается аппаратным способом (в кремнии), а во втором случае значение набора арифметических выражений оценивается на этапе компиляции.
1.25.6.Оператор проверки логического выражения (If Generate ) Оператор If Generate содержит список операторов, активизирующийся в случае положительного результата оценки арифметического выражения. Следующий пример демонстрирует использование оператора If Generate: IF DEVICE_FAMILY == "FLEX8K" GENERATE
c[] = 8kadder(a[], b[], cin);
ELSE GENERATE
c[] = otheradder(a[], b[], cin);
END GENERATE; Оператор If Generate имеет следующие характеристики:
Между ключевыми словами If Generate заключается арифметическое выражение, значение которого подвергается оценке. За ключевым словом GENERATE следует список операторов, каждый из которых заканчивается символом (;). Операторы активизируются в том случае, если арифметическое выражение принимает истинное значение.
За ключевыми словами ELSE GENERATE следует один или более операторов, которые активизируются в случае, если арифметическое выражение принимает ложное значение.
Оператор If Generate заканчивается ключевыми словами END GENERATE, за которыми следует символ (;).
Оператор If Generate может использоваться в разделе Logic и в разделе Variable.
В отличие от операторов If Then, которые могут оценивать лишь значения булевских выражений, операторы If Generate могут оценивать значения наборов арифметических выражений. Основное различие между операторами If Then и If Generate состоит в том, что в первом случае значение булевского выражения оценивается аппаратным способом (в кремнии), а во втором случае значение набора арифметических выражений оценивается на этапе компиляции.
Оператор If Generate особенно часто используется с операторами For Generate, что позволяет различным образом обрабатывать особые ситуации, например, младший значащий бит в многокаскадном умножителе. Этот оператор может также использоваться для тестирования значений параметров, как показано в последнем примере.
1.25.7.Оператор цикла (For Generate) Следующий пример показывает использование итерационного оператора For Generate: CONSTANT NUM_OF_ADDERS = 8; SUBDESIGN 4gentst
(
a[NUM_OF_ADDERS..1], b[NUM_OF_ADDERS..1],
cin : INPUT;
c[NUM_OF_ADDERS..1], cout : OUTPUT;
)
VARIABLE
carry_out[(NUM_OF_ADDERS+1)..1] : NODE;
BEGIN
carry_out[1] = cin;
FOR i IN 1 TO NUM_OF_ADDERS GENERATE
c[i] = a[i] $ b[i] $ carry_out[i]; % Полный сумматор %
carry_out[i+1] = a[i] & b[i] # carry_out[i] & (a[i] $ b[i]);
END GENERATE;
cout = carry_out[NUM_OF_ADDERS+1];
END; Оператор For Generate имеет следующие характеристики:
Между ключевыми словами FOR и GENERATE заключаются следующие параметры:
Временная переменная, представляющая собой символическое имя. Эта переменная используется лишь в пределах оператора For Generate и заканчивает свое существование после того, как компилятор обработает этот оператор. В примере, показанном выше такой переменной является переменная i. Это имя не может использоваться в качестве имени константы, параметра или узла в пределах данного проекта.
За ключевым словом IN следует диапазон, ограниченный двумя арифметическими выражениями. Арифметические выражения разделяются между собой ключевым словом TO. В примере, показанном выше арифметическими выражениями являются 1 и NUM_OF_ADDRESS. Границы диапазона могут содержать выражения, состоящие только из констант и параметров; использование переменных при этом недопустимо.
За ключевым словом GENERATE следует один или более логических операторов, каждый из которых заканчивается символом (;).
Оператор If Generate заканчивается ключевыми словами END GENERATE, за которыми следует символ (;).
1.25.8.Использование ссылок на прототипы функций (In-Line Logic Function Reference) Подставляемая ссылка для реализации логической функции представляет собой булевское выражение. Это быстрый способ для реализации логической функции, требующий лишь одну строку в разделе Logic и не требующий объявления переменной.
При необходимости реализации объекта мегафункции или макрофункции нужно убедиться, что логика ее функционирования описана в соответствующем файле проекта. Затем с помощью оператора Function Prototype декларируется прототип функции и далее реализуется объект функции посредством подставляемой ссылки или путем объявления объекта.
Для реализации объекта примитива также используется подставляемая ссылка или производится описание в разделе объявления объектов. Однако в отличие от мега - и макрофункций логика функционирования примитивов предопределена, то есть нет необходимости определять логику функционирования примитива в отдельном файле проекта. В большинстве случаев нет необходимости использовать оператор Function Prototype для определения прототипа функции.
Следующие примеры демонстрируют прототипы функций compare и lpm_add _sub. Функция compare имеет входные порты a[3..0] и b[3..0], а также выходные порты less, equal, greater; функция lpm_add_sub имеет входные порты dataa[LPM_WIDTH-1..0], cin и add_sub, а также выходные порты result[LPM_WIDTH-1..0], cout и overflow. FUNCTION compare (a[3..0], b[3..0])
RETURNS (less, equal, greater); FUNCTION lpm_add_sub (cin, dataa[LPM_WIDTH-1..0], datab[LPM_WIDTH-1..0], add_sub)
WITH (LPM_WIDTH, LPM_REPRESENTATION)
RETURNS (result[LPM_WIDTH-1..0], cout, overflow); Подставляемые ссылки (in-line logic function references) для функций compare и lpm_add_sub указываются в правой части показанного ниже выражения: (clockwise, , counterclockwise) = compare(position[], target[]);
sum[] = lpm_add_sub (.datab[] = b[], .dataa[] = a[])
WITH (LPM_WIDTH = 8)
RETURNS (.result[]); Подставляемая ссылка для логической функции имеет следующие характеристики:
За именем функции справа от символа равенства (=) следует заключенный в круглые скобки список сигналов, содержащий символические имена, десятичные числа или группы разделенные между собой запятыми. Все эти компоненты описывают входные порты функции.
В списке сигналов имена портов могут иметь позиционное соответствие, либо соответствие по имени:
В примере, показанном выше и демонстрирующем использование функции compare, имена переменных position[] и target[] имеют позиционное соответствие портам a[3..0] и b[3..0]. При использовании позиционного соответствия можно применять запятые для резервирования места под выходы, не подсоединяемые к конкретным переменным. В функции compare выход equal не подключается к переменным, поэтому необходимо использовать запятую для резервирования его места в правой части выражения.
В примере, показанном выше и демонстрирующем использование функции lpm_add_sub, входы .datab[] и .dataa[] соединяются соответственно с переменными b[] и a[] путем установления соответствия по имени. Соответствие между переменными и портами устанавливается посредством использования символа (=).
Имена портов должны иметь следующий формат .<имя порта> как в правой, так и в левой части подставляемой ссылки, использующей способ установления соответствия портов переменным по имени.
Установление соответствия портов переменным по имени возможно лишь в правой части подставляемой ссылки. В левой части подставляемой ссылки всегда используется позиционное соответствие.
В параметризируемой функции, за ключевым словом WITH и списком имен параметров следует список входных портов. Этот список заключается в круглые скобки, а имена параметров разделяются запятыми. Декларируются лишь те параметры, которые используются объектом; значения параметров отделяются от имен параметров посредством символа равенства. В примере, показанном выше и демонстрирующим использование функции lpm_add_sub, параметру LPM_WIDTH присвоено значение 8. Если какому-либо параметру не присвоено никакого значения, то компилятор осуществляет поиск значений для этих параметров в том порядке, который описан в разделе “Оператор Parameters”.
В левой части подставляемой ссылки выходы функции ставятся в соответствие переменным. В примере, показанном выше и демонстрирующем использование функции compare выходы less и greater поставлены в соответствие переменным clockwise и counterclockwise с использованием позиционного соответствия. Подобным же образом в примере для функции lpm_add_sub выходы result[] поставлены в соответствие группе sum[] с использованием позиционного соответствия.
Значения переменных, которые определены где-либо в разделе Logic, являются значениями связанными с соответствующими им входами и выходами. В примере, показанном выше для функции compare, значения position[] и target[] являются значениями, подаваемыми на соответствующие входы функции compare. Значения выходных портов less и greater связаны с clockwise и counterwise, соответственно. Эти переменные могут быть использованы в других выражениях раздела Logic.
1.25.9.Определение таблицы истинности (Truth Table) Оператор Truth Table используется для определения комбинационной логики или для определения поведения автоматов. В таблицах истинности, используемых в AHDL каждая строка таблицы состоит из комбинации входных значений и соответствующих этой комбинации выходных значений. Эти выходные значения могут использоваться как обратные связи для определения переходов автоматов из одного состояния в другое, а также его выходов. Следующий пример демонстрирует использование оператора Truth Table: TABLE
a0, f[4..1].q => f[4..1].d, control; 0, B"0000" => B"0001", 1;
0, B"0100" => B"0010", 0;
1, B"0XXX" => B"0100", 0;
X, B"1111" => B"0101", 1;
END TABLE; Оператор Truth Table имеет следующие характеристики:
Заголовок таблицы истинности состоит из ключевого слова TABLE, за которым следует разделенный запятыми список входов, символ (=>) и разделенный запятыми список выходов таблицы. Заголовок таблицы истинности заканчивается символом (;).
Входы таблицы истинности являются булевскими выражениями; выходы являются переменными. В примере, показанном выше, входными сигналами являются a0 и f[4..1].q; выходными сигналами являются f[4..1] и control.
Тело таблицы истинности состоит из одного или более компонентов, каждый из которых представляет одну или более строку и заканчивается символом (;).
Каждый компонент состоит из разделенного запятыми списка входов и разделенного запятыми списка выходов. Входы и выходы разделены символом (=>).
Каждый сигнал имеет однозначное соответствие с значениями в каждом компоненте тела таблицы истинности. Таким образом, первый компонент в примере, показанном выше, определяет, что когда a0 имеет значение 0, а f[4..1].q имеет значение B”0000”, то f[4..1].d примет значение B”0001”, а сигнал control примет значение 1.
Входные и выходные значения могут быть числами, предопределенными константами VCC и GND, символическими константами (т.е. символическими именами, используемыми как константы) или группами чисел или констант. Входные значения могут также иметь значение X (безразличное состояние).
Входные и выходные значения соответствуют входам и выходам, названия которых указаны в заголовке таблицы.
Описание таблицы истинности заканчивается ключевыми словами END TABLE, за которыми следует символ (;). В отношении описания таблицы истинности необходимо соблюдать следующие правила:
Имена, используемые в заголовке таблицы истинности должны представлять собой либо одиночные узлы, либо группы.
Нет необходимости оговаривать в таблице истинности все возможные комбинации входных сигналов. Можно использовать символ “X” для определения того, что выходное значение не зависит от входного. Следующий пример определяет, что, если a0 имеет высокий уровень и f4 имеет низкий уровень, то логические уровни остальных входов не имеют значения. Таким образом, можно указать лишь общую часть нескольких комбинаций входных сигналов, а для всех остальных использовать символ “X”:
TABLE
a0, f[4..1].q => f[4..1].d, control; 0, B"0000" => B"0001", 1;
0, B"0100" => B"0010", 0;
1, B"0XXX" => B"0100", 0;
X, B"1111" => B"0101", 1;
END TABLE;
Количество разделенных запятыми элементов таблицы истинности должно в точности соответствовать количеству элементов в заголовке таблицы истинности. В противном случае в отношении выходных сигналов используются значения по умолчанию.
При использовании символа “X” для определения нескольких комбинаций значений входных сигналов необходимо внимательно следить за тем, чтобы определяемое таким образом подмножество комбинаций не перекрывалось ни с каким другим подмножеством в пределах данной таблицы истинности. В противном случае возможны непредсказуемые результаты.
|