Язык AHDL


Булевские выражения


Булевские выражения используются в разделе Logic текстового файла  проекта на языке AHDL для представления соединений  узлов, входных и выходных потоков сигналов через входные и выходные выводы, примитивы, макро-  и мегафункции  и конечные автоматы.

Следующий пример демонстрирует сложное булевское выражение:

a[] = ((c[] & -B"001101") + e[6..1]) # (p, q, r, s, t, v);

Левая часть выражения может быть символическим именем, именем порта или именем группы. Для инвертирования выражения в левой части выражения можно пользоваться  операцией NOT (!). Правая часть равенства представлена булевским выражением, вычисляемым в порядке, описанном в разделе “Приоритеты булевских операторов и операций отношения”.

Символ эквивалентности (=) используется в булевских выражениях для индикации того, что результат булевского выражения, представленного в правой части, является источником сигнала для символического объекта или группы в левой части. Символ (=) отличается от символа (==), используемого как компаратор.

В примере, показанном выше, булевское выражение в правой части равенства вычисляется в соответствии со следующими правилами:

1.   Двоичное число B”001101” меняет знак и принимает вид B”110011”. Унарная операция (-) имеет наивысший приоритет.

2.   B”110011” объединяется по И с группой c[]. Эта операция имеет второй уровень приоритета, потому что она заключена в круглые скобки.

3.   Результат групповой операции, проведенной на втором шаге, прибавляется к группе e[6..1].

4.   Результат, полученный на третьем шаге, объединяется по ИЛИ с группой (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”.

¨    Каждое выражение заканчивается символом (;).


Содержание раздела