лаб_работи 6_8OK
.pdf0 |
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 приведена часова діаграма роботи шифратора.
