Будь умным!


У вас вопросы?
У нас ответы:) SamZan.ru

Оператори GENERTE та параметри 2

Работа добавлена на сайт samzan.ru: 2016-03-13

1. Оператори  GENERATE та параметри

2. Примітиви

3. Послідовна логіка

4. Використання макрофункцій системи Altera

1. Оператори  GENERATE та параметри

Оператор FOR GENERATE (оператор циклу) дозволяє спростити запис послідовності подібних логічних рівнянь і операторів, мови AHDL.

Оператор циклу має вигляд:

FOR __index_variable IN __range GENERATE

__statement;

__statement;

END GENERATE;.

Оператор задається в такий спосіб:

За ключовим словом FOR вказується символічне ім'я внутрішньої змінної оператора. Це ім'я не може збігатися з ім'ям констант, параметрів або змінних, використовуваних у текстовому описі.

Ключові слова IN   ...   ТО   ... визначають границі зміни значень внутрішньої змінної оператора.

Границі задаються арифметичними виразами.

За ключовим словом GENERATE слідують логічні рівняння й оператори мови AHDL.

Оператор кінчається ключовими словами END GENERATE, за яким слідує крапка з комою (;).

Проілюструємо використання оператора FOR GENERATE для опису на вентильному рівні N-розрядного суматора, що має вхід і вихід переносу.

CONSTANT NUM_OF_ADDERS=8;

SUBDESIGN FOR_GEN

(

a[NUM_OF_ADDERS..1], b[NUM_OF_ADDERS..1], cin : INPUT;

c[NUM_OF_ADDERS..1], cout      : OUTPUT;

)

VARIABLE

carry_out [(NUM_OF_ADDERS+1)..1]   : NODE;

BEGIN

carry_out[1]=cin;

 FOR i IN 1 TO NUM_OF_ADDERS GENERATE

  c[i]=(a[i] $ b[i]) $ carry_out[i];

  carry_out[i+1] = a[i] & b[i] # carry_out[i] & (a[i] $ b[i]);

 END GENERATE;

cout = carry_out[NUM_OF_ADDERS+1];   

END;

Відмітимо, що для зміни розрядності суматора досить у текстовому описі змінити значення константи NUM_OF_ADDERS.

Параметри

Мова AHDL дозволяє створити параметризований опис модуля - опис, що адаптується до конкретних умов застосування модуля, тобто до конкретних значень параметра.

Значення параметра, на відміну від значення константи, може бути задане поза тим текстовим описом, у якому цей параметр визначений і використовується.

Нижче наведено поведінковий (алгоритмічний) опис суматора, розрядність якого визначається параметром ADD_WIDTH.

PARAMETERS (ADD_WIDTH = 8);

SUBDESIGN Parameter_

(

A[ADD_WIDTH..1], B[ADD_WIDTH..1]  : INPUT;

SUM[ADD_WIDTH..1], Cout    : OUTPUT;

)

BEGIN

(Cout, SUM[ADD_WIDTH..1]) = (GND,A[ADD_WIDTH..1]) + (GND,B[ADD_WIDTH..1]);

END;

Описаний суматор забезпечує додавання двох ADD_ WIDTH-розрядних операндів і формування АDD_WIDТН-разрядного результату (SUM[]) і переносу в наступний розряд.

При оголошенні параметру ADD_WIDTH присвоюється вихідне значення - вісім. Тому, якщо поза даним текстовим описом йому не буде задане інше значення, то компілятор синтезує восьмирозрядний суматор.

У мові AHDL визначений параметр Device_Family, значення якого - назва сімейства НВІС, обраного для реалізації модуля (команда Device, меню Assign).

Відзначимо, що максимальний ефект від використання параметрів досягається при створенні бібліотек параметризованих модулів, призначених для повторного використання.

3.12. Оператор IF GENERATE

Оператор IF GENERATE дозволяє оцінити значення арифметичного виразу і за результатами оцінки сформувати той або інший опис проектованого модуля.

Оператор може використовуватися в повній або спрощеній формі.

Повна форма:   Спрощена форма:

IF __expression GENERATE  IF _expression GENERATE

__statement; __statement;

__statement; __statement;

ELSE GENERATE            END GENERATE;

__statement;

__statement;

END GENERATE;

Оператор задається в такий спосіб:

За ключовим словом IF вказується оцінюваний арифметичний вираз.

За ключовим словом GENERATE слідують оператори мови AHDL, які будуть використані в текстовому описі при істинності оцінюваного арифметичного виразу.

При наявності ключових слів ELSE GENERATE за ними вказуються оператори, які будуть використані в текстовому описі в тому випадку, якщо оцінюваний арифметичний вираз хибний.

Оператор закінчується ключовими словами END GENERATE, за якими слідує крапка з комою (;).

Застосування оператора проілюструємо на прикладі текстового опису, що залежно від значення параметра Module_Type буде задавати або суматор, або віднімальщик розрядністю WIDTH.

PARAMETERS

(

WIDTH = 8,

MODULE_TYPE = "ADD"

);

SUBDESIGN IF_GEN

(

A[WIDTH..1], B[WIDTH..1]  : INPUT;

RESULT[WIDTH..1], Cout  : OUTPUT;

)

BEGIN

IF Module_Type == "ADD" GENERATE

 (Cout,Result[]) = (GND,A[]) + (GND,B[]);

ELSE GENERATE

 (Cout,Result[]) = (GND,A[]) - (GND,B[]);

END GENERATE;

END;

При вихідних значеннях параметрів компілятор синтезує восьмирозрядний суматор, результати моделювання якого наведені на рис. 16

Рис. 16.

Якщо поза текстовим описом (наприклад, командою Global Project Parameters меню Assign) параметру Module_Type присвоїти відмінне від ADD значення, то компілятор синтезує віднімальщик, результати моделювання якого наведені на рис. 17.

Рис. 17.

Підстановка значень параметрів і формування відповідного текстового опису здійснюється компілятором на етапі перевірки синтаксису. Тому застосування оператора IF GENERATE не приводить до використання додаткових логічних ресурсів НВІС ПЛ.


Примітиви

Примітив - вбудований в пакет MAX+plus II і мову AHDL функціональний опис того або іншого внутрішнього ресурсу НВІС ПЛ фірми ALTERA .

У мові AHDL визначено два типи примітивів:

  •   примітиви буферів;
  •   примітиви тригерів: синхронних тригерів (Flipflop) і тригера засувки (Latch).

Примітиви буферів

У мові AHDL використовуються наступні примітиви буферів:

  •  CARRY        — буфер ланцюгового переносу;
  •  CASCADE — буфер каскадного нарощування логічної функції;
  •  ЕХР  — буфер логічного розширювача;
  •   GLOBAL   — буфер глобального ланцюга поширення керуючого сигналу;
  •   LCELL   —  буфер розміщення логічного осередку (макроосередку), що не видаляється ;
  •   OPNDRN   —  буфер виходу з відкритим колектором;
  •   SOFT — буфер розміщення логічного осередку (макроосередку), що видаляється;
  •     TRI    — буфер виходу зі Z станом.

Для використання в текстовому описі модуля примітива необхідно звернутися до вбудованого в пакет функціонального опису даного примітива й зіставити його виводам: числа, константи, змінні або виводи модуля.

У мові AHDL визначені два способи звертання до примітива:

безпосереднє звертання (In_line Reference);

присвоєння примітиву символічного імені, тобто оголошення його змінною або звертання до нього як до змінної.

Безпосереднє звертання до примітива здійснюється в такий спосіб:

вказується вихід (або внутрішня змінна) модуля, на який передається сигнал з виходу примітива;

далі ставиться знак рівності й ім'я примітива;

за ім'ям примітива в круглих дужках, через кому перераховуються передані значення:

  •   числа,
    •   константи,
      •   змінні або виводи модуля, що зіставляються входам примітива;

за круглими дужками ставиться крапка з комою.

Зіставлення входів примітива з переданими значеннями може здійснюватися:

позиційно;

за іменами.

При позиційному зіставленні порядок перерахування переданих значень повинен відповідати порядку перерахування входів, використаному в описі прототипу примітива.

Вихід модуля (внутрішня змінна)=

Ім'я примітива (передане значення, передане значення,...);

Як приклад розглянемо текстовий опис схеми, представленої на рис.18

Рис. 18

Текстовий опис:

SUBDESIGN Prim_in_line1

(

D_in, Enadle  :  INPUT;

D_tri   : OUTPUT;

)

BEGIN

D_tri = TRI(D_in, Enable);

END;

При описі присвоєння в програмі можливі наступні варіанти, що ілюструють метод присвоєння за іменами.

D_tri = TRI(.IN = D_in, OE = Enable);

D_tri = TRI(OE = Enable,.IN = D_in);

Відзначимо, що прототипи примітивів вбудовані в пакет, і для їхнього підключення до текстового опису, оператор INCLUDE не використовується. Прототип примітива TRI у пакеті MAX+plus II заданий у такий спосіб:

FUNCTION TRI (IN,  OE)

RETURNS  (OUT);

При звертанні до примітива в списку переданих значень першим зазначений вхід D_in. Тому він буде з'єднаний із входом, зазначеним першим в описі прототипу примітива. Відповідно, вхід Enable модуля буде з'єднаний із входом ОЕ примітива TRI.

Примітиви тригерів

У табл. наведені використовувані в мові AHDL примітиви тригерів.

Таблиця

Примітив

Прототип примітива

DFF

FUNCTION DFF (D, CLK, CLRN, PRN)

RETURNS (Q)

DFFE

FUNCTION DFFE (D,CLK,CLRN, PRN, ENA)

RETURNS (Q)

TFF

FUNCTION TFF (T, CLK, CLRN, PRN) RETURNS (Q)

TFFE

FUNCTION TFFE (T, CLK, CLRN, PRN, ENA) RETURNS (Q)

JKFF

FUNCTION JKFF (J, K, CLK, CLRN, PRN) RETURNS (Q)

JKFFE

FUNCTION JKFFE (J, K, CLK, CLRN, PRN, ENA) RETURNS (Q)

SRFF

FUNCTION SRFF (S, R, CLK, CLRN, PRN) RETURNS (Q)

SRFFE

FUNCTION SRFFE (S, R, CLK, CLRN, PRN, ENA) RETURNS (Q)

LATCH

FUNCTION LATCH (D, ENA)

RETURNS (Q)

Виводи тригерів:

D, T, J, K, S, R — інформаційні входи;

CLK — вхід тактового сигналу (активний перепад 0→1);

CLRN — вхід асинхронного скидання тригера (активний рівень логічний нуль);

PRN — вхід асинхронної установки тригера (активний рівень логічний нуль);

ENA — вхід дозволу роботи тригера (активний рівень → логічна одиниця).

3. Послідовна логіка

Логічна схема називається послідовних, якщо виходи в заданий момент часу є функцією входів не тільки в той же момент, але і в усі попередні моменти часу. Таким чином, в послідовних схема повинні входити деякі елементи пам'яті (тригери). У мові AHDL послідовних логіка реалізована цифровими автоматами із пам'яттю (state machines) і тригерами. 

Регістри

Регістр - пристрій, що забезпечує прийом, зберігання, передачу й перетворення форми подання (паралельних, послідовна) даних.

За способом прийому й передачі даних розрізняють:

  •  Паралельний регістр - регістр із паралельними завантаженням і виходом даних.
  •  Регістр зсуву - регістр із послідовними завантаженням і виходом даних.
  •  Регістр зсуву, з паралельним завантаженням даних.
  •  Регістр зсуву, з паралельним виходом даних.

2.1.1. Паралельний регістр

На рис.  представлена структурна схема чотирозрядного паралельного регістра.

Рис. 24.

Виводи регістра:

  •  CLK - вхід тактового сигналу;
  •  Enable - вхід дозволу завантаження даних;
  •  Set - вхід асинхронної установки регістра;
  •  Reset - вхід асинхронного скидання регістра;
  •  D[4..1] - чотирирозрядний вхід даних;
  •  Q[4..1] - чотирирозрядний вихід даних.

Текстовий опис регістра:

SUBDESIGN RG_4

(

D[3..0], CLK, ENABLE  : INPUT = GND;

RESET, SET    : INPUT = VCC;

Q[3..0]    : OUTPUT;

)

VARIABLE

FF[3..0] : DFFE;

BEGIN

FF[].(CLK, CLRN, PRN, ENA) = (CLK, RESET, SET, ENABLE);

FF[].D = D[];

Q[] = FF[].Q;

END;

У наведеному описі до примітива (DFFE) звертаються як до змінної: оголошені чотири змінні  FF[3..0], кожна з яких позначає DFFE тригер із входом дозволу роботи.

Базове значення вхідного сигналу, призначене для входів D CLK, Enable - логічний нуль, а для входів Reset, Set - логічна одиниця. Тому при використанні модуля RG_4 як компоненти кожного з його входів може бути залишений непідключеним, і на нього автоматично буде подане відповідне базове значення.

Відзначимо, що входи асинхронної установки (Set) і скидання (Reset) мають більш високий пріоритет у порівнянні із входом дозволу роботи (Enable). Так, якщо на вході Reset є присутнім сигнал логічного нуля, то кожний розряд регістра буде асинхронно скинутий у нуль незалежно від значення сигналу на вході Enable.

Розглянемо ще один можливий варіант опису розглянутого паралельного регістра. У цьому випадку для задання алгоритму роботи пристрою використаний оператор FOR i IN 0 TO 3 GENERATE

SUBDESIGN RG_4_1

(

D[3..0], CLK, ENABLE  : INPUT = GND;

RESET, SET    : INPUT = VCC;

Q[3..0]    : OUTPUT;

)

BEGIN

FOR i IN 0 TO 3 GENERATE

Q[i] = DFFE(.CLK=CLK, .D=D[i], .ENA=ENABLE, .CLRN=RESET, .PRN=SET);

END GENERATE;

END;

Цей опис повністю ідентичний вищенаведеному.

 Цифрові автомати з пам'яттю (state mashine)

Цифрові автомати так само, як таблиці істинності та булеві рівняння, легко реалізуються в мові AHDL. Мова структурований, тому користувач може або сам призначити біти і значення станів, або надати цю роботу компілятору системи MAX + PLUS.

Компілятор, по запевненнях виробника "використовує патентовані перспективні евристичні алгоритми", що дозволяють зробити такі автоматичні призначення станів, які мінімізують логічні ресурси, потрібні для реалізації цифрового автомата.

3.5.1. Реалізація цифрових автоматів (state machine)

У AHDL кінцевий автомат характеризується кінцевим набором станів, кожному з яких дається своє ім'я. Будь-який стан автомата представляється унікальним набором значень на виходах внутрішніх тригерів (кодом стану), що зберігають стану автомата. Необов'язково, щоб всі тригери були підключені до виходів автомата. Перехід зі стану в стан відбувається при необхідній комбінації вхідних сигналів з приходом сигналу синхронізації (clk). У AHDL кінцевий автомат крім інформаційних управляючих входів, що визначають його функціонування відповідно до задуму розробника, містить три стандартниних керуючих входу:

clk - вхід сигналу синхронізації тригерів (активним, тобто змінює стан тригерів, є зростаючий фронт);

reset - вхід асинхронного скидання автомата - примусового переведення його в початковий стан (активний рівень - vcc);

ena - вхід дозволу роботи автомата (активний рівень - vcc).

Вхід clk повинен бути обов'язково підключений. Входи reset і ena не є обов'язковими. Якщо вони не будуть явно підключені в проекті, то на них компілятором будуть подані логічні значення, що забезпечують нормальне функціонування автомата.

Для створення кінцевого автомата на мові AHDL необхідно виконати наступні кроки:

в розділі змінних оголосити кінцевий автомат і його стани

в логічному розділі помістити вирази, що забезпечують надходження зумовлених сигналів управління в автомат;

в логічному розділі за допомогою операторів case або table описати логіку переходів між станами автомата, а також поставити у відповідність тим станам, для яких це необхідно, логічні значення виходів автомата.

У мові AHDL для завдання цифрового автомата потрібно включити в TDF-файл наступні елементи:

  •  оголошення цифрового автомата (у секції VARIABLE);
  •  подання  сигналыв упавління (в логічній секції);
  •  переходи між станами (в логічній секції).

Цифрові автомати в мові AHDL можна також експортувати та імпортувати, здійснюючи обмін між файлами типу TDF і (GDF-файл) або *. WDF; при цьому вхідний чи вихідний сигнал задається як порт цифрового автомата в секції SUBDESIGN.

Найпростіше оголошення кінцевого автомата повинно містити ім'я автомата, супроводжуване двокрапкою і ключовим словом machine. За ключовим словом machine повинен слідувати список станів, взятий у круглі дужки і передує ключовими словами with states. Перший стан в списку є вихідним для автомата, воно встановлюється за сигналом reset.

Приклад:

subdesign example8

(

clock: input; - сигнал синхронізації

f_on: input; - зовнішній сигнал включення

outf: output; - вихід автомата

)

variable

fcont: machine with states (f0, f1, f2, f3);

begin

fcont.clk = clock; - підключення сигналу синхроніз.

fcont.ena = f_on; - подача сигналу включення

table

fcont => fcont, outf;

f0 => f1, gnd;

f1 => f2, gnd;

f2 => f3, vcc;

f3 => f0, gnd;

end table;

end;

У наведеному прикладі реалізований найпростіший автомат, що забезпечує поділ на чотири частоти проходження імпульсів синхронізації, що надходять на зовнішній вхідний порт clock. Вихідні імпульси автомата, що з'являються в чотири рази рідше синхронізуючих, подаються на зовнішній порт outf.

Автомат оголошений в розділі змінних з ім'ям fcont і чотирма станами: f0, f1, f2 і f3. Перші два рядки логічного розділу підключають зовнішні вхідні порти clock і f_on до зумовленим керуючим входам автомата clk і ena. Наступний далі оператор table описує переходи між станами, а також відповідні новим станам значення вихідного порту outf .

Відповідно до наведеного опису автомата, для переходу з будь-якого поточного стану в наступне не потрібно якихось керуючих сигналів. Переходи здійснюються з приходом зростаючого фронту сигналу clk. Оскільки всі кінцеві автомати, синтезовані компілятором є синхронними, явне вказівку сигналу clk в якості логічної змінної всередині оператора table (або іншого оператора, що описує переходи між станами автомата) не потрібно.

При синтезі такого автомата компілятор виділить мінімальну кількість тригерів (запам'ятовуються бітів), необхідну для обраного сімейства мікросхем. Зокрема, при реалізації прикладу в мікросхемі сімейства MAX3000 це будуть два тригера.

Обов'язковими елементами оголошення автомата є його ім'я і список станів. Однак можна додатково явно вказати необхідні для його реалізації іменовані біти станів, тобто тригери. Їх число може бути більше автоматично визначається компілятором, наприклад коли потрібно щоб біти стану одночасно були і вихідними сигналами автомата. Воно також може бути менше необхідного мінімального числа бітів зберігання станів. У цьому випадку компілятор автоматично додасть бракуючі для функціонування автомата тригери до явно оголошеним.

Приклад:

subdesign example9

(

clock: input;

f_on: input;

outb [3 .. 0]: output; - виходи автомата

)

variable

fcont: machine of bits (ba, bb, bc, bd)

with states (

f0 = b "0001",

f1 = b "0010",

f2 = b "0100",

f3 = b "1000"

);

begin

fcont.clk = clock; - підключення сигналу синхроніз.

fcont.ena = f_on; - подача сигналу включення

outb [] = (ba, bb, bc, bd);

table

fcont => fcont;

f0 => f1;

f1 => f2;

f2 => f3;

f3 => f0;

end table;

end;

У наведеному прикладі реалізований автомат, який, на відміну від попереднього, в кожному стані подає логічну одиницю на відповідний цьому станом вихід (так працює іграшка "біжать вогні"). Оскільки в такому пристрої необхідні 4 виходи, то автомат за допомогою ключових слів of bits і списку в круглих дужках оголошений з чотирма іменованими бітами зберігання станів ba, bb, bc і bd. Ці біти (тригери) в логічному розділі підключені до 4 вихідним портам outb [3 .. 0]. Крім цього, при оголошенні станів автомата їм поставлені у відповідність необхідні значення кодів станів (b "0001", b "0010" і т. д.), тобто наборів біт для зберігання станів. Ці коди автоматично присвоюються оголошеної групі бітів (ba, bb, bc, bd), що дозволяє не включати значення виходів автомата в кожний рядок оператора table.

Нижче наведено файл simple.tdf , який реалізує функцію D-тригера.

SUBDESIGN simple

(

clk: INPUT;

reset: INPUT;

d: INPUT;

q: OUTPUT;

)

VARIABLE

ss: MACHINE WITH STATES (s0, s1);

BEGIN

ss.clk = clk;

ss.reset = reset;

CASE ss IS

WHEN s0 =>

q = GND;

IF d THEN

ss = s1;

END IF;

WHEN s1 =>

q = VCC;

IF! D THEN

ss = s0;

END IF;

END CASE;

END;

У даному файлі в секції VARIABLE оголошено цифровий автомат (state machine) ss . Стану автомата визначаються як s0 і s1 . Біти станів не визначені.

Установка сигналів Clock, Reset і Enable

Сигнали Clock, Reset і Enable управляють тригерами регістра станів в цифровому автоматі. Ці сигнали задаються булевими рівняннями управління в логічній секції.

У попередньому прикладі (файл simple.tdf) синхросигнал цифрового автомата (Clock) формується входом clk. Асинхронний сигнал скидання цифрового автомата (Reset) формується входом reset, що мають високий активний рівень. Для підключення сигналу відмикання (Enable) потрібно додати в даний файл проекту рядок "ena: INPUT;" в секцію SUBDESIGN, а також додати в логічну секцію булеве рівняння "ss.ena = ena; ".

Завдання вихідних значень для станів

Для завдання вихідних значень можна використовувати оператори IF і CASE. У наведеному вище прикладі (файл simple.tdf ) значення виходу q встановлюється рівним GND, якщо цифровий автомат ss знаходиться в стані s0 , і рівним VCC, коли вона перебуває в стані s1 . Ці присвоювання робляться в пропозиціях WHEN оператора CASE.

Вихідні значення можна також задавати в таблицях істинності, як буде описано в розділі "Присвоєння бітів і значень в машині станів".

Завдання переходів між станами

Переходи між станами визначають умови, за яких машина переходить у новий стан. Переходи в машині станів задаються шляхом умовного присвоєння стану в рамках однієї конструкції, яка описує режим. Для цієї мети рекомендується використовувати оператор CASE або таблицю істинності.

У наведеному вище прикладі (файл simple.tdf ) переходи для кожного стану визначені в пропозиціях WHEN оператора CASE.

 Створення і застосування користувальницьких макрофункцій

У файлах, написаних на AHDL можна легко створювати і використовувати користувальницькі макрофункції, виконуючи наступні дії:

  •  Створити логіку для макрофункції у файлі проекту.
  •  Визначити порти макрофункції в оголошенні прототипу функції.

Прототип функції дає короткий опис функції: її ім'я, а також вхідні, вихідні і двонаправлені порти. Можна також використовувати машинні порти для макрофункцій, які імпортують або експортують цифрового автомата.

Оголошення прототипів функцій може бути розміщено в Include-файлі, який викликається в користувальницькому файлі.Використовуючи команду Create Default Include File, можна автоматично створювати Include-файл з прототипом функції для будь-якого файлу проекту.

  •  Вставити у файл приклад макрофункції за допомогою оголошення прикладу в секції VARIABLE або за допомогою безпосередньої посилання в тексті.
  •  Використовувати макрофункцій у файлі.

Визначення користувальницької макрофункції

Для використання макрофункції її потрібно або включити в опис прототипу функції в TDF-файл, або вказати в директиві INCLUDE файлу TDF ім'я Include-файла, що містить прототип цієї макрофункції. Як уже згадувалося вище, Include-файли можна створювати автоматично.

Нижче наводиться файл keyboard.tdf, в якому реалізований кодіровщік для 16-клавішною клавіатури.

TITLE "Keyboard Encoder";

INCLUDE "74151";

INCLUDE "74154";

INCLUDE "4count";

FUNCTION debounce (clk, key_pressed)

RETURNS (pulse);

SUBDESIGN keyboard

(

clk: INPUT;% 50-KHz clock% col [3 .. 0]: INPUT;% keyboard columns% row [3 .. 0], d [3 .. 0]: OUTPUT;% keyboard rows, key code% strobe : OUTPUT;% key code is valid%

)

VARIABLE

key_pressed: NODE;% VCC when key d [3 .. 0] is pressed% mux: 74151;

decoder: 74154;

counter: 4count;

opencol [3 .. 0]: TRI;

BEGIN

% Drive keyboard rows with a decoder and%% open-collector outputs. %

row [] = opencol []. out;

opencol []. in = GND;

opencol []. oe = decoder. (o0n, o1n, o2n, o3n); decoder. (b, a) = counter. (qd, qc);

% Sense keyboard columns with a multiplexer%

mux.d [3 .. 0] = col [3 .. 0];

mux. (b, a) = counter. (qb, qa);

key_pressed =! mux.y;

% Scan keyboard until a key is pressed. %% Drive key's code onto d [] outputs%

counter.clk = clk;

counter.cin =! key_pressed;

d [] = counter. (qd, qc, qb, qa);

% Generate strobe when key has settled%

strobe = debounce (clk, key_pressed);

END;

У даному прикладі в директивах INCLUDE вказуються файли прототипів функції для стандартних макрофункцій фіроми Altera:4count , 74151 і 74154 .

Окремо у файлі дан прототип функції для макрофункції debounce , в якому описані входи clk і key_pressed і вихід pulse .

Приклади макрофункцій 4count , 74151 і 74154 викликаються оголошенням прикладів в секції VARIABLE. Приклад макрофункціїdebounce викликається безпосередньою посиланням в тексті логічної секції


1. Рассмотрение гражданского дела
2. а Формирование финансовых ресурсов пенсионной системы
3. реферат дисертації на здобуття наукового ступеня кандидата педагогічних наук Тернопіль '
4. Тема 11 Лекция 11 Сложное движение точки и тела В данной лекции рассматриваются следующие вопросы- Сложно
5. Завдання 2До структури філософського знання належать- онтологіягносеологіяаксіологія
6. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата хімічних наук КИЇ
7. Конкурентоспособность российских предприятий4 1.html
8. Доклад Как подготовиться к ответу на экзамене
9. Тема - Финансовый план предприятия
10. Руссо Об общественном договоре(сокращенка).html
11. тематической логике и программировании
12. Татары
13. Тема 1. ПРЕДМЕТ СОЦІАЛЬНОЇ ПЕДАГОГІКИ-СОЦІАЛЬНОЇ РОБОТИ Тема 2
14. Обучение математике 1 класс- Пособие для учителя четырехлетней начальной школы
15. Дипломная работа- Маркетингова діяльність комерційного банку
16. НорНахичеван с участием армянских общественных организаций Ростовской области г
17. ХУДОЖЕСТВЕННОСВЕТОВАЯ ЧАСТЬ 1
18. за гипервентиляции легких и недостаточного потребления; нарушение сна; нарушение питания; неспос
19. Тема 2 Информационный фонд Ордена Зодиака Для внутреннего пользования
20. Курсовой проект Анализ точностигрейферного механизма Выполнила- Студентка 022 гр