Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лаб_работи 6_8OK

.pdf
Скачиваний:
12
Добавлен:
02.02.2015
Размер:
881 Кб
Скачать
☆

0

0

1

1

1

1

0

1

0

0

0

1

1

0

1

1

1

1

1

1?

Ключові слова мови

AND

FUNCTION

OUTPUT

ASSERT

GENERATE

PARAMETERS

BEGIN

GND

REPORT

BIDIR

HELP_ID

RETURNS

BITS

IF

SEGMENTS

BURIED

INCLUDE

SEVERITY

CASE

INPUT

STATES

CLIQUE

IS

SUBDESIGN

CONNECTED_PINS

LOG2

TABLE

CONSTANT

MACHINE

THEN

DEFAULTS

MOD

TITL

DEFINE

NAND

TO

DESIGN

NODE

TRI_STATE_NODE

DEVICE

NOR

VARIABLE

DIV

NOT

VCC

ELSE

OF

WHEN

ELSIF

OPTIONS

WITH

END

OR

XNOR

FOR

OTHER

XOR

Стандартні, зарезервовані ідентифікатори.

 

 

CARRY

 

JKFF

 

SRFFE

CASCADE

 

JKFFE

 

SRFF

CEIL

 

LATCH

 

TFFE

DFFE

 

LCELL

 

TFF

DFF

 

MCELL

 

TRI

EXP

 

MEMORY

 

USED

FLOOR

 

OPENDRN

 

WIRE

GLOBAL

 

SOFT

 

X

Імена в AHDL

Імена в AHDL можуть мати довжину до 32 символів. За допомогою символічних імен можна визначати:

символічні імена;

імена модулів;

імена виводів.

Символічні імена, використовуються для завдання

змінних;

констант;

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

параметрів;

позначень арифметичних виразів;

іменованих операторів.

Групи в AHDL

Умові AHDL допускається завдання груп – наборів однотипних змінних або виводів. Групи одновимірні і двовимірні. Наприклад:

A[5..0] – одновимірна група B[8..0][9..1] – двовимірна група.

Існують послідовні, часові групи, об'єднуючі різні об'єкти. Наприклад:

(A, B[2], C, d[1]) – часова група.

Умові AHDL допускається запис чісел наступних типів.

123 - десяткові;

B011010 – двійкові;

O2357 - вісімкові;

H09AF - шістнадцятирічні;

Вирази

У мові AHDL можуть бути арифметичні і логічні вирази. Арифметичні вирази – використовуються для завдання констант, меж індексних виразів і т.д. Результат обчислення арифметичного виразу ціле позитивне число. Приклади арифметичних виразів.

A+B

A[23]+LOG*3

При написанні арифметичних виразів використовуються наступні арифметичні операції:

+, -, !, ^, MOD, DIV, *, LOG2, = =, !=, >, >=,< , <=.

Логічні вирази – використовуються для логічних рівнянь (Boolean Equation), в операторах CASE, IF THEN. При написанні логічних виразів використовуються наступні логічні операції:

! - NOT, & - AND, !& - NAND, # - OR , !# - NOR, $ - XOR, !$ - XNOR.

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

R[4..1]=(A,B,C,D)#OP[3..0]

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

Примітиви.

На відміну від інших мов поведінкового опису роботи ВІС, мова дозволяє безпосередньо посилатися на внутрішні об'єкти ПЛІС (буфера, тригери, логічні елементи). Зокрема, допускаються посилання на наступні типи буферів QUARTUSII.

CARRY – буфер ланцюжка перенесення;

CASCADE – буфер каскадного нарощування логічної функції;

EXP – буфер логічного розширювача;

GLOBAL – буфер глобального сигналу;

CLOCK, SET, CLR, ENA LCELL – буфер розміщення макроосередку, що не

видаляється;

OPNDRN – буфер виходу з відкритим колектором;

SOFT – буфер розміщення макроосередку, що видаляється;

TRI – буфер виходу з Z станом.

Окрім примітивів буферів в QUARTUSII часто використовують наступні примітиви тригерів:

DFF – фронтовий D тригер;

DFFE - фронтовий D тригер з дозволом роботи; JKFF - фронтовий JK тригер;

JKFFE - фронтовий JK тригер з дозволом роботи; LATCH – тригер типу «клямка»;

SRFF - стробований RS тригер;

SRFFE - стробований RS тригер з дозволом роботи;

TFF - рахунковий тригер;

TFFE - рахунковий тригер з дозволом роботи.

6.2. Структура текстового опису ВІС на мові AHDL

У загальному випадку опис проекту на мові AHDL включає в свій склад наступні розділи:

Title Statement (оператор заголовка)

Приклад: TITLE ”Binary counter”;

Include Statement (оператор включення файлу) За умовчанням тип файлу .inc

Приклад: INCLUDE ”constant.tex”

Constant Statement(оператор визначення константи)

Приклад: CONSTANT NUMBER=5; CONSTANT NUMBER1=NUMBER+1;

Define Statement(оператор позначення)

Приклад: DEFINE SUM(а,b)= a+2*b+1;

Parameters Statement(оператор оголошення параметрів)

Приклад: PARAMETERS

(WIDTH, SIZE

FILE=”Myfile.dat”, LONG);

Function Prototype Statement(оператор опису прототипу)

Приклад: FUNCTION compare(а[3..0],b[3..0])

RETURN (less, equal, grate);

Option Statement(оператор завдання опції) Визначає в групі елемент з найменшим індексом.

(LSB,MSB,ANY)

Приклад: OPTIONS BITO = MSB;

Assert Statement(оператор контролю)

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

Приклад:

ASSERT (WIDTH>0)

REPORT ”Width (%) must be а positive integer” WIDTH

SEVERITY ERROR;

Subdesign Section(розділ опису інтерфейсу модуля)

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

Приклад: SUBDESIGN F_prog ( A,B[4..0] : INPUT = VCC;

D :INPUT = GND;

C[7..1] :OUTPUT; E[3..2] :BIDIR;)

Опис модуля зберігається у файлі «F_prog»

Variable Section (розділ змінних)

Дозволяє описувати внутрішні змінні модулів.

(лінії зв'язку, лінії зв'язку з 3 станом, модулі, використовувані в текстовому описі як компонент)

Приклад:

INCLUDE “halfadd.inc”

VARIABLE

а, b, з : NODE; add : halfadd;

tsnode : TRI_STATE_NODE; fff[3..0]: DFF;

Logic Section (розділ опису логіки)

У цьому розділі описується алгоритм роботи проектованого модуля. Почало -BEGIN, кінець - END;

При описи алгоритму можуть бути використані:

Defaults Statement;

Assert Statement;

Boolean Equations;

Boolean Control Equations;

Case Statement;

For Generate Statement;

If Then Statement;

If Generate Statement;

In Line Logic Function Reference;

Truth Table Statement .

6.3.Основні елементи мови.

6.3.1 Булеві рівняння, групи.

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

Файл template1.tdf, приведений нижче, демонструє два простих булевих вирази, що представляють два логічні вентилі.

SUBDESIGN template1

(

in0, in21, in3 : INPUT; out1, out2 : OUTPUT;

)

BEGIN

out1 = in0 OR in1; out2 = out1 & !in3; END;

У цьому файлі вихід out1 є логічним АБО входів in0 і in1, а вихід out2 логічним І out1 і НЕ in3. Слід помітити, що порядок проходження їх у файлі не важливий.

У мові AHDL можна визначати групи, що включають в свій склад до 256 біт і що працюють, як одне ціле.

У булевих рівняннях група може прирівнюватися до булевого виразу, іншій групі, єдиному вузлу, VCC, GND, 1 або 0. У кожному з цих випадків значення групи різне. Оператора Options можна використовувати для визначення того, яким буде наймолодший біт: найбільш значущим бітом (MSB) або найменше значущим бітом(LSB) або яким-небудь іншим.

Як тільки група визначена, дужки [ ] є коротким способом визначення всього діапазону. Наприклад in0[4..1] можна також вказати як in0[]; out0[5..4][3..2] можна представити як out0[][].

Слід помітити, що :

1)Якщо група прирівнюється до VCC або GND, всі біти шини з'єднуються з цим значенням.

2)Якщо група прирівнюється до 1, тільки найменше значущий біт шини з'єднується із значенням VCC. Решта біт шини з'єднується з GND.

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

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

Приклад : out[6..3]= in[2..1]. У цьому рівнянні біти відображаються таким чином: out6 = in2, out5 = in1, out4 = in2, out3 = in1.

6.3.2 Оператори IF THEN, CASE.

Оператори If Then і Case в основному використовуються для реалізації умовної логіки. Оператори If Then оцінюють одне або декілька булевих виразів і описують поведінку для різних значень виразу. Оператори Case є списком альтернатив, які доступні для кожного значення виразу. Вони оцінюють вираз, а потім вибирають напрям дії на основі значення виразу.

Слід пам'ятати, що умовну логіку, що реалізовується за допомогою операторів If Then і Case, не слід плутати з логікою, що створюється умовно оператором If Generate, оскільки ця логіка не обов'язково є умовною.

Файл if_then.tdf, демонструє пріоритетний шифратор, який перетворить рівень активного входу з найвищим пріоритетом в значення з використанням оператора If Then.

SUBDESIGN if_then

(

in_f, in_s, in_t : INPUT; out[1..0]: OUTPUT;

)

BEGIN

IF in_f THEN out[] = 3;

ELSIF in_s THEN out[] = 2;

ELSIF in_t THEN out[] = 1;

ELSE out[] = 0; END IF; END;

Файл case.tdf, описує дешифратор з 3 в 8 біт з використанням оператора CASE.

SUBDESIGN case

(

in[2..0]: INPUT; out[7..0]: OUTPUT;

)

BEGIN CASE in[] IS

WHEN 0 => out[] = B"00000001"; WHEN 1 => out[] = B"00000010"; WHEN 2 => out[] = B"00000100"; WHEN 3 => out[] = B"00001000"; WHEN 4 => out[] = B"000100000"; WHEN 5 => out[] = B"001000000"; WHEN 6 => out[] = B"010000000"; WHEN 7 => out[] = B"100000000"; END CASE;

END;

В даному прикладі вхідний код шини має значення від 0 до 8. У операторі Case за символом => слідує рівняння, що активізується. Наприклад, якщо in[] рівний 1, то вихід out1 встановлюється в B"00000010".

6.3.3 Проектування на мові AHDL за допомогою таблиць істинності.

Мова AHDL дозволяє описувати комбінаційні схеми за допомогою таблиць істинності. Файл truth_table.tdf, є дешифратором описаним за допомогою таблиці істинності.

SUBDESIGN truth_table

(

in[2..0] : INPUT;

out0, out1, out2, out3, out4, out5, out6 : OUTPUT;

)

BEGIN

TABLE

i[3..0] => out0, out1, out2, out3, out4; H"0" => 1, 1, 1, 1, 0;

H"1" => 1, 0, 0, 0, 0;

H"2" => 0, 1, 1, 0, 1;

H"3" => 1, 1, 0, 0, 1;

H"4" => 1, 0, 0, 1, 1;

H"5" => 1, 1, 0, 1, 1;

H"6" => 1, 1, 1, 1, 1;

H"7" => 1, 1, 0, 1, 0; END TABLE;

END;

У приведеному прикладі описаний вихідний набір для всіх 8 можливих комбінацій вхідних дій.

Файл truth_table_with_x.tdf, є прикладом коли за допомогою таблиці істинності описується не весь набір вхідних дій, а лише ті, які впливають на стан вихідних сигналів.

SUBDESIGN truth_table_with_x ( in[10..0], en : INPUT;

out0, out1, bus[2..0]: OUTPUT; ) BEGIN

TABLE

en, in[10..0] => out0, out1, bus[];

1 B"00XX1XXX0XX" => 1, 0 B"000";

1 B"100XXX1XXX0" => 0, 1 B"001";

0B"00000010101" => 0, 0 B"010";

1B"00000010110" => 0, 0 B"011";

0B"00010011011" => 0, 0 B"100"; END TABLE;

END;

В даному прикладі існують тисячі вхідних наборів і описувати їх всі в таблиці істинності непрактично. Натомість можна використовувати логічний рівень Х для вказівки того, що вихід не залежить від відповідного входу. Тобто необхідно точно визначити тільки загальну частину вхідного набору, а для решти входів використовувати символ Х.

При використанні символів Х необхідно гарантувати відсутність накладень між бітовими комбінаціями в таблиці істинності. Мова AHDL припускає, що одночасно тільки одна умова в таблиці істинності може бути істинно.

За допомогою оператора DEFAULT можна привласнювати значення за умовчанням для операторів IF THEN, CASE і таблиць істинності.

6.3.4 Оператори If Generate, For Generate

Оператор If Generate містить список операторів, що активізується у разі позитивного результату оцінки арифметичного виразу.

Наступний приклад демонструє використання оператора If Generate:

IF DEVICE_FAMILY == "FLEX8K" GENERATE c[] = adder16a(a[], b[], cin);

ELSE GENERATE

c[] = adder_def(a[], b[], cin); END GENERATE;

Оператор If Generate має наступні характеристики:

Між ключовими словами If Generate полягає арифметичний вираз, значення якого піддається оцінці. За ключовим словом GENERATE слідує список операторів, кожний з яких закінчується символом «;». Оператори активізуються в тому випадку, якщо арифметичний вираз приймає дійсне значення.

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

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

Оператор If Generate може використовуватися в розділі Logic і в розділі Variable.

На відміну від операторів If Then, які можуть оцінювати лише значення булевих виразів, оператори If Generate можуть оцінювати значення наборів арифметичних виразів. Основна відмінність між операторами If Then і If Generate полягає в тому, що в першому випадку значення булевого виразу оцінюється апаратним способом (у кремнії), а в другому випадку значення набору арифметичних виразів оцінюється на етапі компіляції.

Оператор For Generate. Наступний приклад показує використання ітераційного оператора For Generate:

CONSTANT WIDTH = 6; SUBDESIGN adder

(

suma[WIDTH ..1], sumb[WIDTH..1] carry_in : INPUT;

out[WIDTH..1] carry_out: OUTPUT;

)

VARIABLE

cout[(WIDTH +1)..1]: NODE; BEGIN

cout[1]= carry_in;

FOR i IN 1 TO WIDTH GENERATE out[i]=suma[i]$sumb[i]$cout[i];% Повний суматор % cout[i+1]=suma[i]&sumb[i]#cout[i]&(suma[i]$sumb[i]); END GENERATE;

carry_out=cout[WIDTH +1]; END;

Оператор For Generate має наступні характеристики:

Між ключовими словами FOR і GENERATE полягають наступні параметри:

1.Часова змінна, що є символічне ім'я. Ця змінна використовується лише в межах оператора For Generate і закінчує своє існування після того, як компілятор обробить цього оператора. У прикладі, показаному вище, такою змінною є змінна i. Це ім'я не може використовуватися як ім'я константи, параметра або вузла в межах даного проекту.

2.За ключовим словом IN слідує діапазон, обмежений двома арифметичними виразами. Арифметичні вирази розділяються між собою ключовим словом TO. У прикладі,

показаному вище, арифметичними виразами є 1 і WIDTH. Межі діапазону можуть містити вирази, що складаються тільки з констант і параметрів; використання змінних при цьому неприпустимо.

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

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

6.3.5. Проектування на мові AHDL з використанням примітивів.

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

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

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

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

Оператор безпосереднього звернення до примітиву має наступний вигляд:

<имя вывода>=<имя примитива>(список виводів); Список виводів може бути організований або по іменах, або позиційно.

Нижче приведений приклад позиційного звернення до примітиву:

SUBDESIGN Prim1

( D_in, Ena : INPUT; D_tri : OUTPUT;

)

BEGIN D_tri=TRI(D_in,Ena); END;

Невживані виводи примітивів набувають значення визначені за умовчанням. Приклад організації звернення до примітиву у разі завдання виводів по іменах.

SUBDESIGN Prim2

( D_in, Ena, CLK : INPUT; D_out : OUTPUT;

)

BEGIN

D_tri=DFFE(.CLK=CLK, .D=D_in, .ENA=Ena); END;

Звернення до примітиву як до змінної.

В цьому випадку необхідно в розділі змінних (Variable) символічному імені або групі символічних імен зіставити примітив. Оголошена таким чином змінна, а також кожна змінна з оголошеної групи змінних матиме той же набір виводів, що і примітив.

Нижче приведений приклад звернення до примітиву, як до змінної.

SUBDESIGN Prim3

( En_BUSA, En_BUSB, LoadA, LoadB, CLK : INPUT; BUS_A, BUS_B : OUTPUT;

)

VARIABLE

RG_BUSA, RG_BUSB : DFFE; BUF_A, BUF_B: Tri;

BEGIN

(RG_BUSA, RG_BUSB).CLK = CLK;

RG_BUSA.(D,ENA)=(BUS_A, LoadB);

RG_BUSB.(D,ENA)=(BUS_B, LoadA);

BUF_A.(IN.OE) =(RG_BUSA,0,En_BUSA);

BUF_B.(IN.OE) =(RG_BUSB,0,En_BUSB);

BUS_A=BUF_A.OUT;

BUS_B=BUF_B.OUT;

END;

7.ПРОЕКТУВАННЯ ТИПОВИХ СХЕМ НА МОВІ AHDL

7.1.Прості комбінаційні схеми

Роботу простих комбінаційних схем на мові AHDL звичайно описують набором логічних виразів. Розглянемо просту схему, представлену на рис. 7.1.1.

У= а & !b+c

Еквівалентний опис цієї схеми на мові AHDL виглядає таким чином.

SUBDESIGN BOOL

(

A0,A1,B : INPUT;

OUT2 : OUTPUT; ) VARIABLE T1:NODE;

BEGIN T1=A1 & !A0;

OUT2=T1 # B; END;

Для спрощення запису логічних виразів в схему введена внутрішня змінна T1. Часова діаграма роботи схеми представлена на рис. 7.1.2.

Рисунок 7.1.2. Часова діаграма роботи комбінаційної схеми.

7.2. Мультиплексори

Розглянемо схему мультиплексора 4 =>1, описану на мові AHDL. Мультиплексор має чотири інформаційні входи In[4..1], два входи адреси Adr[2..1], вхід дозволу роботи ENA і один вихід OUT. Мультиплексор реалізований на базі оператора CASE. Опис мультиплексора має наступний вигляд.

SUBDESIGN MUX

( In[4..1], Adr[2..1]:INPUT; ENA :INPUT;

OUT :OUTPUT; ) BEGIN

IF ENA THEN CASE ADR[] IS

WHEN 0 => OUT = In[1]; WHEN 1 => OUT = In[2]; WHEN 2 => OUT = In[3]; WHEN 3 => OUT = In[4]; END CASE;

END IF; END;

Часова діаграма мультиплексора представлена на рис. 7.2.1

Рис 7.2.1. Часова діаграма роботи мультиплексора.

7.3. Шифратори

Розглянемо схему шифратора 84, описану на мові AHDL. Шифратор має вісім інформаційних входів D[7..0] і чотири виходи Q[3..0]. Шифратор реалізований на базі оператора TABLE. Опис шифратора має наступний вигляд.

SUBDESIGN SHIFRAT ( D[7..0]: INPUT; Q[3..0]: OUTPUT;)

BEGIN

TABLE D[]=>Q[];

B"00000000" => B"0000";

B"00000001" => B"0001";

B"00000010" => B"0010";

B"00000100" => B"0011";

B"00001000" => B"0100";

B"00010000" => B"0101";

B"00100000" => B"0110";

B"01000000" => B"0111";

B"10000000" => B"1000"; END TABLE;

END;

Нижче, на рис 7.3 приведена часова діаграма роботи шифратора.

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