
- •Предисловие
- •1. Структура проекта на ahdl
- •Оператор options
- •Оператор assert
- •Раздел variable используется для описания и/или генерации переменных, используемых в разделе Logic.
- •Раздел Variable может также содержать операторы If Generate, которые могут быть использованы для генерирования объектов, узлов, регистров, конечных автоматов, и псевдоимен конечных автоматов.
- •2. Элементы языка ahdl
- •2.1. Зарезервированные слова и идентификаторы
- •2.2. Символы
- •2.3. Строковые и символьные имена
- •2.4. Числа
- •2.5. Арифметические и логические выражения
- •2.6. Встроенные оценочные функции
- •2.7. Шины (группы), диапазоны и поддиапазоны шин
- •3. Примитивы и мегафункции
- •3.1. Обращение к примитивам и мегафункциям
- •1. Непосредственное обращение
- •2. Использование элемента как переменной
- •3.2. Примитивы
- •Примитивы триггеров
- •3.3. Библиотека параметризуемых функций (lpm)
- •1. Пример использования lpm_and, _or, _xor, _inv функций
- •2. Пример использования функции lpm_decode
- •3. Пример использования функций lpm_mux, busmux, mux
- •Пример использования функций lpm_counter, _latch, _ff,
- •5. Пример использования функций lpm_add_sub, _compare, _mult
- •6. Пример использования функции lpm_ram_dq
- •4. Описание логических схем
- •4.1. Операторы Оператор if then
- •Оператор case
- •Оператор defaults
- •Оператор if generate
- •Оператор for generate
- •Оператор truth table
- •4.2. Конечные автоматы
- •5. Основы проектирования плис с
- •Текстовой редактор
- •Литература
- •Прототипы примитивов буферов
- •Приложение 2 Прототипы примитивов триггеров
- •Приложение 3 Прототипы мегафункций
- •Содержание
- •Основы языка описания аппаратуры
- •Методические указания
- •630092, Г. Новосибирск, пр. К. Маркса, 20
Оператор 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.
-
Каждый альтернативный вариант должен заканчиваться символом (;).
Оператор defaults
позволяет определять значения по умолчанию, применяемые в таблицах истинности, а также в операторах If Then и Case. Поскольку активно-высокие сигналы автоматически имеют значения по умолчанию GND, то оператор Default необходим лишь в случае использования активно-низких сигналов.
Необходимо отличать значения по умолчанию, присваиваемые переменным, от значений по умолчанию, присваиваемых портам в разделе Subdesign.
Пример:
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.
Пример:
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.
Пример:
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;