Урок 6. Буферы шины: 74HC244 и 74HC245

В картинках

После этого урока в библиотеке 74HC244 и 74HC245 — микросхемы, на которых держится любая шина компьютера, — а на холсте шина из четырёх проводов: два устройства говорят на неё по очереди, третье слушает или отвечает.


6.1. Идея: шина и третье состояние

В компьютере процессор, память и устройства сидят на одних и тех же проводах — шине. Если два выхода гонят на один провод разное, это короткое замыкание. Поэтому у каждого, кто садится на шину, выход с третьим состоянием: говорит только тот, кого включили, остальные отключены. 74HC244 — восемь таких выходов, в двух четвёрках со своими OE.

BUSустройство X1OE = 0говоритустройство Y2OE = 1отключёнтретьеDIR = 1слушаетговорит только один; никто — резисторы держат на шине 0
Шина — одни провода на всех. Говорит тот, чей буфер включён, остальные отключены третьим состоянием и шине не мешают. Если включить двоих, выходы сцепятся — короткое замыкание.

6.2. Идея: буфер — двойной переворот

Внутри 74HC244 каждый вход переворачивается дважды: значение то же, но выход теперь сильный и идёт только в одну сторону — шина не «протекает» обратно во вход. Это и есть буфер. А третье состояние — ключ на выходе, как в 74HC595.

6.3. Идея: в обе стороны — две 74HC244

Память на шине и читают, и пишут: данные идут то туда, то обратно. 74HC245 пропускает в обе стороны: DIR выбирает направление. Внутри — две 74HC244 навстречу друг другу, и включена всегда только одна. Микросхема из микросхем — как 74HC390 и 74HC595.

74HC2448 буферов11OE20VCC21A0192OE32Y0181Y041A1172A052Y1161Y161A2152A172Y2141Y281A3132A292Y3121Y310GND112A374HC2458 буферов ↔1DIR20VCC2A019OE3A118B04A217B15A316B26A415B37A514B48A613B59A712B610GND11B7
74HC244: две четвёрки буферов A → Y, у каждой своё «включить» 1OE и 2OE (активный 0). 74HC245: восемь буферов между A и B, DIR выбирает направление (1 — A → B), OE отключает обе стороны.

6.4. Сборка

Тот же проект, что в уроке 5: в библиотеке все микросхемы уроков 1–5.

Шаг 1. Чип 74HC244 — 2 × 4 буфера с третьим состоянием

Ноги корпуса по даташиту: 1 1OE, 2 1A0, 3 2Y0, 4 1A1, 5 2Y1, 6 1A2, 7 2Y2, 8 1A3, 9 2Y3, 11 2A3, 12 1Y3, 13 2A2, 14 1Y2, 15 2A1, 16 1Y1, 17 2A0, 18 1Y0, 19 2OE; 10 — GND, 20 — VCC. Две четвёрки: 1A0–1A3 → 1Y0–1Y3 и 2A0–2A3 → 2Y0–2Y3, у каждой своё «включить» — 1OE, 2OE (активный 0). Внутри три 74HC04: каждый вход переворачивается дважды — получается сильный буфер, который гонит сигнал только в одну сторону, — и два переворота OE; на выходе — Transmission gate.

ДетальНогаМетка
Порт входавыход1OE
Порт входавыход1A0
Порт входавыход1A1
Порт входавыход1A2
Порт входавыход1A3
Порт входавыход2A3
Порт входавыход2A2
Порт входавыход2A1
Порт входавыход2A0
Порт входавыход2OE
Порт выходавход2Y0
Порт выходавход2Y1
Порт выходавход2Y2
Порт выходавход2Y3
Порт выходавход1Y3
Порт выходавход1Y2
Порт выходавход1Y1
Порт выходавход1Y0
74HC041A
1Y
2A
2Y
3A
3Y
4Y
4A
5Y
5A
6Y
6A
1A0
n1A0
1A1
n1A1
1A2
n1A2
n1A3
1A3
n2A0
2A0
n2A1
2A1
74HC041A
1Y
2A
2Y
3A
3Y
4Y
4A
5Y
5A
6Y
6A
2A2
n2A2
2A3
n2A3
n1A0
b1A0
b1A1
n1A1
b1A2
n1A2
b1A3
n1A3
74HC041A
1Y
2A
2Y
3A
3Y
4Y
4A
5Y
5A
6Y
6A
n2A0
b2A0
n2A1
b2A1
n2A2
b2A2
b2A3
n2A3
e1
1OE
e2
2OE
Transmission gateA
Enable
B
b1A0
e1
1Y0
Transmission gateA
Enable
B
b1A1
e1
1Y1
Transmission gateA
Enable
B
b1A2
e1
1Y2
Transmission gateA
Enable
B
b1A3
e1
1Y3
Transmission gateA
Enable
B
b2A0
e2
2Y0
Transmission gateA
Enable
B
b2A1
e2
2Y1
Transmission gateA
Enable
B
b2A2
e2
2Y2
Transmission gateA
Enable
B
b2A3
e2
2Y3

Ctrl+G → имя 74HC244. Ноги: входы 1OE, 1A0, 1A1, 1A2, 1A3, 2A3, 2A2, 2A1, 2A0, 2OE; выходы 2Y0, 2Y1, 2Y2, 2Y3, 1Y3, 1Y2, 1Y1, 1Y0.

Шаг 2. Чип 74HC245 — 8 двунаправленных буферов

Ноги корпуса по даташиту: 1 DIR, 2 A0, 3 A1, 4 A2, 5 A3, 6 A4, 7 A5, 8 A6, 9 A7, 11 B7, 12 B6, 13 B5, 14 B4, 15 B3, 16 B2, 17 B1, 18 B0, 19 OE; 10 — GND, 20 — VCC. DIR = 1 — данные идут A → B, DIR = 0 — B → A; OE = 1 — обе стороны отключены (активный 0). Внутри — две 74HC244, по одной на направление, а 74HC04 и 74HC00 решают, какая из них включена. Ноги A и B работают в обе стороны.

ДетальНогаМетка
Порт входавыходDIR
Порт входавыходA0
Порт входавыходA1
Порт входавыходA2
Порт входавыходA3
Порт входавыходA4
Порт входавыходA5
Порт входавыходA6
Порт входавыходA7
Порт входавыходOE
Порт выходавходB7
Порт выходавходB6
Порт выходавходB5
Порт выходавходB4
Порт выходавходB3
Порт выходавходB2
Порт выходавходB1
Порт выходавходB0
74HC041A
1Y
2A
2Y
3A
4A
5A
6A
OE
nOE
DIR
nDIR
GND
GND
GND
GND
74HC001A
1B
1Y
2A
2B
2Y
3A
3B
4A
4B
nOE
DIR
oAB
nOE
nDIR
oBA
GND
GND
GND
GND
74HC2441OE
2OE
1A0
1Y0
1A1
1Y1
1A2
1Y2
1A3
1Y3
2A0
2Y0
2A1
2Y1
2A2
2Y2
2A3
2Y3
oAB
oAB
A0
B0
A1
B1
A2
B2
A3
B3
A4
B4
A5
B5
A6
B6
A7
B7
74HC2441OE
2OE
1A0
1Y0
1A1
1Y1
1A2
1Y2
1A3
1Y3
2A0
2Y0
2A1
2Y1
2A2
2Y2
2A3
2Y3
oBA
oBA
B0
A0
B1
A1
B2
A2
B3
A3
B4
A4
B5
A5
B6
A6
B7
A7

Ctrl+G → имя 74HC245. Ноги: входы DIR, A0, A1, A2, A3, A4, A5, A6, A7, OE; выходы B7, B6, B5, B4, B3, B2, B1, B0.

Шаг 3. Устройства X и Y

Восемь тумблеров: X0–X3 — устройство X, Y0–Y3 — устройство Y.

ДетальНогаМетка
Input (тумблер)выходX0
Input (тумблер)выходX1
Input (тумблер)выходX2
Input (тумблер)выходX3
Input (тумблер)выходY0
Input (тумблер)выходY1
Input (тумблер)выходY2
Input (тумблер)выходY3

Шаг 4. Кто говорит

SEL выбирает, кто на шине: 0 — X, 1 — Y; OFF = 1 — никто. «Включить» у 74HC244 — от нуля, поэтому oeX = SEL ИЛИ OFF, oeY = НЕ SEL ИЛИ OFF (74HC04 и 74HC32 из урока 1).

ДетальНогаМетка
Input (тумблер)выходSEL
Input (тумблер)выходOFF
74HC041A
1Y
2A
3A
4A
5A
6A
SEL
nSEL
GND
GND
GND
GND
GND
74HC321A
1B
1Y
2A
2B
2Y
3A
3B
4A
4B
SEL
OFF
oeX
nSEL
OFF
oeY
GND
GND
GND
GND

Шаг 5. 74HC244 на шину

Выходы обеих четвёрок — на одни и те же провода BUS0–BUS3. Это и есть шина: говорит только включённая четвёрка, другая отключена — третье состояние.

ДетальНогаМетка
74HC2441OE
2OE
1A0
1Y0
1A1
1Y1
1A2
1Y2
1A3
1Y3
2A0
2Y0
2A1
2Y1
2A2
2Y2
2A3
2Y3
oeX
oeY
X0
BUS0
X1
BUS1
X2
BUS2
X3
BUS3
Y0
BUS0
Y1
BUS1
Y2
BUS2
Y3
BUS3

Шаг 6. Резисторы шины

Никто не говорит — резисторы держат на шине 0.

ДетальНогаМетка
Resistorконец 1
конец 2
BUS0
GND
Resistorконец 1
конец 2
BUS1
GND
Resistorконец 1
конец 2
BUS2
GND
Resistorконец 1
конец 2
BUS3
GND

Шаг 7. Третье устройство через 74HC245

DIR = 1 — шина → лампы K0–K3. DIR = 0 — тумблеры KS0–KS3 устройства через резисторы → K → 74HC245 → шина. Резистор здесь — «слабый» выход тумблера: когда 74HC245 сам гонит K, он сильнее и спора нет.

ДетальНогаМетка
Input (тумблер)выходDIR
Input (тумблер)выходKS0
Input (тумблер)выходKS1
Input (тумблер)выходKS2
Input (тумблер)выходKS3
Resistorконец 1
конец 2
KS0
K0
Resistorконец 1
конец 2
KS1
K1
Resistorконец 1
конец 2
KS2
K2
Resistorконец 1
конец 2
KS3
K3
74HC245DIR
OE
A0
A1
A2
A3
A4
A5
A6
A7
B0
B1
B2
B3
B4
B5
B6
B7
DIR
GND
BUS0
BUS1
BUS2
BUS3
UA4
UA5
UA6
UA7
K0
K1
K2
K3
UB4
UB5
UB6
UB7

Шаг 8. Незанятые ноги 74HC245 — через резисторы

У 74HC245 ноги A и B бывают и входами, и выходами: при DIR = 1 микросхема гонит B, при DIR = 0 — A. Выход прямо на GND — короткое замыкание (редактор подсветит). Поэтому незанятые A4–A7, B4–B7 — на землю через резистор: он держит 0, а когда нога становится выходом, спора нет.

ДетальНогаМетка
Resistorконец 1
конец 2
UA4
GND
Resistorконец 1
конец 2
UA5
GND
Resistorконец 1
конец 2
UA6
GND
Resistorконец 1
конец 2
UA7
GND
Resistorконец 1
конец 2
UB4
GND
Resistorконец 1
конец 2
UB5
GND
Resistorконец 1
конец 2
UB6
GND
Resistorконец 1
конец 2
UB7
GND

Шаг 9. Табло и лампы

Display (bus) ⚙: ширина 4, DEC, шина BUS. Лампы K0–K3 — то, что видит третье устройство.

ДетальНогаМетка
Display⚙ширина 4, DEC, шина BUS
LEDвходK0
LEDвходK1
LEDвходK2
LEDвходK3

6.5. Проверка

  1. Набери на тумблерах: X = 5 (X0 и X2), Y = 9 (Y0 и Y3), KS = 12 (KS2 и KS3). DIR = 1, OFF = 0.
  2. SEL = 0 — на табло шины 5, лампы K показывают 5: говорит X, третье устройство слушает.
  3. SEL = 1 — на шине 9: говорит Y.
  4. OFF = 1 — на шине 0: никто не говорит, резисторы тянут провода к земле.
  5. Не выключая OFF, поставь DIR = 0 — на шине 12: теперь говорит третье устройство, через 74HC245 в обратную сторону.

Главное правило шины: говорит только один. Если при DIR = 0 выключить OFF, на шину будут гнать двое — это короткое замыкание (в симуляторе провод станет красным). На настоящей плате так горят микросхемы.

Что видноЧто это
табло = X или Yговорит та четвёрка 74HC244, что включена
табло = 0никто не говорит — резисторы к земле
лампы K = шина74HC245 гонит A → B (DIR = 1)
табло = KS74HC245 гонит B → A (DIR = 0)

Вставка урока 6 (Cmd+I)

Поверх урока 5.

# Урок 6 — 74HC244 и 74HC245: буферы шины; общая шина на 4 провода — кто говорит, тот и на шине.# Вставка: Cmd+I поверх урока 5 (нужны 74HC00, 74HC04, 74HC32). # 74HC244 — 2 × 4 буфера с третьим состоянием, A → Y; 1OE, 2OE — включить свою четвёрку (активный 0). Ноги: 1 1OE, 2 1A0, 3 2Y0, 4 1A1, 5 2Y1, 6 1A2, 7 2Y2, 8 1A3, 9 2Y3, 11 2A3, 12 1Y3, 13 2A2, 14 1Y2, 15 2A1, 16 1Y1, 17 2A0, 18 1Y0, 19 2OEchip 74HC244 {  portIn(1OE)  portIn(1A0)  portIn(1A1)  portIn(1A2)  portIn(1A3)  portIn(2A3)  portIn(2A2)  portIn(2A1)  portIn(2A0)  portIn(2OE)  portOut(2Y0)  portOut(2Y1)  portOut(2Y2)  portOut(2Y3)  portOut(1Y3)  portOut(1Y2)  portOut(1Y1)  portOut(1Y0)  # буфер: каждый вход переворачивается дважды — выход сильный и только в одну сторону; три 74HC04 = 18 инверторов (16 + два OE)  74HC04(1A=1A0, 1Y=n1A0, 2A=1A1, 2Y=n1A1, 3A=1A2, 3Y=n1A2, 4Y=n1A3, 4A=1A3, 5Y=n2A0, 5A=2A0, 6Y=n2A1, 6A=2A1)  74HC04(1A=2A2, 1Y=n2A2, 2A=2A3, 2Y=n2A3, 3A=n1A0, 3Y=b1A0, 4Y=b1A1, 4A=n1A1, 5Y=b1A2, 5A=n1A2, 6Y=b1A3, 6A=n1A3)  74HC04(1A=n2A0, 1Y=b2A0, 2A=n2A1, 2Y=b2A1, 3A=n2A2, 3Y=b2A2, 4Y=b2A3, 4A=n2A3, 5Y=e1, 5A=1OE, 6Y=e2, 6A=2OE)  # ключи на выход: открыты, пока OE своей четвёрки = 0  tgate(b1A0, e1, 1Y0)  tgate(b1A1, e1, 1Y1)  tgate(b1A2, e1, 1Y2)  tgate(b1A3, e1, 1Y3)  tgate(b2A0, e2, 2Y0)  tgate(b2A1, e2, 2Y1)  tgate(b2A2, e2, 2Y2)  tgate(b2A3, e2, 2Y3)} # 74HC245 — 8 двунаправленных буферов: DIR = 1 — A → B, DIR = 0 — B → A; OE = 1 — отключено (активный 0). Ноги: 1 DIR, 2 A0, 3 A1, 4 A2, 5 A3, 6 A4, 7 A5, 8 A6, 9 A7, 11 B7, 12 B6, 13 B5, 14 B4, 15 B3, 16 B2, 17 B1, 18 B0, 19 OEchip 74HC245 {  portIn(DIR)  portIn(A0)  portIn(A1)  portIn(A2)  portIn(A3)  portIn(A4)  portIn(A5)  portIn(A6)  portIn(A7)  portIn(OE)  portOut(B7)  portOut(B6)  portOut(B5)  portOut(B4)  portOut(B3)  portOut(B2)  portOut(B1)  portOut(B0)  # какая сторона говорит: A → B, когда OE = 0 и DIR = 1; B → A, когда OE = 0 и DIR = 0. Выходы — «включить» для 74HC244 (активный 0)  74HC04(1A=OE, 1Y=nOE, 2A=DIR, 2Y=nDIR, 3A=GND, 4A=GND, 5A=GND, 6A=GND)  74HC00(1A=nOE, 1B=DIR, 1Y=oAB, 2A=nOE, 2B=nDIR, 2Y=oBA, 3A=GND, 3B=GND, 4A=GND, 4B=GND)  # две 74HC244: одна гонит A → B, другая B → A  74HC244(1OE=oAB, 2OE=oAB, 1A0=A0, 1Y0=B0, 1A1=A1, 1Y1=B1, 1A2=A2, 1Y2=B2, 1A3=A3, 1Y3=B3, 2A0=A4, 2Y0=B4, 2A1=A5, 2Y1=B5, 2A2=A6, 2Y2=B6, 2A3=A7, 2Y3=B7)  74HC244(1OE=oBA, 2OE=oBA, 1A0=B0, 1Y0=A0, 1A1=B1, 1Y1=A1, 1A2=B2, 1Y2=A2, 1A3=B3, 1Y3=A3, 2A0=B4, 2Y0=A4, 2A1=B5, 2Y1=A5, 2A2=B6, 2Y2=A6, 2A3=B7, 2Y3=A7)} # ---------- общая шина ----------# два устройства-источника: X и Y по 4 тумблераinput(X0)input(X1)input(X2)input(X3)input(Y0)input(Y1)input(Y2)input(Y3)# кто говорит: SEL = 0 — X, SEL = 1 — Y; OFF = 1 — никтоinput(SEL)input(OFF)74HC04(1A=SEL, 1Y=nSEL, 2A=GND, 3A=GND, 4A=GND, 5A=GND, 6A=GND)74HC32(1A=SEL, 1B=OFF, 1Y=oeX, 2A=nSEL, 2B=OFF, 2Y=oeY, 3A=GND, 3B=GND, 4A=GND, 4B=GND)# 74HC244: четвёрка 1 — X на шину, четвёрка 2 — Y на шину; выходы обеих — на одни провода BUS74HC244(1OE=oeX, 2OE=oeY, 1A0=X0, 1Y0=BUS0, 1A1=X1, 1Y1=BUS1, 1A2=X2, 1Y2=BUS2, 1A3=X3, 1Y3=BUS3, 2A0=Y0, 2Y0=BUS0, 2A1=Y1, 2Y1=BUS1, 2A2=Y2, 2Y2=BUS2, 2A3=Y3, 2Y3=BUS3)# резисторы к земле: никто не говорит — на шине 0resistor(BUS0, GND)resistor(BUS1, GND)resistor(BUS2, GND)resistor(BUS3, GND)# третье устройство через 74HC245: DIR = 1 — шина → лампы K, DIR = 0 — его тумблеры KS через резисторы → шинаinput(DIR)input(KS0)input(KS1)input(KS2)input(KS3)resistor(KS0, K0)resistor(KS1, K1)resistor(KS2, K2)resistor(KS3, K3)74HC245(DIR=DIR, OE=GND, A0=BUS0, A1=BUS1, A2=BUS2, A3=BUS3, A4=UA4, A5=UA5, A6=UA6, A7=UA7, B0=K0, B1=K1, B2=K2, B3=K3, B4=UB4, B5=UB5, B6=UB6, B7=UB7)# незанятые ноги 74HC245 бывают выходами (B при DIR = 1, A при DIR = 0) — на землю только через резистор, не напрямуюresistor(UA4, GND)resistor(UA5, GND)resistor(UA6, GND)resistor(UA7, GND)resistor(UB4, GND)resistor(UB5, GND)resistor(UB6, GND)resistor(UB7, GND)# табло шины и лампы третьего устройстваdisplay{bits=4, base="DEC", busSource="BUS"}()led(K0)led(K1)led(K2)led(K3)

Не получается? Что-то не работает →