Урок 5. Провод IO и тестер карт: эхо

В картинках

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


5.1. Идея: один провод на двоих

У карты всего 8 контактов, данные идут по одному — IO. Говорят по очереди:

  • кто молчит — отпускает провод, и резистор держит его в 1;
  • кто говорит — прижимает к 0 своим транзистором;
  • обычный выход тут не годится: он гонит и 0, и 1, и два таких на одном проводе — закоротка.

Такой выход — «только прижать» — называется открытый сток. Так устроена линия I/O настоящих карт.

картапрограмма: ST 29тестеркадр, регистрпровод IOVCCpullGNDTPULLGNDмолчат оба → резистор: 1один прижал → 0 (резистор слабее транзистора)обычный выход сюда нельзя: он гонит и 1 — закоротка
Открытый сток: и карта, и тестер умеют только прижать провод к 0 своим транзистором, а в 1 его держит резистор. Говорят по очереди — и никто никого не закорачивает. Так устроена линия I/O настоящих карт.

5.2. Идея: байт бит за битом

Кадр: старт-бит 0, 8 бит старшим вперёд, стоп-бит 1. Каждый бит держится 16 тактов.

  • Карта принимает и передаёт байт программой: каждая команда — один такт, петля на бит — ровно 16 команд;
  • тестер — железом: счётчик кадра и сдвиговый регистр, один на приём и передачу;
  • защитный интервал: отвечать можно только после стоп-бита собеседника. Без него ответ сдвигается на бит.
IOбиттишинастартb7b6b5b4b3b2b1b0стопкаждый бит — 16 тактов CLK65 = 0100 0001старшим вперёд
Байт 65 на проводе: провод в 1, старт-бит 0, восемь бит старшим вперёд, стоп-бит 1. Приёмник ловит спад старт-бита и читает каждый бит в его середине.

5.3. Идея: лампа «обмен — жди»

После посылки карте нужно время подумать. Тестер держит паузу и горит лампой lamp. Пока горит — жди, кнопка SEND не действует. Погасла — обмен окончен, смотри ответ.

5.4. Сборка

Тот же проект, что в уроке 4.

Сторона карты — маленькая: регистр OUT и транзистор, всё остальное делает программа. Сторона терминала — переходник: тумблеры → «послать» → провод → ответ на лампах. Потом он станет портом банкомата.

Шаг 1. Такт — быстрее

Байт по проводу — 10 бит по 16 тактов = 160 тактов. На 2Hz это полторы минуты, поэтому клик по корпусу Clock — до MAX. Огоньки и табло дальше будут мелькать — так и должно быть.

Шаг 2. Порт IO карты

Команда ST 29 (адрес $1D) кладёт бит 0 из A в регистр OUT. OUT = 1 — транзистор прижимает провод IO к 0, OUT = 0 — отпускает. Читает провод команда LD 28 ($1C) — это AND(IO, selIO) из урока 3. Сама карта провод в 1 не тянет: подтяжка — у терминала (резистор переходника).

ДетальНогаМетка
ANDI0
I1
O0
oST
selIO
wOUT
RBITD
LD
nR
CLK
Q
acc0
wOUT
nR
CLK
pull
nmosзатвор
сток
исток
pull
IO
GND

Шаг 3. Переходник: подтяжка линии и пульт

Ставь переходник отдельной группой справа от карты, туда же перенеси Clock и тумблер RST: в уроке 8 карту выделишь рамкой целиком и свернёшь в чип, а они останутся снаружи. Переходник — сторона терминала, другое устройство на том же такте CLK. Поэтому у него свой NOT(RST) — nRT. Резистор держит провод IO в 1, пока никто не прижимает; свой транзистор TPULL — как у карты. Тумблеры T0–T7 — байт, кнопка SEND — «послать».

ДетальНогаМетка
NOTI0
O0
RST
nRT
Resistorконец 1
конец 2
VCC
IO
nmosзатвор
сток
исток
TPULL
IO
GND
Input (тумблер)выходT0
Input (тумблер)выходT1
Input (тумблер)выходT2
Input (тумблер)выходT3
Input (тумблер)выходT4
Input (тумблер)выходT5
Input (тумблер)выходT6
Input (тумблер)выходT7
Button (кнопка)выходSEND

Шаг 4. Кнопка: новое нажатие и старт

sendS — кнопка, защёлкнутая тактом; sendP — она же тактом раньше. Нажатие = sendS и не sendP: ровно один такт, сколько ни держи. Старт передачи goTX — только когда переходник свободен (free, лампа «обмен» не горит); старт приёма goRX — не занят и провод упал в 0 (карта начала говорить).

ДетальНогаМетка
DFFD
CLK
Q
SEND
CLK
sendS
DFFD
CLK
Q
sendS
CLK
sendP
NOTI0
O0
sendP
nSendP
ORI0
I1
O0
TXB
RXB
busy
NOTI0
O0
busy
idle
AND3A
B
C
Y
sendS
nSendP
free
goTX
NOTI0
O0
IO
ioLow
ANDI0
I1
O0
ioLow
idle
goRX

Шаг 5. Счётчик кадра

Пока занят — счётчик cn шагает +1 каждый такт, иначе стоит в 0. Старшие 4 бита — номер бита кадра (0 старт, 1–8 данные, 9 стоп), младшие — такт внутри бита (0–15). Бит 0 при +1 просто переворачивается — это nc0, тот же NOT, что нужен ниже для номера такта: второй не ставим.

ДетальНогаМетка
HAA
B
S
C
cn1
cn0
ci1
cc2
HAA
B
S
C
cn2
cc2
ci2
cc3
HAA
B
S
C
cn3
cc3
ci3
cc4
HAA
B
S
C
cn4
cc4
ci4
cc5
HAA
B
S
C
cn5
cc5
ci5
cc6
HAA
B
S
C
cn6
cc6
ci6
cc7
HAA
B
S
C
cn7
cc7
ci7
cc8
ORI0
I1
O0
busy
WTB
lamp
NOTI0
O0
lamp
free
OR3A
B
C
Y
eTX
eRX
goRX
cz
NOTI0
O0
cz
ncz
AND3A
B
C
Y
lamp
nRT
ncz
cntOn
ANDI0
I1
O0
nc0
cntOn
cd0
ANDI0
I1
O0
ci1
cntOn
cd1
ANDI0
I1
O0
ci2
cntOn
cd2
ANDI0
I1
O0
ci3
cntOn
cd3
ANDI0
I1
O0
ci4
cntOn
cd4
ANDI0
I1
O0
ci5
cntOn
cd5
ANDI0
I1
O0
ci6
cntOn
cd6
ANDI0
I1
O0
ci7
cntOn
cd7
DFFD
CLK
Q
cd0
CLK
cn0
DFFD
CLK
Q
cd1
CLK
cn1
DFFD
CLK
Q
cd2
CLK
cn2
DFFD
CLK
Q
cd3
CLK
cn3
DFFD
CLK
Q
cd4
CLK
cn4
DFFD
CLK
Q
cd5
CLK
cn5
DFFD
CLK
Q
cd6
CLK
cn6
DFFD
CLK
Q
cd7
CLK
cn7
NOTI0
O0
cn0
nc0
NOTI0
O0
cn1
nc1
NOTI0
O0
cn2
nc2
NOTI0
O0
cn3
nc3
NOTI0
O0
cn4
nc4
NOTI0
O0
cn5
nc5
NOTI0
O0
cn6
nc6
NOTI0
O0
cn7
nc7

Шаг 6. Номер бита и конец кадра

ph0, ph9 — бит 0 и бит 9; inData — биты данных; sub15, sub7 — последний и средний такт бита. Передача (TXB) кончается на последнем такте стоп-бита, приём (RXB) — в середине стоп-бита.

ДетальНогаМетка
AND4A
B
C
D
Y
nc4
nc5
nc6
nc7
ph0
AND4A
B
C
D
Y
cn4
nc5
nc6
cn7
ph9
NORI0
I1
O0
ph0
ph9
inData
AND4A
B
C
D
Y
cn0
cn1
cn2
cn3
sub15
AND4A
B
C
D
Y
cn0
cn1
cn2
nc3
sub7
ANDI0
I1
O0
ph9
sub15
endTX
ANDI0
I1
O0
ph9
sub7
endRX
NOTI0
O0
endTX
nEndTX
NOTI0
O0
endRX
nEndRX
ANDI0
I1
O0
TXB
nEndTX
txKeep
ORI0
I1
O0
goTX
txKeep
txN
ANDI0
I1
O0
txN
nRT
txD
DFFD
CLK
Q
txD
CLK
TXB
ANDI0
I1
O0
RXB
nEndRX
rxKeep
ORI0
I1
O0
goRX
rxKeep
rxN
ANDI0
I1
O0
rxN
nRT
rxD
DFFD
CLK
Q
rxD
CLK
RXB

Шаг 7. Сдвиговый регистр

Один регистр на приём и передачу: линия всё равно в одну сторону за раз. Старт передачи — взять тумблеры; дальше сдвиг влево: при передаче — в конце бита, при приёме — в середине, снизу входит бит линии (bitIn).

ДетальНогаМетка
AND3A
B
C
Y
TXB
inData
sub15
shTX
AND3A
B
C
Y
RXB
inData
sub7
shRX
ORI0
I1
O0
shTX
shRX
sh
ANDI0
I1
O0
RXB
IO
bitIn
MUX2A
B
S
Y
sr0
bitIn
sh
sa0
MUX2A
B
S
Y
sr1
sr0
sh
sa1
MUX2A
B
S
Y
sr2
sr1
sh
sa2
MUX2A
B
S
Y
sr3
sr2
sh
sa3
MUX2A
B
S
Y
sr4
sr3
sh
sa4
MUX2A
B
S
Y
sr5
sr4
sh
sa5
MUX2A
B
S
Y
sr6
sr5
sh
sa6
MUX2A
B
S
Y
sr7
sr6
sh
sa7
MUX2A
B
S
Y
sa0
T0
goTX
sb0
MUX2A
B
S
Y
sa1
T1
goTX
sb1
MUX2A
B
S
Y
sa2
T2
goTX
sb2
MUX2A
B
S
Y
sa3
T3
goTX
sb3
MUX2A
B
S
Y
sa4
T4
goTX
sb4
MUX2A
B
S
Y
sa5
T5
goTX
sb5
MUX2A
B
S
Y
sa6
T6
goTX
sb6
MUX2A
B
S
Y
sa7
T7
goTX
sb7
DFFD
CLK
Q
sb0
CLK
sr0
DFFD
CLK
Q
sb1
CLK
sr1
DFFD
CLK
Q
sb2
CLK
sr2
DFFD
CLK
Q
sb3
CLK
sr3
DFFD
CLK
Q
sb4
CLK
sr4
DFFD
CLK
Q
sb5
CLK
sr5
DFFD
CLK
Q
sb6
CLK
sr6
DFFD
CLK
Q
sb7
CLK
sr7

Шаг 8. Линия, лампы и табло

Передача: старт-бит — прижать, бит данных 0 — прижать (старший бит регистра), стоп — отпустить. Лампы и табло — регистр: после приёма там ответ карты, на табло — сразу числом.

ДетальНогаМетка
NOTI0
O0
sr7
nsr7
ANDI0
I1
O0
inData
nsr7
d0
ORI0
I1
O0
ph0
d0
pl
ANDI0
I1
O0
TXB
pl
TPULL
LEDвходsr7
LEDвходsr6
LEDвходsr5
LEDвходsr4
LEDвходsr3
LEDвходsr2
LEDвходsr1
LEDвходsr0
Display⚙ширина 8, DEC, шина sr

Шаг 9. Лампа «обмен — жди»

Пока идёт обмен, лампа lamp горит — жди. После своей посылки переходник ещё 256 тактов ждёт ответа (WTB): карте нужно время подумать. Начала отвечать — принимаем; не начала (команда из нескольких байт, карта ждёт следующий) — пауза кончилась, лампа гаснет. После ответа — такая же пауза, пока карта договорит. Лампа погасла — можно следующее действие; пока горит, SEND не действует. lamp = занят или ждёт (OR), free — наоборот; счётчик кадра идёт и в паузе (cntOn), а на конце кадра и на старте приёма начинает с нуля (cz). eTX, eRX — конец кадра, только пока он идёт: в паузе счётчик тоже проходит 151 и 159, но это не конец.

ДетальНогаМетка
ANDI0
I1
O0
TXB
endTX
eTX
ANDI0
I1
O0
RXB
endRX
eRX
AND4A
B
C
D
Y
cn4
cn5
cn6
cn7
hi15
ANDI0
I1
O0
sub15
hi15
c255
NOTI0
O0
c255
nc255
ANDI0
I1
O0
WTB
nc255
wKeep
OR3A
B
C
Y
eTX
eRX
wKeep
wN
NOTI0
O0
goRX
nGoRX
AND3A
B
C
Y
wN
nGoRX
nRT
wD
DFFD
CLK
Q
wD
CLK
WTB
LEDвходlamp

Шаг 10. Программа в ПЗУ

⚙ у ROM → кнопка ⬆ → файл 05-echo.rom.json. Главное в ней — приём и передача байта программой: каждая команда — один такт, поэтому петля на бит — ровно 16 команд (лишние такты — NOP, пустая команда). Это те же rx и tx, что будут в программе карты.

; Урок 5 — эхо по одному проводу: карта принимает байт по IO и отвечает им же + 1.; Приём и передачу делает программа: бит за битом, ровно 16 тактов на бит (каждая команда — один такт).; --- ОЗУ (8 байт) ---.equ B    $00      ; байт: принимаемый / отправляемый.equ N    $01      ; счётчик бит.equ D    $02      ; счётчик задержки.equ H    $03      ; первый байт аргумента / старший байт шифра.equ L    $04      ; второй байт аргумента / младший байт шифра.equ OK   $05      ; 1 = ПИН верен в этом сеансе; --- постоянная память (на транзисторах) ---.equ ACC  $10      ; номер счёта.equ PINH $11      ; ПИН, цифры 1–2.equ PINL $12      ; ПИН, цифры 3–4.equ K0   $13      ; ключ, 4 байта.equ K1   $14.equ K2   $15.equ K3   $16; --- регистр попыток и порт ---.equ TRY  $18      ; неверные попытки подряд (3 = заблокирована).equ IN   $1C      ; бит 0 = линия IO.equ OUT  $1D      ; бит 0 = 1 → прижать линию к 0 start:  LD #0        ST OUT           ; линию отпустить        ST B             ; ОЗУ при включении — мусор: ячейку B сначала записать, потом читать (rx её сдвигает)loop:   CALL rx          ; принять байт → B        LD B        ADD #1        ST B             ; B + 1        CALL tx          ; отправить B        JMP loop ; --- приём байта: ждать старт-бит, потом 8 бит старшим вперёд, по одному каждые 16 тактов ---rx:     LD IN        AND #1        JNZ rx           ; линия 1 — ждём        LD #8        ST N        .rept 10         ; дойти до середины первого бита        NOP        .endrrxbit:  NOP        NOP        NOP        NOP        NOP        LD B        ADD B            ; B сдвинуть влево        ST B        LD IN            ; ← здесь читаем бит        AND #1        ADD B        ST B        LD N        SUB #1        ST N        JNZ rxbit        ; петля — ровно 16 тактов        LD #6        ST Drxg:    LD D             ; защита: переждать стоп-бит терминала (2 + 6 × 4 = 26 тактов)        SUB #1        ST D        JNZ rxg        RET ; --- передача байта B: старт 0, 8 бит старшим вперёд, стоп 1 ---tx:     LD #1        ST OUT           ; старт-бит        .rept 7        NOP        .endr        LD #8        ST Ntxbit:  LD B        ADD B            ; старший бит → C        ST B        LD #0        ADC #0           ; A = C        XOR #1           ; бит 1 → не прижимать, 0 → прижать        ST OUT           ; ← здесь бит выходит на линию        NOP        NOP        NOP        NOP        NOP        LD N        SUB #1        ST N        JNZ txbit        ; петля — ровно 16 тактов        NOP        NOP        NOP        NOP        NOP        LD #0        ST OUT           ; стоп-бит        LD #8        ST Ddly:    LD D             ; защитный интервал: 2 + 8 × 4 = 34 такта        SUB #1        ST D        JNZ dly        RET

5.5. Проверка

Иди по строкам сверху вниз: одна строка — одно действие. После SEND жди, пока погаснет лампа «обмен» (lamp), и сравни с колонкой «Лампы»: карта прибавила к твоему числу 1 и прислала обратно.

№Что сделатьЛампы (● горит)Что это
1Clock — MAX (клик по корпусу)
2RST включить и выключить
3тумблеры T7…T0 = 0100 0001, нажать SEND○●○○○○●○ 6665 + 1 = 66
4тумблеры T7…T0 = 0000 0000, нажать SEND○○○○○○○● 10 + 1 = 1
5тумблеры T7…T0 = 1111 1111, нажать SEND○○○○○○○○ 0255 + 1 = 0 (8 бит: 256 → 0)
6тумблеры T7…T0 = 1010 0101, нажать SEND●○●○○●●○ 166165 + 1 = 166
7тумблеры T7…T0 = 0111 1111, нажать SEND●○○○○○○○ 128127 + 1 = 128
  • Пока горит лампа «обмен», лампы sr мигают: регистр выталкивает тумблеры в провод, а с другого конца вдвигается ответ. Погасла — обмен окончен, можно следующее.
  • Ничего не меняется — проверь подтяжку: Resistor между VCC и IO; без неё провод в Real «плавает» (оранжевый).
  • Память при включении — мусор (в Real незаписанные защёлки оранжевые, Z). Поэтому программа первым делом пишет ячейку B (ST B) и только потом её читает. Забыть — и в Real A станет оранжевым на первом же ADD B.
  • В Real до первой посылки лампы переходника оранжевые: регистр sr без сброса и ещё ничего не запомнил. После первого SEND — нормальные.

В чип не сворачивать. Переходник оставь на холсте рядом — в уроке 8 карта уйдёт в чип, а он останется снаружи.

⚠ Частые ошибки. (1) Нет AND → txD: триггер TXB «плавает», оранжевеет весь тестер, а за ним провод и карта. (2) Выходы регистра подписаны не sr, а иначе — лампы и линия не видят регистр. (3) В Real лампы тестера оранжевые до первой посылки — это нормально: регистр без сброса.

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

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

# Урок 5 — провод IO: порт карты (OUT + транзистор) и переходник «байт ↔ провод» (сторона терминала).# Вставка: Cmd+I поверх урока 4. Потом: Clock — MAX; ПЗУ — загрузить 05-echo.rom.json (⬆ в ROM). # ---------- Порт IO карты ----------AND(oST, selIO, wOUT)RBIT(D=acc0, LD=wOUT, nR=nR, CLK=CLK, Q=pull)nmos(pull, IO, GND) # ---------- Переходник: подтяжка линии и пульт ----------NOT(RST, nRT)resistor(VCC, IO)nmos(TPULL, IO, GND)input(Out=T0)input(Out=T1)input(Out=T2)input(Out=T3)input(Out=T4)input(Out=T5)input(Out=T6)input(Out=T7)button(Out=SEND) # ---------- Кнопка: новое нажатие и старт ----------DFF(D=SEND, CLK=CLK, Q=sendS)DFF(D=sendS, CLK=CLK, Q=sendP)NOT(sendP, nSendP)OR(TXB, RXB, busy)NOT(busy, idle)AND3(A=sendS, B=nSendP, C=free, Y=goTX)NOT(IO, ioLow)AND(ioLow, idle, goRX) # ---------- Счётчик кадра ----------HA(A=cn1, B=cn0, S=ci1, C=cc2)HA(A=cn2, B=cc2, S=ci2, C=cc3)HA(A=cn3, B=cc3, S=ci3, C=cc4)HA(A=cn4, B=cc4, S=ci4, C=cc5)HA(A=cn5, B=cc5, S=ci5, C=cc6)HA(A=cn6, B=cc6, S=ci6, C=cc7)HA(A=cn7, B=cc7, S=ci7, C=cc8)OR(busy, WTB, lamp)NOT(lamp, free)OR3(A=eTX, B=eRX, C=goRX, Y=cz)NOT(cz, ncz)AND3(A=lamp, B=nRT, C=ncz, Y=cntOn)AND(nc0, cntOn, cd0)AND(ci1, cntOn, cd1)AND(ci2, cntOn, cd2)AND(ci3, cntOn, cd3)AND(ci4, cntOn, cd4)AND(ci5, cntOn, cd5)AND(ci6, cntOn, cd6)AND(ci7, cntOn, cd7)DFF(D=cd0, CLK=CLK, Q=cn0)DFF(D=cd1, CLK=CLK, Q=cn1)DFF(D=cd2, CLK=CLK, Q=cn2)DFF(D=cd3, CLK=CLK, Q=cn3)DFF(D=cd4, CLK=CLK, Q=cn4)DFF(D=cd5, CLK=CLK, Q=cn5)DFF(D=cd6, CLK=CLK, Q=cn6)DFF(D=cd7, CLK=CLK, Q=cn7)NOT(cn0, nc0)NOT(cn1, nc1)NOT(cn2, nc2)NOT(cn3, nc3)NOT(cn4, nc4)NOT(cn5, nc5)NOT(cn6, nc6)NOT(cn7, nc7) # ---------- Номер бита и конец кадра ----------AND4(A=nc4, B=nc5, C=nc6, D=nc7, Y=ph0)AND4(A=cn4, B=nc5, C=nc6, D=cn7, Y=ph9)NOR(ph0, ph9, inData)AND4(A=cn0, B=cn1, C=cn2, D=cn3, Y=sub15)AND4(A=cn0, B=cn1, C=cn2, D=nc3, Y=sub7)AND(ph9, sub15, endTX)AND(ph9, sub7, endRX)NOT(endTX, nEndTX)NOT(endRX, nEndRX)AND(TXB, nEndTX, txKeep)OR(goTX, txKeep, txN)AND(txN, nRT, txD)DFF(D=txD, CLK=CLK, Q=TXB)AND(RXB, nEndRX, rxKeep)OR(goRX, rxKeep, rxN)AND(rxN, nRT, rxD)DFF(D=rxD, CLK=CLK, Q=RXB) # ---------- Сдвиговый регистр ----------AND3(A=TXB, B=inData, C=sub15, Y=shTX)AND3(A=RXB, B=inData, C=sub7, Y=shRX)OR(shTX, shRX, sh)AND(RXB, IO, bitIn)MUX2(A=sr0, B=bitIn, S=sh, Y=sa0)MUX2(A=sr1, B=sr0, S=sh, Y=sa1)MUX2(A=sr2, B=sr1, S=sh, Y=sa2)MUX2(A=sr3, B=sr2, S=sh, Y=sa3)MUX2(A=sr4, B=sr3, S=sh, Y=sa4)MUX2(A=sr5, B=sr4, S=sh, Y=sa5)MUX2(A=sr6, B=sr5, S=sh, Y=sa6)MUX2(A=sr7, B=sr6, S=sh, Y=sa7)MUX2(A=sa0, B=T0, S=goTX, Y=sb0)MUX2(A=sa1, B=T1, S=goTX, Y=sb1)MUX2(A=sa2, B=T2, S=goTX, Y=sb2)MUX2(A=sa3, B=T3, S=goTX, Y=sb3)MUX2(A=sa4, B=T4, S=goTX, Y=sb4)MUX2(A=sa5, B=T5, S=goTX, Y=sb5)MUX2(A=sa6, B=T6, S=goTX, Y=sb6)MUX2(A=sa7, B=T7, S=goTX, Y=sb7)DFF(D=sb0, CLK=CLK, Q=sr0)DFF(D=sb1, CLK=CLK, Q=sr1)DFF(D=sb2, CLK=CLK, Q=sr2)DFF(D=sb3, CLK=CLK, Q=sr3)DFF(D=sb4, CLK=CLK, Q=sr4)DFF(D=sb5, CLK=CLK, Q=sr5)DFF(D=sb6, CLK=CLK, Q=sr6)DFF(D=sb7, CLK=CLK, Q=sr7) # ---------- Линия, лампы и табло ----------NOT(sr7, nsr7)AND(inData, nsr7, d0)OR(ph0, d0, pl)AND(TXB, pl, TPULL)led(sr7)led(sr6)led(sr5)led(sr4)led(sr3)led(sr2)led(sr1)led(sr0)display{bits=8, base="DEC", busSource="sr"}() # ---------- Лампа «обмен — жди» ----------AND(TXB, endTX, eTX)AND(RXB, endRX, eRX)AND4(A=cn4, B=cn5, C=cn6, D=cn7, Y=hi15)AND(sub15, hi15, c255)NOT(c255, nc255)AND(WTB, nc255, wKeep)OR3(A=eTX, B=eRX, C=wKeep, Y=wN)NOT(goRX, nGoRX)AND3(A=wN, B=nGoRX, C=nRT, Y=wD)DFF(D=wD, CLK=CLK, Q=WTB)led(lamp)

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