Урок 5. Провод IO и тестер карт: эхо
В картинкахПосле этого урока карта разговаривает по одному проводу. Ставишь на тумблерах число, нажимаешь «послать» — и через долю секунды на табло ответ карты: твоё число плюс один. Байт ушёл по проводу, карта его прочитала и прислала обратно.
5.1. Идея: один провод на двоих
У карты всего 8 контактов, данные идут по одному — IO. Говорят по очереди:
- кто молчит — отпускает провод, и резистор держит его в 1;
- кто говорит — прижимает к 0 своим транзистором;
- обычный выход тут не годится: он гонит и 0, и 1, и два таких на одном проводе — закоротка.
Такой выход — «только прижать» — называется открытый сток. Так устроена линия I/O настоящих карт.
5.2. Идея: байт бит за битом
Кадр: старт-бит 0, 8 бит старшим вперёд, стоп-бит 1. Каждый бит держится 16 тактов.
- Карта принимает и передаёт байт программой: каждая команда — один такт, петля на бит — ровно 16 команд;
- тестер — железом: счётчик кадра и сдвиговый регистр, один на приём и передачу;
- защитный интервал: отвечать можно только после стоп-бита собеседника. Без него ответ сдвигается на бит.
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 не тянет: подтяжка — у терминала (резистор переходника).
| Деталь | Нога | Метка |
|---|---|---|
| AND | I0 I1 O0 | oST selIO wOUT |
| RBIT | D 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 — «послать».
| Деталь | Нога | Метка |
|---|---|---|
| NOT | I0 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 (карта начала говорить).
| Деталь | Нога | Метка |
|---|---|---|
| DFF | D CLK Q | SEND CLK sendS |
| DFF | D CLK Q | sendS CLK sendP |
| NOT | I0 O0 | sendP nSendP |
| OR | I0 I1 O0 | TXB RXB busy |
| NOT | I0 O0 | busy idle |
| AND3 | A B C Y | sendS nSendP free goTX |
| NOT | I0 O0 | IO ioLow |
| AND | I0 I1 O0 | ioLow idle goRX |
Шаг 5. Счётчик кадра
Пока занят — счётчик cn шагает +1 каждый такт, иначе стоит в 0. Старшие 4 бита — номер бита кадра (0 старт, 1–8 данные, 9 стоп), младшие — такт внутри бита (0–15). Бит 0 при +1 просто переворачивается — это nc0, тот же NOT, что нужен ниже для номера такта: второй не ставим.
| Деталь | Нога | Метка |
|---|---|---|
| HA | A B S C | cn1 cn0 ci1 cc2 |
| HA | A B S C | cn2 cc2 ci2 cc3 |
| HA | A B S C | cn3 cc3 ci3 cc4 |
| HA | A B S C | cn4 cc4 ci4 cc5 |
| HA | A B S C | cn5 cc5 ci5 cc6 |
| HA | A B S C | cn6 cc6 ci6 cc7 |
| HA | A B S C | cn7 cc7 ci7 cc8 |
| OR | I0 I1 O0 | busy WTB lamp |
| NOT | I0 O0 | lamp free |
| OR3 | A B C Y | eTX eRX goRX cz |
| NOT | I0 O0 | cz ncz |
| AND3 | A B C Y | lamp nRT ncz cntOn |
| AND | I0 I1 O0 | nc0 cntOn cd0 |
| AND | I0 I1 O0 | ci1 cntOn cd1 |
| AND | I0 I1 O0 | ci2 cntOn cd2 |
| AND | I0 I1 O0 | ci3 cntOn cd3 |
| AND | I0 I1 O0 | ci4 cntOn cd4 |
| AND | I0 I1 O0 | ci5 cntOn cd5 |
| AND | I0 I1 O0 | ci6 cntOn cd6 |
| AND | I0 I1 O0 | ci7 cntOn cd7 |
| DFF | D CLK Q | cd0 CLK cn0 |
| DFF | D CLK Q | cd1 CLK cn1 |
| DFF | D CLK Q | cd2 CLK cn2 |
| DFF | D CLK Q | cd3 CLK cn3 |
| DFF | D CLK Q | cd4 CLK cn4 |
| DFF | D CLK Q | cd5 CLK cn5 |
| DFF | D CLK Q | cd6 CLK cn6 |
| DFF | D CLK Q | cd7 CLK cn7 |
| NOT | I0 O0 | cn0 nc0 |
| NOT | I0 O0 | cn1 nc1 |
| NOT | I0 O0 | cn2 nc2 |
| NOT | I0 O0 | cn3 nc3 |
| NOT | I0 O0 | cn4 nc4 |
| NOT | I0 O0 | cn5 nc5 |
| NOT | I0 O0 | cn6 nc6 |
| NOT | I0 O0 | cn7 nc7 |
Шаг 6. Номер бита и конец кадра
ph0, ph9 — бит 0 и бит 9; inData — биты данных; sub15, sub7 — последний и средний такт бита. Передача (TXB) кончается на последнем такте стоп-бита, приём (RXB) — в середине стоп-бита.
| Деталь | Нога | Метка |
|---|---|---|
| AND4 | A B C D Y | nc4 nc5 nc6 nc7 ph0 |
| AND4 | A B C D Y | cn4 nc5 nc6 cn7 ph9 |
| NOR | I0 I1 O0 | ph0 ph9 inData |
| AND4 | A B C D Y | cn0 cn1 cn2 cn3 sub15 |
| AND4 | A B C D Y | cn0 cn1 cn2 nc3 sub7 |
| AND | I0 I1 O0 | ph9 sub15 endTX |
| AND | I0 I1 O0 | ph9 sub7 endRX |
| NOT | I0 O0 | endTX nEndTX |
| NOT | I0 O0 | endRX nEndRX |
| AND | I0 I1 O0 | TXB nEndTX txKeep |
| OR | I0 I1 O0 | goTX txKeep txN |
| AND | I0 I1 O0 | txN nRT txD |
| DFF | D CLK Q | txD CLK TXB |
| AND | I0 I1 O0 | RXB nEndRX rxKeep |
| OR | I0 I1 O0 | goRX rxKeep rxN |
| AND | I0 I1 O0 | rxN nRT rxD |
| DFF | D CLK Q | rxD CLK RXB |
Шаг 7. Сдвиговый регистр
Один регистр на приём и передачу: линия всё равно в одну сторону за раз. Старт передачи — взять тумблеры; дальше сдвиг влево: при передаче — в конце бита, при приёме — в середине, снизу входит бит линии (bitIn).
| Деталь | Нога | Метка |
|---|---|---|
| AND3 | A B C Y | TXB inData sub15 shTX |
| AND3 | A B C Y | RXB inData sub7 shRX |
| OR | I0 I1 O0 | shTX shRX sh |
| AND | I0 I1 O0 | RXB IO bitIn |
| MUX2 | A B S Y | sr0 bitIn sh sa0 |
| MUX2 | A B S Y | sr1 sr0 sh sa1 |
| MUX2 | A B S Y | sr2 sr1 sh sa2 |
| MUX2 | A B S Y | sr3 sr2 sh sa3 |
| MUX2 | A B S Y | sr4 sr3 sh sa4 |
| MUX2 | A B S Y | sr5 sr4 sh sa5 |
| MUX2 | A B S Y | sr6 sr5 sh sa6 |
| MUX2 | A B S Y | sr7 sr6 sh sa7 |
| MUX2 | A B S Y | sa0 T0 goTX sb0 |
| MUX2 | A B S Y | sa1 T1 goTX sb1 |
| MUX2 | A B S Y | sa2 T2 goTX sb2 |
| MUX2 | A B S Y | sa3 T3 goTX sb3 |
| MUX2 | A B S Y | sa4 T4 goTX sb4 |
| MUX2 | A B S Y | sa5 T5 goTX sb5 |
| MUX2 | A B S Y | sa6 T6 goTX sb6 |
| MUX2 | A B S Y | sa7 T7 goTX sb7 |
| DFF | D CLK Q | sb0 CLK sr0 |
| DFF | D CLK Q | sb1 CLK sr1 |
| DFF | D CLK Q | sb2 CLK sr2 |
| DFF | D CLK Q | sb3 CLK sr3 |
| DFF | D CLK Q | sb4 CLK sr4 |
| DFF | D CLK Q | sb5 CLK sr5 |
| DFF | D CLK Q | sb6 CLK sr6 |
| DFF | D CLK Q | sb7 CLK sr7 |
Шаг 8. Линия, лампы и табло
Передача: старт-бит — прижать, бит данных 0 — прижать (старший бит регистра), стоп — отпустить. Лампы и табло — регистр: после приёма там ответ карты, на табло — сразу числом.
| Деталь | Нога | Метка |
|---|---|---|
| NOT | I0 O0 | sr7 nsr7 |
| AND | I0 I1 O0 | inData nsr7 d0 |
| OR | I0 I1 O0 | ph0 d0 pl |
| AND | I0 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, но это не конец.
| Деталь | Нога | Метка |
|---|---|---|
| AND | I0 I1 O0 | TXB endTX eTX |
| AND | I0 I1 O0 | RXB endRX eRX |
| AND4 | A B C D Y | cn4 cn5 cn6 cn7 hi15 |
| AND | I0 I1 O0 | sub15 hi15 c255 |
| NOT | I0 O0 | c255 nc255 |
| AND | I0 I1 O0 | WTB nc255 wKeep |
| OR3 | A B C Y | eTX eRX wKeep wN |
| NOT | I0 O0 | goRX nGoRX |
| AND3 | A B C Y | wN nGoRX nRT wD |
| DFF | D 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 RET5.5. Проверка
Иди по строкам сверху вниз: одна строка — одно действие. После SEND жди, пока погаснет лампа «обмен» (lamp), и сравни с колонкой «Лампы»: карта прибавила к твоему числу 1 и прислала обратно.
| № | Что сделать | Лампы (● горит) | Что это |
|---|---|---|---|
| 1 | Clock — MAX (клик по корпусу) | ||
| 2 | RST включить и выключить | ||
| 3 | тумблеры T7…T0 = 0100 0001, нажать SEND | ○●○○○○●○ 66 | 65 + 1 = 66 |
| 4 | тумблеры T7…T0 = 0000 0000, нажать SEND | ○○○○○○○● 1 | 0 + 1 = 1 |
| 5 | тумблеры T7…T0 = 1111 1111, нажать SEND | ○○○○○○○○ 0 | 255 + 1 = 0 (8 бит: 256 → 0) |
| 6 | тумблеры T7…T0 = 1010 0101, нажать SEND | ●○●○○●●○ 166 | 165 + 1 = 166 |
| 7 | тумблеры T7…T0 = 0111 1111, нажать SEND | ●○○○○○○○ 128 | 127 + 1 = 128 |
- Пока горит лампа «обмен», лампы
srмигают: регистр выталкивает тумблеры в провод, а с другого конца вдвигается ответ. Погасла — обмен окончен, можно следующее. - Ничего не меняется — проверь подтяжку:
ResistorмеждуVCCиIO; без неё провод в Real «плавает» (оранжевый). - Память при включении — мусор (в Real незаписанные защёлки оранжевые, Z). Поэтому программа первым делом пишет ячейку
B(ST B) и только потом её читает. Забыть — и в RealAстанет оранжевым на первом же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)Не получается? Что-то не работает →