Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AHDL.doc
Скачиваний:
33
Добавлен:
08.11.2018
Размер:
869.89 Кб
Скачать

Оператор 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 имеет следующие характеристики.

  1. Булевское выражение, группа или конечный автомат располагаются между ключевыми словами CASE и IS (в примере, показанном выше, это f[ ].q).

  2. Оператор Case завершается ключевыми словами END CASE за которыми следует символ (;).

  3. Телом оператора Case является список из одного или более неповторяющихся альтернативных вариантов, следующих за ключевым словом WHEN. Каждому альтернативному варианту предшествует ключевое слово WHEN.

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

  5. Если значение булевского выражения, стоящего за ключевым словом CASE, соответствует какому-либо альтернативному варианту, то все операторы, следующие за соответствующим символом (=>), активизируются. В примере, приведенном выше, если f[ ].q равно h”01”, то активизируется булевское выражение count[ ].d = count[ ].q + 1.

  6. Если значение булевского выражения, стоящего за ключевым словом CASE не равно ни одному из альтернативных вариантов, то активизируется альтернативный вариант, стоящий за ключевыми словами WHEN OTHERS. В примере, показанном выше, если значение f[ ].q не равно H”00”, H’01” или H”CF”, то активизируется выражение f[ ].d = f[].q.

  7. Оператор Defaults определяет значение по умолчанию для тех случаев, когда ключевые слова WHEN OTHERS не используются.

  8. Если оператор Case используется для определения переходов конечного автомата, то ключевые слова WHEN OTHERS не могут использоваться для выхода из недопустимых состояний. Если состояния конечного автомата определяются n -мерным кодом и при этом автомат имеет 2^n состояний, то допустимо использование ключевых слов WHEN OTHERS.

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

Оператор defaults

позволяет определять значения по умолчанию, применяемые в таблицах истинности, а также в операторах If Then и Case. Поскольку активно-высокие сигналы автоматически имеют значения по умолчанию GND, то оператор Default необходим лишь в случае использования активно-низких сигналов.

Необходимо отличать значения по умолчанию, присваиваемые переменным, от значений по умолчанию, присваиваемых портам в разделе Subdesign.

Пример:

BEGIN

DEFAULTS

a = VCC;

END DEFAULTS;

IF y & z THEN

a = GND; % a активный низкий %

END IF;

END;

Оператор Defaults имеет следующие характеристики.

  1. Значения по умолчанию заключаются в ключевые слова DEFAULTS и END DEFAULTS. Оператор заканчивается символом (;).

  2. Тело оператора Defaults состоит из одного или более логических выражений, присваиваемых константам или переменным. В примере, показанном выше, значение по умолчанию VCC присваивается переменной a.

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

  4. Оператор Default активизируется в том случае, когда какая-либо переменная, включенная в список оператора Default в каком-либо из операторов, оказывается неопределенной. В примере, показанном выше, переменная a оказывается неопределенной, если y и z имеют значения логического нуля; таким образом активизируется выражение (a = VCC) в операторе Default.

При использовании оператора Default необходимо соблюдать следующие правила:

  1. В разделе Logic допускается использовать не более одного оператора Default, кроме того, он должен располагаться сразу за ключевым словом BEGIN.

  2. Если в операторе Default в отношении одной и той же переменной производятся многократные присваивания, то все присваивания, за исключением последнего, игнорируются.

  3. Оператор Default не может использоваться для присваивания значения X (безразлично) переменным.

  4. Многократные присваивания значений узлу, имеющему тип 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);

  1. Переменные, имеющие активно низкий уровень и участвующие в многократных присваиваниях, должны иметь значение по умолчанию 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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]