Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мова опису апаратури AHDL_Частина2.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
455.68 Кб
Скачать

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.