Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Объявления псевдоимен конечных автоматов (Machine Alias Declaration)Содержание книги
Поиск на нашем сайте
Используя процедуру объявления псевдоимени конечного автомата в разделе описания переменных, можно описать псевдоимя для данного, описанного или импортированного из другого файла конечного автомата. После указанной процедуры можно пользоваться псевдоименем конечного автомата наравне с его исходным. Например:
FUNCTION ss_def (clock, reset, count) RETURNS (MACHINE ss_out); VARIABLE ss: MACHINE; BEGIN ss = ss_def (sys_clk, reset,!hold); IF ss == s0 THEN ELSIF ss == s1 THEN END;
Процедура объявления псевдоимени конечного автомата имеет следующие характеристики:
¨ Псевдоним представляет собой символическое имя. За псевдонимом следует символ двоеточия и далее ключевое слово MACHINE. В примере, показанном выше, символическое имя ss является псевдонимом конечного автомата. ¨ Предусмотрена возможность импортирования и экспортирования конечных автоматов между текстовыми файлами проектов, а также другими файлами проектов путем определения входных и выходных портов с использованием ключевых слов MACHINE INPUT или MACHINE OUTPUT в разделе Subdesign. ¨ При импортировании и экспортировании конечных автоматов прототип функции, представляющий файл описания конечного автомата должен определять какие входы и выходы являются конечными автоматами. В примере, показанном выше, ss_out является именем конечного автомата. ¨ Декларация псевдонима конечного автомата заканчивается символом (;).
ÞПорты типов MACHINE INPUT и MACHINE OUTPUT не могут использоваться в файлах проектов верхнего уровня. 3.12. Раздел тела проекта (Logic) Раздел Logic определяет логическое функционирование текстового файла проекта (TDF) и является собственно его телом. Раздел Logic заключается в ключевые слова BEGIN и END. За ключевым словом END следует символ (;), заканчивающий раздел. Если используется оператор Defaults, то он должен предшествовать всем другим операторам в этом разделе. AHDL является параллельным языком. Компилятор анализирует поведенческую модель, описанную в разделе Logic, параллельно. Выражения, осуществляющие множественные присваивания объекту, имеющему тип NODE или переменной, объединяются в соответствии с функцией монтажное ИЛИ. В разделе Logic могут быть многократно использованы следующие операторы и разделы: ¨ Булевские выражения. ¨ Управляющие булевские выражения. ¨ Оператор Case. ¨ Оператор Defaults. ¨ Оператор If Then. ¨ Оператор If Generate ¨ Оператор If Generate ¨ Оператор таблицы истинности ÞРаздел Logic может также содержать оператор Assert. Задание исходных значений (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; 3.12.2. Булевские выражения (Boolean Equations) Булевские выражения используются в разделе 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”. ¨ Каждое выражение заканчивается символом (;).
|
||||
Последнее изменение этой страницы: 2017-02-05; просмотров: 134; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.118.194 (0.01 с.) |