- •Мова опису апаратури ahdl
- •1. Опис комбінаційних схем
- •1.1. Шифратор
- •1.2. Дешифратор
- •1.3. Мультиплексор
- •1.4. Демультиплексор
- •1.5. Перетворювач коду
- •1.6. Компаратор
- •1.7. Суматор
- •1.8. Шинні приймачі-передавачі
- •1.9. Схеми монтажного «і» і «або»
- •2.1. Регістри
- •2.1.1. Паралельний регістр
- •2.1.2. Регістр зсуву
- •2.1.3. Регістр зсуву з паралельним завантаженням даних
- •2.1.4. Універсальний регістр
- •2.1.5. Циклічний регістр зсуву
- •Часть 2. Практическое использование языка ahdl. М. 2005.- 34 с.
- •1. Опис комбінаційних схем……………………………… 3
- •1.1. Шифратор ………………………………………………………………. 3
1.8. Шинні приймачі-передавачі
На рис. 17 зображена структурна схема типового приймача-передавача, що має:
вхідну WIDIH-розрядну шину (D[WIDTH..1]);
вихідну WIDTH-розрядну шину (Q[WIDTH..l]);
двонаправлену WIDTH-розрядну шину (DB[WIDTH..1]);
вхід дозволу роботи (CS). При CS=0 pa6oтa заборонена: вихідна шина Dout[] і двонаправлена шина DB [] .перебувають в Z стані. При CS=1 робота дозволена: стан шин, і напрямок передачі даних визначається сигналом на вході En_Din;
вхід вибору напрямку передачі (En_Din). При En_Din=0 дані передаються із шини DB [] на шину Dout[]. При En_Din=l дані передаються із шини Din[] на шину DB [].
Рис. 17.
Варіант параметризованого опису приймача-передавача наведено нижче.
PARAMETERS (WIDTH = 7);
ASSERT (WIDTH > 0)
REPORT "Width must be more then %" WIDTH
SEVERITY ERROR;
SUBDESIGN TRSIV
(
D[WIDTH..0], CS, EN_DIN : INPUT = GND;
Q[WIDTH..0] : OUTPUT;
DB[WIDTH..0] : BIDIR;
)
VARIABLE
TRI_B[WIDTH..0] : TRI;
TRI_OUT[WIDTH..0] : TRI;
BEGIN
CASE (CS, EN_DIN) IS
WHEN B"10" => TRI_OUT[].OE = VCC;
WHEN B"11" => TRI_B[].OE = VCC;
END CASE;
TRI_B[].IN = D[];
TRI_OUT[].IN = DB[];
DB[] = TRI_B[].OUT;
Q[] = TRI_OUT[].OUT;
END;
У наведеному текстовому описі кожний вивід із групи DB[WIDTH..1] - двонаправлений вивід (BIDIR).
У розділі VARIABLE оголошено WIDTH змінних TRI_B[WIDTH. .1] і WIDTH змінних TRI_Out[WIDTH. .1], кожна з яких позначає примітив буфера із трьома станами (TRI). Таким чином, компіляторові явно вказується, що на відповідних виходах НВІС слід використати буфери із трьома станами.
Входи CS і En_Din об'єднані в часову групу, оцінювану в операторі CASE. Відмітимо, що при CS=0 і довільному сигналі на вході En_Din, значення логічних функцій TRI_Out[].OE і TRI_B[].OE явно не визначені. За замовчуванням їхнє значення на даних наборах аргументів - логічний нуль. Тому при CS=0 всі буфери TRI будуть перебувати в Z стані.
Результати моделювання приймача-передавача TRSIV, при WIDTH=7, наведено на рис. 18.
Рис. 18.
На наведених часових діаграмах крім основних вхідних і вихідних сигналів присутні сигнали, що діють на введених в програмі змінних, відповідних примітивам (TRI_Out[] і TRI_B[]).
Відмітимо, що двонаправлений вивід на часовій діаграмі зображується і як вхід, і як вихід. Тому в наведених результатах моделювання група двонаправлених виводів DB[7..0] відображена і як група входів DB[7..0], і як група виходів DB[7..0]. Дані, що надходять на двонаправлену шину DB[7..0], розміщаються на вхідну шину DB[7..0], а при моделюванні вони автоматично відображаються й на вихідній шині DB[7..0]. Дані, що знімаються із двонаправленої шини DB[7..0], відображаються на вихідній шині DB[7..0], при цьому вхідна шина DB[7..0] повинна бути в Z стані.
На рис. 19 зображена структурна схема WIDTH-розрядного приймача-передавача, що має:
двонаправлену WIDTH-розрядну шину DA[];
двонаправлену WIDTH-розрядну шину DB[];
вхід дозволу роботи виходів (ОЕ). При ОЕ=0 дві двонаправлені шини перебувають в Z стані. При ОЕ=1 напрямок передачі даних по двонаправленим шинах визначається значенням сигналу на вході DIR;
вхід керування напрямком передачі даних (DIR). При DIR=0 дані передаються із шини DB[] на шину DA[]. При DIR=1 дані передаються із шини DA[] на шину DBQ.
Рис. 19.
Варіант параметризованого опису даного пристрою має вигляд:
PARAMETERS (WIDTH = 7);
ASSERT (WIDTH > 0)
REPORT "Width must be more then % "WIDTH
SEVERITY ERROR;
SUBDESIGN TRI_INOUT_2
(
OE, DIR : INPUT;
DA[WIDTH..0], DB[WIDTH..0] : BIDIR;
)
BEGIN
FOR i IN 0 TO WIDTH GENERATE
DA[i] = TRI(.IN = DB[i], .OE = !DIR & OE);
DB[i] = TRI(.IN = DA[i], .OE = DIR & OE);
END GENERATE;
END;
У текстовому описі використовується безпосереднє звертання до примітивів буферів TRI. Зіставлення виводів буферів і переданих на них сигналів здійснюється за іменами.
Для
реалізації параметризованого
опису
використаний оператор
FOR GENERATE. При цьому, пара
рядків
DA[i] = TRI(.IN = DB[i], .OE = !DIR & OE);
DB[i] = TRI(.IN = DA[i], .OE = DIR & OE);
буде інтерпретована компілятором як WIDTH пара з індексами від 1 до WIDTH.
Відзначимо, що сигнали, передані на вхід ОЕ кожного з буферів, задані логічними рівняннями.
На рис. 20 наведено результати моделювання модуля TRI_INOUT_2 при WIDTH =8:
На рис. 21 зображена структурна схема N-розрядного приймача-передавача, що має:
двонаправлену N-розрядну шину DA[]
двонаправлену N-розрядну шину DB[];
двонаправлену N-розрядну шину DC[];
входи DIRA, DIRB, DIR_C, Mode, що управляють напрямком передачі даних.
Рис.3.20.
Рис. 21.
Варіант параметризованого опису приймача-передавача із трьома двонаправленими шинами наведений нижче.
Режими роботи приймача-передавача зведені в табл. 1.
Таблиця 1.
DIR_A |
DIR_B |
DIR_C |
MODE |
Напрямок передачі даних |
1 |
0 |
0 |
0 |
Дані передаються із шини DB[] на шину DA[] |
1 |
0 |
0 |
1 |
Дані передаються із шини DC[] на шину DA[] |
0 |
1 |
0 |
0 |
Дані передаються із шини DA[] на шину DB[] |
0 |
1 |
0 |
1 |
Дані передаються із шини DC[] на шину DB[] |
0 |
0 |
1 |
0 |
Дані передаються із шини DA[] на шину DC[] |
0 |
0 |
1 |
1 |
Дані передаються із шини DB[] на шину DC[] |
1 |
1 |
0 |
x |
Дані передаються із шини DC[] на шину DA[] і на шину DB[] |
0 |
1 |
1 |
x |
Дані передаються із шини DA[] на шину DB[] і на шину DC[] |
1 |
0 |
1 |
x |
Дані передаються із шини DB[] на шину DA[] і на шину DC[] |
PARAMETERS (WIDTH = 7);
ASSERT (WIDTH > 0)
REPORT "Width must be more then %"WIDTH
SEVERITY ERROR;
SUBDESIGN TRI_INOUT_3
(
DIR_A, DIR_B, DIR_C, MODE : INPUT;
QA[WIDTH..0], QB[WIDTH..0], QC[WIDTH..0] : BIDIR;
)
VARIABLE
FOR_QA[WIDTH..0], FOR_QB[WIDTH..0], FOR_QC[WIDTH..0] : NODE;
QA_OE, QB_OE, QC_OE : NODE;
BEGIN
CASE (DIR_A, DIR_B, DIR_C, MODE) IS
WHEN B"1000" => FOR_QA[] = QB[]; QA_OE = VCC;
WHEN B"1001" => FOR_QA[] = QC[]; QA_OE = VCC;
WHEN B"0100" => FOR_QB[] = QA[]; QB_OE = VCC;
WHEN B"0101" => FOR_QB[] = QC[]; QB_OE = VCC;
WHEN B"0010" => FOR_QC[] = QA[]; QC_OE = VCC;
WHEN B"0011" => FOR_QC[] = QB[]; QC_OE = VCC;
WHEN B"110X" => FOR_QB[] = QC[]; QB_OE = VCC;
FOR_QA[] = QC[]; QA_OE = VCC;
WHEN B"011X" => FOR_QB[] = QA[]; QB_OE = VCC;
FOR_QC[] = QA[]; QC_OE = VCC;
WHEN B"101X" => FOR_QC[] = QB[]; QC_OE = VCC;
FOR_QA[] = QB[]; QA_OE = VCC;
END CASE;
FOR i IN 0 TO WIDTH GENERATE
QA[i] = TRI(.IN = FOR_QA[i], .OE = QA_OE );
QB[i] = TRI(.IN = FOR_QB[i], .OE = QB_OE );
QC[i] = TRI(.IN = FOR_QC[i], .OE = QC_OE );
END GENERATE;
END;
У наведеному текстовому описі в розділі VARIABLE оголошені три WIDTH-розрядні групи змінних типу NODE і три однорозрядні змінні типи NODE.
Входи DIR_A, DIR_B, DIR_C, Mode об'єднані в часову групу, оцінювану в операторі CASE. Нагадаємо, що двійкове число В"110х" відповідає двом двійковим числам: В"1101" і В"1100". Змінні FOR_DA[], FOR_DB[], FOR_DC[], DA_OE, DB_OE, DC_OE визначені не на всіх можливих наборах аргументів, Оскільки немає явного задання їхніх базових значень, то за замовчуванням зазначені змінні на всіх не наведених в операторі CASE наборах аргументів будуть мати значення логічного нуля. Змінні DA_OE, DB_OE, DC_OE подаються на входи ОЕ буферів TRI. Тому, незалежно від значення змінних FOR_DA[], FOR_DB і FOR_DC[] виходи QA[], QB[], QC[] будуть в Z стані з появою на входах DIR_A, DIR_B, DIR_C, Mode наборів сигналів, не вказаних в операторі CASE.
Результати моделювання проекту TRI_INOUT_3 при WIDTH=7 наведено на рис. 22.
Рис. 22.
