Необходимо отметить, что пп. 3 и 4 определяют различие в результатах операций с логической константой vcc и числовой константой 1.
Примеры:
(a, b,c) & vcc; -- дает результат (a, b,c)
(a, b,c) & 1; -- дает результат (gnd, gnd, c).
2.9.2. Арифметические операции в логических выражениях
Кроме арифметических операций, перечисленных в табл. 2.3, язык AHDL допускает применение в логических выражениях операции унарный "+". Эта операция не оказывает никакого воздействия на операнд и применяется для повышения наглядности описания.
Бинарные арифметические операции в логических выражениях предназначены для умножения, сложения и вычитания многоразрядных двоичных данных, представленных группами узлов и числовыми константами.
Унарная операция смены знака "-" выполняется над любым операндом, включая группы узлов, как над двоичным числом. Операция реализуется путем перевода операнда в дополнительный код. Иными словами, над операндом выполняется операция дополнения до двух, т. е. все биты его инвертируются и к результату прибавляется единица.
Пример:
a[3..0] = - b"0001";
В приведенном примере все линии шины a[3..0] будут подключены к vcc, поскольку перевод b"0001" в дополнительный код дает значение b"1111".
Бинарные арифметические операции выполняются в соответствии со следующими правилами.
1. Операнды могут быть группами или числовыми константами, но не одиночными узлами.
2. Если оба операнда являются группами, то они могут быть только одинакового размера.
3. Если оба операнда являются числами, то более короткое из них расширяется с учетом знака до размеров другого операнда.
4. Если один операнд является группой узлов, а второй числом, то число либо усекается, либо расширяется с учетом знака до размеров группы.
5. При выполнении операций сложения и вычитания операнды могут быть числами без знака или со знаком. При выполнении умножения операнды рассматриваются как числа без знака.
При использовании арифметических операций в логических выражениях следует учитывать следующие особенности.
1. Для осуществления многоразрядного сложения с помощью арифметической операции "+" целесообразно размер левого операнда логического уравнения выбирать на один разряд больше, чем слагаемые, а у слагаемых предусматривать содержащий 0 дополнительный старший бит. Этот бит будет использован для размещения переноса из основного старшего разряда слагаемых в случае его возникновения.
Пример:
a[3..0]=(0,c[2..0])+(0,d[2..0]);
Размерности всех групп данного примера одинаковы.
2. При реализации умножения групп с помощью арифметической операции "*" для получения адекватного результата следует устанавливать размерность группы левого операнда уравнения равной сумме размерностей сомножителей, а группы сомножителей снабжать дополнительным старшим разрядом, содержащим числовую константу 0.
Пример:
res[7..0]=(0,s[3..0])*(0,q[3..0]);
В приведенном примере группы сомножителей за счет применения числовой константы 0 будут расширены слева нулями до размера левого операнда. В результате к переменной res[7..0] будут подключены все 8 возможных разрядов произведения в соответствующей последовательности.
Если не принять предлагаемых мер и записать уравнение в виде:
res[7..0]=s[3..0]*q[3..0];,
то 4 младших разряда произведения будут подключены к младшей половине разрядов левого операнда res[3..0] и эта же самая часть произведения будет подключена к старшей половине его разрядов res[7..4], как это происходит, когда число элементов левой части уравнения не равно, а кратно числу элементов правой части.
3. Применение операции арифметического умножения "*" в логических выражениях не поддерживается ранними версиями САПР фирмы Altera, например пакетом MAX+PLUS II.
2.9.3. Операции сравнения в логических выражениях
В логических выражениях могут быть применены шесть операций сравнения (приоритеты операций приведены в табл. 2.3). Все операции сравнения дают одноразрядный результат: vcc, соответствующий значению "истина", или gnd, соответствующий значению "ложь".
Операции "равно" и "не равно" в языке AHDL носят название логических операций сравнения и могут применяться как для одиночных узлов, так и для групп и числовых констант без неопределенных разрядов ("x"). Остальные операции считаются арифметическими и могут применяться только для сравнения групп узлов и числовых констант. Компилятор интерпретирует группу узлов при сравнении как беззнаковое двоичное число.
При использовании операций сравнения оба операнда в выражении должны быть одинакового размера.
Необходимо отметить, что поскольку результатом операций сравнения являются одиночные логические константы vcc и gnd, то если левым операндом уравнения является группа, то всем ее узлам присваивается значение полученной константы.
2.10. Арифметические выражения
Арифметические выражения в языке AHDL предназначены для решения нефункциональных задач. Они могут быть использованы для иллюстрации процесса получения числовых значений констант в операторах "constant" и "parameters", а также значений границ диапазонов в группах.
Примеры:
constant max_addr=2^8-1; --вычисление адреса
subdesign example10
(
in[w-1..0] :input;
outa[(w div 2)-1..0] :output;
outb[w-1..w div 2] :output;
. . .
В арифметических выражениях могут быть использованы операции, приведенные в табл. 2.4.
Таблица 2.4
Операции, применяемые в арифметических выражениях
ОПЕРАЦИЯ | ПРИМЕР | НАЗВАНИЕ | ПРИОРИТЕТ |
+ УНАРНЫЙ | +1 | ПРИЗНАК ПОЛОЖИТЕЛЬНОГО ЧИСЛА | 1 |
- УНАРНЫЙ | -1 | СМЕНА ЗНАКА | 1 |
! | !a | ОТРИЦАНИЕ | 1 |
^ | a ^ 2 | ВОЗВЕДЕНИЕ В ВСТЕПЕНЬ | 1 |
MOD | 4 mod 2 | ЦЕЛЫЙ ОСТАТОК ОТ ДЕЛЕНИЯ | 2 |
DIV | 4 div 2 | ЦЕЛОЧИСЛЕННОЕ ДЕЛЕНИЕ | 2 |
* | a * 2 | УМНОЖЕНИЕ | 2 |
LOG2 | log2(4-3) | ЛОГАРИФМ ПО ОСНОВАНИЮ 2 | 2 |
+ | 1+1 | СЛОЖЕНИЕ | 3 |
- | 1-1 | ВЫЧИТАНИЕ | 3 |
== (ЧИСЛА) | 5 == 5 | РАВНО (СРАВНЕНИЕ) | 4 |
== (СТРОКИ) | "a" == "b" | РАВНО | 4 |
!= | 5 != 4 | НЕ РАВНО | 4 |
> | 5 > 4 | БОЛЬШЕ | 4 |
>= | 5 >= 5 | БОЛЬШЕ ИЛИ РАВНО | 4 |
< | a < b+2 | МЕНЬШЕ | 4 |
<= | a <= b+2 | МЕНЬШЕ ИЛИ РАВНО | 4 |
& | a & b | И | 5 |
!& | 1 !& 0 | И – НЕ | 5 |
$ | 1 $ 1 | ИСКЛЮЧАЮЩЕЕ ИЛИ | 6 |
!$ | 1 !$ 1 | ИСКЛЮЧАЮЩЕЕ ИЛИ – НЕ | 6 |
# | a # b | ИЛИ | 7 |
!# | a!# b | ИЛИ – НЕ | 7 |
? : | (5<4) ? 3 : 4 | УСЛОВНАЯ ОПЕРАЦИЯ | 8 |
В качестве операндов арифметических выражений могут быть использованы числовые и именованные константы и параметры, а также строковые константы. Результатом арифметического выражения должно быть целое неотрицательное число или строка.
Если результат операции "log2" не целый, то он автоматически округляется до следующего целого. Например, log2(257)даст результат 9.
Кроме арифметических операций в арифметических выражениях могут быть использованы вычисляемые функции. В языке AHDL предопределены три вычисляемые функции:
· used, может быть использована в операторах if generate и parameters и позволяет установить, используется данный порт или нет; получает имя порта в качестве параметра и возвращает значение false в случае, если порт не используется;
· ceil, возвращает наименьшее целое число, которое больше действительного аргумента функции (округление в большую сторону); имеет смысл только для результатов операций div и log2, которые могут содержать дробную часть;
· floor, возвращает наибольшее целое число, которое меньше действительного аргумента, также имеет смысл только для результатов операций div и log2.
Пример:
выражение ceil(10 div 3) даст результат 4,
а выражение 10 div 3 даст результат 3.
Кроме предопределенных арифметических функций можно использовать собственные вычисляемые функции. Они могут быть определены в предварительном разделе с помощью оператора define, в котором за ключевым словом оператора следуют имя функции и передаваемые ей аргументы в круглых скобках, а затем знак присваивания и арифметическое выражение из аргументов, реализующее функцию.
Пример:
define max(a, b)=((a>b)? a : b);
В приведенном примере определена вычисляемая функция max(), которая возвращает большее из двух чисел, переданных ей в качестве аргументов. Функция реализована с помощью условной (тернарной) операции (см. последнюю строку табл. 2.4), которая функционирует следующим образом. Если значением выражения, стоящего слева от вопросительного знака, является "истина", то результатом всей операции будет выражение, стоящее сразу за вопросительным знаком, в данном примере это a. В противном случае результатом операции будет выражение, стоящее после двоеточия, в данном примере это b.
2.11. Логические операторы
Логические операторы, наряду с логическими уравнениями, позволяют описать структуру и поведение разрабатываемого цифрового устройства. В языке AHDL существуют следующие логические операторы:
· if then (условный оператор);
· case (оператор варианта);
· for generate (оператор цикла);
· truth table (таблица истинности).
2.11.1. Условный оператор if then
Условный оператор if then реализует одно или несколько логических уравнений, следующих за ключевым словом then, в случае, если используемое в качестве условия логическое выражение, следующее за ключевым словом if, дает результат vcc. В противном случае уравнения не выполняются. Заканчивается оператор ключевыми словами end if.
После одного набора (варианта) логических уравнений, активизируемого при выполнении установленного условия, может следовать еще один вариант уравнений, который активизируется при выполнении другого условия. Второе условие следует за ключевым словом elsif, а второй вариант уравнений – далее за вторым ключевым словом then. Второе условие анализируется только в случае, если первое условие не выполняется. Вариантов elsif может быть несколько. Они анализируются компилятором в том порядке, в котором следуют в операторе, до тех пор, пока не будет обнаружено выполняемое условие. Соответствующие этому условию логические уравнения активизируются, а следующие далее варианты не рассматриваются.
Перед завершением оператора может быть применен последний вариант логических уравнений, который активизируется в случае, если ни одно из условий не было выполнено. Этот вариант не содержит собственного условия. Его логические уравнения располагаются между ключевым словом else и завершающими весь оператор словами end if.
Пример:
if a[]==b[] then
c[7..0]=h"f0";
addr[3..0]=reg[3..0].q;
reg[3..0].d=in[3..0];
elsif a[3] then
reg[3..0].d=in[7..4];
else
reg[3..0].d=vcc;
end if;
В приведенном примере, если двоичное представление элементов группы a[] равно двоичному представлению группы b[], то реализуются три логических уравнения, расположенных между первым ключевым словом then и словом elsif. Остальные уравнения не принимаются во внимание. Если группы a[] и b[] не равны, но элемент a[3] первой группы равен vcc, то выполняется логическое уравнение, располагающееся между вторым ключевым словом then и словом else. И, наконец, если не выполняются ни первое, ни второе условия, то реализуется уравнение, предшествующее ключевым словам end if.
Количество логических уравнений в отдельном варианте может быть любым. Каждое уравнение заканчивается точкой с запятой.
Вариантов, начинающихся словами elsif, может быть несколько, но может и не быть вовсе. Вариант, начинающийся ключевым словом else, должен быть один, но может и отсутствовать.
2.11.2. Оператор варианта case
Оператор варианта case описывает несколько наборов логических уравнений, один из которых реализуется компилятором в случае, если контролируемое логическое выражение принимает определенное, поставленное в соответствие этому набору значение. Контролируемое выражение может давать как одноразрядный, так и многоразрядный результат.
Контролируемое выражение размещается между ключевыми словами case и is, начинающими оператор. Каждый вариант начинается с ключевого слова when, сопровождаемого константой, с которой сравнивается результат контролируемого выражения для данного варианта. За константой располагается знак "=>", а после него – набор логических уравнений данного варианта. Количество уравнений в варианте не ограничивается. Каждое уравнение заканчивается точкой с запятой. Далее следует ключевое слово when, начинающее описание следующего варианта.
Количество вариантов не ограничивается. Если какой-либо вариант уравнений должен выполняться для нескольких значений, то все эти значения (константы) располагаются между ключевым словом when и знаком "=>" и разделяются запятыми.
Для случая, при котором контролируемое выражение оказывается не равным ни одной из констант, может быть предусмотрен необязательный вариант, обозначаемый ключевыми словами when others и знаком "=>". За ними следует предписанный этому случаю набор логических уравнений.
Завершают оператор ключевые слова end case, сопровождаемые точкой с запятой.
Пример:
case ina[] is
when h"00" =>
addr[]=b"000";
s=a & b;
when h"01" =>
addr[]=b"010";
when h"02", h"03", h"04" =>
addr[]=b"101";
when others =>
addr[]=b"111";
s=gnd;
end case;
В качестве контролируемого выражения могут быть применены логическое выражение, узел (порт), группа или конечный автомат. В приведенном примере это группа ina[].
Если в операторе case отсутствует вариант when others, то в случае несовпадения контролируемого выражения ни с одной из констант поведение устройства определяется оператором defaults (см. раздел 2.11.4).
2.11.3. Оператор truth table
Оператор truth table (таблица истинности) предназначен для описания поведения комбинационных устройств и конечных автоматов. Начинается оператор ключевым словом table. На следующей строке располагается заголовок таблицы, состоящий из списка входных переменных, разделяемых запятыми, символа "=>", отделяющего входные переменные от выходных, списка выходных переменных, разделяемых запятыми, и завершающего знака "точка с запятой".
На следующих строках располагаются рабочие наборы значений входных переменных и соответствующих им значений выходных переменных (по одному варианту в строке). В каждой строке должно быть установленное в заголовке таблицы количество значений входных переменных и следующих за знаком "=>" значений выходных переменных. Значения должны следовать в том же порядке, что и в заголовке, и так же разделяться запятыми. Каждая строка заканчивается точкой с запятой.
Завершается оператор ключевыми словами end table и точкой с запятой.
Пример:
table
ina, regi[3..0].q => rego[3..0].d, ctrl;
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;
В приведенном примере оператор table описывает комбинационную логику, определяющую значения входов d регистра rego[3..0] и узла ctrl, в зависимости от значений, принимаемых узлом ina и выходами q регистра regi[3..0]. В данном примере суммарное количество независимых разрядов входных переменных (пять) дает 64 возможные комбинации входных сигналов. Описывать явным образом в виде отдельных строк все возможные комбинации нерационально (если, конечно, в этом нет специальной необходимости). Если для работы устройства существенны только несколько наборов значений входных переменных, то целесообразно описать в операторе только эти наборы (варианты). При этом логические уровни битов, не влияющих на состояние выходов, следует обозначать с помощью двоичного значения "x" (см. последние две строки таблицы истинности примера). При использовании символов "x" в значениях входных переменных следует быть уверенным, что это не приведет к наложению (совпадению) комбинаций из разных строк таблицы. Такое наложение не фиксируется компилятором в качестве ошибки и может привести к непредсказуемым результатам.
Входы в заголовке оператора table (слева от символа "=>") могут быть логическими выражениями, выходы – переменными. И те, и другие могут быть единичными узлами или группами. Значения входов и выходов в строках вариантов могут быть числовыми литеральными и именованными константами, логическими константами vcc или gnd или их группами. Входные константы могут содержать битовые значения "x".
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 |


