Урок 3. ОЗУ на защёлках: огонёк через память
В картинкахПосле этого урока у процессора появится память — 8 ячеек по 8 бит из транзисторов. И сразу видно, зачем она: огонёк бежит программой из пяти команд, потому что процессор умеет прибавить к A ячейку памяти.
3.1. Идея: адрес — в команде
ST 3 кладёт A в ячейку 3, LD 3 достаёт, ADD 3 прибавляет ячейку к A. Номер ячейки — в младших битах команды, как число у LD #5, только ir11 = 0. Адреса делятся на области:
- 0–7 — ОЗУ;
- 16–23 — постоянная память (личные данные карты, урок 6);
- 24 — счётчик попыток ПИН (урок 6), 28–29 — провод данных (урок 5).
Строку внутри области выбирает дешифратор DEC8 — один на ОЗУ и постоянную память.
3.2. Идея: защёлка пишет, пока открыта
Ячейка ОЗУ — 8 защёлок. Защёлка запоминает, пока открыта, поэтому открывать её можно только когда адрес и A устоялись. Такт делится на две половины: CLK = 1 — считать, CLK = 0 — записать. Окно записи weRAM открыто во второй половине и закрывается самим фронтом CLK — раньше, чем сменится PC.
3.3. Идея: память при включении — мусор
Защёлки при включении ничего не помнят: в Real они «плавают» (оранжевые). Поэтому программа сначала пишет ячейку и только потом читает. Так и в настоящих компьютерах: память после включения надо заполнить.
3.4. Сборка
Тот же проект, что в уроке 2.
ОЗУ собираем на защёлках: строка из 8 защёлок на каждую ячейку. Чтение — всегда (выбранная строка отдаёт хранимое), запись — только командой ST и только во второй половине такта.
Шаг 1. Чип AND3 — И на 3 входа
Если AND3 уже есть в библиотеке (из «Часов и игры») — шаг пропусти.
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | A |
| Порт входа | выход | B |
| Порт входа | выход | C |
| Порт выхода | вход | Y |
| AND | I0 I1 O0 | A B ab |
| AND | I0 I1 O0 | ab C Y |
Ctrl+G → имя AND3. Ноги: входы A, B, C; выходы Y.
Шаг 2. Чип DEC8 — дешифратор 3 → 8: горит ровно один провод
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | I0 |
| Порт входа | выход | I1 |
| Порт входа | выход | I2 |
| Порт выхода | вход | Y0 |
| Порт выхода | вход | Y1 |
| Порт выхода | вход | Y2 |
| Порт выхода | вход | Y3 |
| Порт выхода | вход | Y4 |
| Порт выхода | вход | Y5 |
| Порт выхода | вход | Y6 |
| Порт выхода | вход | Y7 |
| NOT | I0 O0 | I0 n0 |
| NOT | I0 O0 | I1 n1 |
| NOT | I0 O0 | I2 n2 |
| AND3 | A B C Y | n2 n1 n0 Y0 |
| AND3 | A B C Y | n2 n1 I0 Y1 |
| AND3 | A B C Y | n2 I1 n0 Y2 |
| AND3 | A B C Y | n2 I1 I0 Y3 |
| AND3 | A B C Y | I2 n1 n0 Y4 |
| AND3 | A B C Y | I2 n1 I0 Y5 |
| AND3 | A B C Y | I2 I1 n0 Y6 |
| AND3 | A B C Y | I2 I1 I0 Y7 |
Ctrl+G → имя DEC8. Ноги: входы I0, I1, I2; выходы Y0, Y1, Y2, Y3, Y4, Y5, Y6, Y7.
Шаг 3. Чип WORD8 — строка ОЗУ: 8 защёлок, запись по W, чтение по R
| Деталь | Нога | Метка |
|---|---|---|
| Порт входа | выход | D0 |
| Порт входа | выход | D1 |
| Порт входа | выход | D2 |
| Порт входа | выход | D3 |
| Порт входа | выход | D4 |
| Порт входа | выход | D5 |
| Порт входа | выход | D6 |
| Порт входа | выход | D7 |
| Порт входа | выход | W |
| Порт входа | выход | R |
| Порт выхода | вход | O0 |
| Порт выхода | вход | O1 |
| Порт выхода | вход | O2 |
| Порт выхода | вход | O3 |
| Порт выхода | вход | O4 |
| Порт выхода | вход | O5 |
| Порт выхода | вход | O6 |
| Порт выхода | вход | O7 |
| DLatch | D EN Q | D0 W q0 |
| DLatch | D EN Q | D1 W q1 |
| DLatch | D EN Q | D2 W q2 |
| DLatch | D EN Q | D3 W q3 |
| DLatch | D EN Q | D4 W q4 |
| DLatch | D EN Q | D5 W q5 |
| DLatch | D EN Q | D6 W q6 |
| DLatch | D EN Q | D7 W q7 |
| AND | I0 I1 O0 | q0 R O0 |
| AND | I0 I1 O0 | q1 R O1 |
| AND | I0 I1 O0 | q2 R O2 |
| AND | I0 I1 O0 | q3 R O3 |
| AND | I0 I1 O0 | q4 R O4 |
| AND | I0 I1 O0 | q5 R O5 |
| AND | I0 I1 O0 | q6 R O6 |
| AND | I0 I1 O0 | q7 R O7 |
Ctrl+G → имя WORD8. Ноги: входы D0, D1, D2, D3, D4, D5, D6, D7, W, R; выходы O0, O1, O2, O3, O4, O5, O6, O7.
Шаг 4. Что выбрано: область и строка
Адрес ячейки — младшие биты команды. ir4 = 0 — ОЗУ (адреса 0–7); ir4 = 1 — остальное: 16–23 постоянная память (selP), 24 счётчик попыток (selTRY), 28–29 провод IO (selIO). Строку внутри области выбирает DEC8 по ir0–ir2 — один дешифратор на ОЗУ и постоянную память.
| Деталь | Нога | Метка |
|---|---|---|
| NOT | I0 O0 | ir4 selRAM |
| NOT | I0 O0 | ir3 nir3 |
| NOT | I0 O0 | ir2 nir2 |
| AND | I0 I1 O0 | ir4 nir3 selP |
| AND3 | A B C Y | ir4 ir3 nir2 selTRY |
| AND3 | A B C Y | ir4 ir3 ir2 selIO |
| DEC8 | I0 I1 I2 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 | ir0 ir1 ir2 row0 row1 row2 row3 row4 row5 row6 row7 |
Шаг 5. Окно записи и строки
Защёлка пишет, пока открыта. Поэтому ST открывает строку только во второй половине такта (CLK = 0, nCLK = 1): адрес и A к этому времени давно устоялись, а закрывает окно сам фронт CLK — раньше, чем сменится PC. Две фазы одного такта: CLK = 1 — считать, CLK = 0 — записать в память. rr — строка для чтения, rw — для записи.
| Деталь | Нога | Метка |
|---|---|---|
| NOT | I0 O0 | CLK nCLK |
| AND3 | A B C Y | oST selRAM nCLK weRAM |
| AND | I0 I1 O0 | row0 selRAM rr0 |
| AND | I0 I1 O0 | row1 selRAM rr1 |
| AND | I0 I1 O0 | row2 selRAM rr2 |
| AND | I0 I1 O0 | row3 selRAM rr3 |
| AND | I0 I1 O0 | row4 selRAM rr4 |
| AND | I0 I1 O0 | row5 selRAM rr5 |
| AND | I0 I1 O0 | row6 selRAM rr6 |
| AND | I0 I1 O0 | row7 selRAM rr7 |
| AND | I0 I1 O0 | row0 weRAM rw0 |
| AND | I0 I1 O0 | row1 weRAM rw1 |
| AND | I0 I1 O0 | row2 weRAM rw2 |
| AND | I0 I1 O0 | row3 weRAM rw3 |
| AND | I0 I1 O0 | row4 weRAM rw4 |
| AND | I0 I1 O0 | row5 weRAM rw5 |
| AND | I0 I1 O0 | row6 weRAM rw6 |
| AND | I0 I1 O0 | row7 weRAM rw7 |
Шаг 6. Восемь строк ОЗУ
Каждая строка — 8 защёлок. D0–D7 — от A (что записать), O — что прочитано: у невыбранной строки там нули.
| Деталь | Нога | Метка |
|---|---|---|
| WORD8 | D0 D1 D2 D3 D4 D5 D6 D7 W R O0 O1 O2 O3 O4 O5 O6 O7 | acc0 acc1 acc2 acc3 acc4 acc5 acc6 acc7 rw0 rr0 m0_0 m0_1 m0_2 m0_3 m0_4 m0_5 m0_6 m0_7 |
| WORD8 | D0 D1 D2 D3 D4 D5 D6 D7 W R O0 O1 O2 O3 O4 O5 O6 O7 | acc0 acc1 acc2 acc3 acc4 acc5 acc6 acc7 rw1 rr1 m1_0 m1_1 m1_2 m1_3 m1_4 m1_5 m1_6 m1_7 |
| WORD8 | D0 D1 D2 D3 D4 D5 D6 D7 W R O0 O1 O2 O3 O4 O5 O6 O7 | acc0 acc1 acc2 acc3 acc4 acc5 acc6 acc7 rw2 rr2 m2_0 m2_1 m2_2 m2_3 m2_4 m2_5 m2_6 m2_7 |
| WORD8 | D0 D1 D2 D3 D4 D5 D6 D7 W R O0 O1 O2 O3 O4 O5 O6 O7 | acc0 acc1 acc2 acc3 acc4 acc5 acc6 acc7 rw3 rr3 m3_0 m3_1 m3_2 m3_3 m3_4 m3_5 m3_6 m3_7 |
| WORD8 | D0 D1 D2 D3 D4 D5 D6 D7 W R O0 O1 O2 O3 O4 O5 O6 O7 | acc0 acc1 acc2 acc3 acc4 acc5 acc6 acc7 rw4 rr4 m4_0 m4_1 m4_2 m4_3 m4_4 m4_5 m4_6 m4_7 |
| WORD8 | D0 D1 D2 D3 D4 D5 D6 D7 W R O0 O1 O2 O3 O4 O5 O6 O7 | acc0 acc1 acc2 acc3 acc4 acc5 acc6 acc7 rw5 rr5 m5_0 m5_1 m5_2 m5_3 m5_4 m5_5 m5_6 m5_7 |
| WORD8 | D0 D1 D2 D3 D4 D5 D6 D7 W R O0 O1 O2 O3 O4 O5 O6 O7 | acc0 acc1 acc2 acc3 acc4 acc5 acc6 acc7 rw6 rr6 m6_0 m6_1 m6_2 m6_3 m6_4 m6_5 m6_6 m6_7 |
| WORD8 | D0 D1 D2 D3 D4 D5 D6 D7 W R O0 O1 O2 O3 O4 O5 O6 O7 | acc0 acc1 acc2 acc3 acc4 acc5 acc6 acc7 rw7 rr7 m7_0 m7_1 m7_2 m7_3 m7_4 m7_5 m7_6 m7_7 |
Шаг 7. Чтение ОЗУ
По каждому биту — ИЛИ всех 8 строк: горит только выбранная, остальные дают 0.
| Деталь | Нога | Метка |
|---|---|---|
| OR8 | A B C D E F G H Y | m0_0 m1_0 m2_0 m3_0 m4_0 m5_0 m6_0 m7_0 ram0 |
| OR8 | A B C D E F G H Y | m0_1 m1_1 m2_1 m3_1 m4_1 m5_1 m6_1 m7_1 ram1 |
| OR8 | A B C D E F G H Y | m0_2 m1_2 m2_2 m3_2 m4_2 m5_2 m6_2 m7_2 ram2 |
| OR8 | A B C D E F G H Y | m0_3 m1_3 m2_3 m3_3 m4_3 m5_3 m6_3 m7_3 ram3 |
| OR8 | A B C D E F G H Y | m0_4 m1_4 m2_4 m3_4 m4_4 m5_4 m6_4 m7_4 ram4 |
| OR8 | A B C D E F G H Y | m0_5 m1_5 m2_5 m3_5 m4_5 m5_5 m6_5 m7_5 ram5 |
| OR8 | A B C D E F G H Y | m0_6 m1_6 m2_6 m3_6 m4_6 m5_6 m6_6 m7_6 ram6 |
| OR8 | A B C D E F G H Y | m0_7 m1_7 m2_7 m3_7 m4_7 m5_7 m6_7 m7_7 ram7 |
Шаг 8. Место под постоянную память
Личные данные карты — номер счёта, ПИН, ключ — будут жить в матрице, как ПЗУ «Знакогенератора»: строки pr, столбцы pb, резистор держит столбец в 1, транзистор строки прижимает его к 0, NOT переворачивает. Транзисторы (сами данные) поставим в уроке 6, а пока матрица пустая: всё читается как 0.
| Деталь | Нога | Метка |
|---|---|---|
| AND | I0 I1 O0 | row0 selP pr0 |
| AND | I0 I1 O0 | row1 selP pr1 |
| AND | I0 I1 O0 | row2 selP pr2 |
| AND | I0 I1 O0 | row3 selP pr3 |
| AND | I0 I1 O0 | row4 selP pr4 |
| AND | I0 I1 O0 | row5 selP pr5 |
| AND | I0 I1 O0 | row6 selP pr6 |
| Resistor | конец 1 конец 2 | VCC pb0 |
| Resistor | конец 1 конец 2 | VCC pb1 |
| Resistor | конец 1 конец 2 | VCC pb2 |
| Resistor | конец 1 конец 2 | VCC pb3 |
| Resistor | конец 1 конец 2 | VCC pb4 |
| Resistor | конец 1 конец 2 | VCC pb5 |
| Resistor | конец 1 конец 2 | VCC pb6 |
| Resistor | конец 1 конец 2 | VCC pb7 |
| NOT | I0 O0 | pb0 pq0 |
| NOT | I0 O0 | pb1 pq1 |
| NOT | I0 O0 | pb2 pq2 |
| NOT | I0 O0 | pb3 pq3 |
| NOT | I0 O0 | pb4 pq4 |
| NOT | I0 O0 | pb5 pq5 |
| NOT | I0 O0 | pb6 pq6 |
| NOT | I0 O0 | pb7 pq7 |
Шаг 9. Всё сходится в din
Что прочитано — ОЗУ, постоянная память, счётчик попыток или провод IO — сходится ИЛИ в din0–din7, а оттуда в MUX2 числа урока 2. Счётчик попыток (try0, try1) и провод IO появятся в уроках 5–6: пока их метки пустые, а AND с невыбранной областью и так дают 0.
| Деталь | Нога | Метка |
|---|---|---|
| AND | I0 I1 O0 | try0 selTRY t0 |
| AND | I0 I1 O0 | try1 selTRY t1 |
| AND | I0 I1 O0 | IO selIO io0 |
| OR4 | A B C D Y | ram0 pq0 t0 io0 din0 |
| OR3 | A B C Y | ram1 pq1 t1 din1 |
| OR | I0 I1 O0 | ram2 pq2 din2 |
| OR | I0 I1 O0 | ram3 pq3 din3 |
| OR | I0 I1 O0 | ram4 pq4 din4 |
| OR | I0 I1 O0 | ram5 pq5 din5 |
| OR | I0 I1 O0 | ram6 pq6 din6 |
| OR | I0 I1 O0 | ram7 pq7 din7 |
Шаг 10. Программа в ПЗУ
⚙ у ROM → кнопка ⬆ → файл 03-shift.rom.json. Всего 5 команд:
; Урок 3 — огонёк сдвигом через память: A + A сдвигает биты влево, но второе слагаемое надо где-то взять —; команда складывает A с ЯЧЕЙКОЙ. Кладём A в ячейку 0 и прибавляем её же.start: LD #1loop: ST 0 ; ячейка 0 ← A ADD 0 ; A ← A + ячейка 0 = A + A: огонёк шагает влево JNC loop ; пока единица не вылетела за 8 бит JMP start ; 128 + 128 = 256 → A = 0, C = 1 — сначала3.5. Проверка
| Такт | PC | Команда | A | Лампы acc7…acc0 | C | Ячейка 0 | Что видно |
|---|---|---|---|---|---|---|---|
| 1 | 0 | LD #1 | 1 | ○○○○○○○● | 0 | 0 | |
| 2 | 1 | ST 0 | 1 | ○○○○○○○● | 0 | 1 | ячейка 0 ← 1 |
| 3 | 2 | ADD 0 | 2 | ○○○○○○●○ | 0 | 1 | 1 + 1 = 2 |
| 4 | 3 | JNC 1 | 2 | ○○○○○○●○ | 0 | 1 | C = 0 — ещё раз |
| 5 | 1 | ST 0 | 2 | ○○○○○○●○ | 0 | 2 | ячейка 0 ← 2 |
| 6 | 2 | ADD 0 | 4 | ○○○○○●○○ | 0 | 2 | 2 + 2 = 4 |
| 7 | 3 | JNC 1 | 4 | ○○○○○●○○ | 0 | 2 | C = 0 — ещё раз |
| 8 | 1 | ST 0 | 4 | ○○○○○●○○ | 0 | 4 | ячейка 0 ← 4 |
| 9 | 2 | ADD 0 | 8 | ○○○○●○○○ | 0 | 4 | 4 + 4 = 8 |
| 10 | 3 | JNC 1 | 8 | ○○○○●○○○ | 0 | 4 | C = 0 — ещё раз |
| 11 | 1 | ST 0 | 8 | ○○○○●○○○ | 0 | 8 | ячейка 0 ← 8 |
| 12 | 2 | ADD 0 | 16 | ○○○●○○○○ | 0 | 8 | 8 + 8 = 16 |
| 13 | 3 | JNC 1 | 16 | ○○○●○○○○ | 0 | 8 | C = 0 — ещё раз |
| 14 | 1 | ST 0 | 16 | ○○○●○○○○ | 0 | 16 | ячейка 0 ← 16 |
| 15 | 2 | ADD 0 | 32 | ○○●○○○○○ | 0 | 16 | 16 + 16 = 32 |
| 16 | 3 | JNC 1 | 32 | ○○●○○○○○ | 0 | 16 | C = 0 — ещё раз |
| 17 | 1 | ST 0 | 32 | ○○●○○○○○ | 0 | 32 | ячейка 0 ← 32 |
| 18 | 2 | ADD 0 | 64 | ○●○○○○○○ | 0 | 32 | 32 + 32 = 64 |
| 19 | 3 | JNC 1 | 64 | ○●○○○○○○ | 0 | 32 | C = 0 — ещё раз |
| 20 | 1 | ST 0 | 64 | ○●○○○○○○ | 0 | 64 | ячейка 0 ← 64 |
| 21 | 2 | ADD 0 | 128 | ●○○○○○○○ | 0 | 64 | 64 + 64 = 128 |
| 22 | 3 | JNC 1 | 128 | ●○○○○○○○ | 0 | 64 | C = 0 — ещё раз |
| 23 | 1 | ST 0 | 128 | ●○○○○○○○ | 0 | 128 | ячейка 0 ← 128 |
| 24 | 2 | ADD 0 | 0 | ○○○○○○○○ | 1 | 128 | 128 + 128 = 256 → 0, C = 1 |
| 25 | 3 | JNC 1 | 0 | ○○○○○○○○ | 1 | 128 | C = 1 — дальше |
| 26 | 4 | JMP 0 | 0 | ○○○○○○○○ | 1 | 128 | сначала |
| 27 | 0 | LD #1 | 1 | ○○○○○○○● | 1 | 128 | |
| 28 | 1 | ST 0 | 1 | ○○○○○○○● | 1 | 1 | ячейка 0 ← 1 |
Сброс (RST на один-два такта) — и генератор шагает сам. Огонёк бежит влево по одной лампе за 3 такта (ST, ADD, JNC), после 128 гаснет на 3 такта (A = 0, C = 1) и начинает сначала.
Aменяется только наADDиLD;STи переходыAне трогают — лампы стоят.Cзагорается, когда 128 + 128 вылетело за 8 бит, и гаснет на следующемADD(LD,STи переходыCне трогают).- Главное: команда
ADD 0складываетAс ячейкой памяти. Без ОЗУ (урок 2) сдвиг пришлось писать восемьюLD.
Если не так:
AпослеADD 0не удваивается — проверь окно записи:AND3→weRAMсoST,selRAM,nCLK; строкиrw,rr.- Удваивается, но не тот бит —
WORD8:D0–D7наacc0–acc7,Oстроки —m<строка>_<бит>;OR8бита k — входыm0_k…m7_k. - Вместо огонька горят все —
dinне из ОЗУ: проверьORвdin2–din7,OR3вdin1,OR4вdin0. - Оранжевые (Z) метки
try0,try1,IO— так и должно быть: их источники появятся в уроках 5–6.
В чип не сворачивать.
Вставка урока 3 (Cmd+I)
Поверх урока 2.
# Урок 3 — ОЗУ на защёлках: адрес, 8 ячеек по 8 бит, чтение в din; место под постоянную память.# Вставка: Cmd+I поверх урока 2.# Потом: ПЗУ — загрузить программу lessons/03-shift.rom.json (⬆ в редакторе памяти ROM). # ---------- AND3 ----------chip AND3 { portIn(A) portIn(B) portIn(C) portOut(Y) AND(A, B, ab) AND(ab, C, Y)} # ---------- DEC8 ----------chip DEC8 { portIn(I0) portIn(I1) portIn(I2) portOut(Y0) portOut(Y1) portOut(Y2) portOut(Y3) portOut(Y4) portOut(Y5) portOut(Y6) portOut(Y7) NOT(I0, n0) NOT(I1, n1) NOT(I2, n2) AND3(A=n2, B=n1, C=n0, Y=Y0) AND3(A=n2, B=n1, C=I0, Y=Y1) AND3(A=n2, B=I1, C=n0, Y=Y2) AND3(A=n2, B=I1, C=I0, Y=Y3) AND3(A=I2, B=n1, C=n0, Y=Y4) AND3(A=I2, B=n1, C=I0, Y=Y5) AND3(A=I2, B=I1, C=n0, Y=Y6) AND3(A=I2, B=I1, C=I0, Y=Y7)} # ---------- WORD8 ----------chip WORD8 { portIn(D0) portIn(D1) portIn(D2) portIn(D3) portIn(D4) portIn(D5) portIn(D6) portIn(D7) portIn(W) portIn(R) portOut(O0) portOut(O1) portOut(O2) portOut(O3) portOut(O4) portOut(O5) portOut(O6) portOut(O7) DLatch(D=D0, EN=W, Q=q0) DLatch(D=D1, EN=W, Q=q1) DLatch(D=D2, EN=W, Q=q2) DLatch(D=D3, EN=W, Q=q3) DLatch(D=D4, EN=W, Q=q4) DLatch(D=D5, EN=W, Q=q5) DLatch(D=D6, EN=W, Q=q6) DLatch(D=D7, EN=W, Q=q7) AND(q0, R, O0) AND(q1, R, O1) AND(q2, R, O2) AND(q3, R, O3) AND(q4, R, O4) AND(q5, R, O5) AND(q6, R, O6) AND(q7, R, O7)} # ---------- Что выбрано: область и строка ----------NOT(ir4, selRAM)NOT(ir3, nir3)NOT(ir2, nir2)AND(ir4, nir3, selP)AND3(A=ir4, B=ir3, C=nir2, Y=selTRY)AND3(A=ir4, B=ir3, C=ir2, Y=selIO)DEC8(I0=ir0, I1=ir1, I2=ir2, Y0=row0, Y1=row1, Y2=row2, Y3=row3, Y4=row4, Y5=row5, Y6=row6, Y7=row7) # ---------- Окно записи и строки ----------NOT(CLK, nCLK)AND3(A=oST, B=selRAM, C=nCLK, Y=weRAM)AND(row0, selRAM, rr0)AND(row1, selRAM, rr1)AND(row2, selRAM, rr2)AND(row3, selRAM, rr3)AND(row4, selRAM, rr4)AND(row5, selRAM, rr5)AND(row6, selRAM, rr6)AND(row7, selRAM, rr7)AND(row0, weRAM, rw0)AND(row1, weRAM, rw1)AND(row2, weRAM, rw2)AND(row3, weRAM, rw3)AND(row4, weRAM, rw4)AND(row5, weRAM, rw5)AND(row6, weRAM, rw6)AND(row7, weRAM, rw7) # ---------- Восемь строк ОЗУ ----------WORD8(D0=acc0, D1=acc1, D2=acc2, D3=acc3, D4=acc4, D5=acc5, D6=acc6, D7=acc7, W=rw0, R=rr0, O0=m0_0, O1=m0_1, O2=m0_2, O3=m0_3, O4=m0_4, O5=m0_5, O6=m0_6, O7=m0_7)WORD8(D0=acc0, D1=acc1, D2=acc2, D3=acc3, D4=acc4, D5=acc5, D6=acc6, D7=acc7, W=rw1, R=rr1, O0=m1_0, O1=m1_1, O2=m1_2, O3=m1_3, O4=m1_4, O5=m1_5, O6=m1_6, O7=m1_7)WORD8(D0=acc0, D1=acc1, D2=acc2, D3=acc3, D4=acc4, D5=acc5, D6=acc6, D7=acc7, W=rw2, R=rr2, O0=m2_0, O1=m2_1, O2=m2_2, O3=m2_3, O4=m2_4, O5=m2_5, O6=m2_6, O7=m2_7)WORD8(D0=acc0, D1=acc1, D2=acc2, D3=acc3, D4=acc4, D5=acc5, D6=acc6, D7=acc7, W=rw3, R=rr3, O0=m3_0, O1=m3_1, O2=m3_2, O3=m3_3, O4=m3_4, O5=m3_5, O6=m3_6, O7=m3_7)WORD8(D0=acc0, D1=acc1, D2=acc2, D3=acc3, D4=acc4, D5=acc5, D6=acc6, D7=acc7, W=rw4, R=rr4, O0=m4_0, O1=m4_1, O2=m4_2, O3=m4_3, O4=m4_4, O5=m4_5, O6=m4_6, O7=m4_7)WORD8(D0=acc0, D1=acc1, D2=acc2, D3=acc3, D4=acc4, D5=acc5, D6=acc6, D7=acc7, W=rw5, R=rr5, O0=m5_0, O1=m5_1, O2=m5_2, O3=m5_3, O4=m5_4, O5=m5_5, O6=m5_6, O7=m5_7)WORD8(D0=acc0, D1=acc1, D2=acc2, D3=acc3, D4=acc4, D5=acc5, D6=acc6, D7=acc7, W=rw6, R=rr6, O0=m6_0, O1=m6_1, O2=m6_2, O3=m6_3, O4=m6_4, O5=m6_5, O6=m6_6, O7=m6_7)WORD8(D0=acc0, D1=acc1, D2=acc2, D3=acc3, D4=acc4, D5=acc5, D6=acc6, D7=acc7, W=rw7, R=rr7, O0=m7_0, O1=m7_1, O2=m7_2, O3=m7_3, O4=m7_4, O5=m7_5, O6=m7_6, O7=m7_7) # ---------- Чтение ОЗУ ----------OR8(A=m0_0, B=m1_0, C=m2_0, D=m3_0, E=m4_0, F=m5_0, G=m6_0, H=m7_0, Y=ram0)OR8(A=m0_1, B=m1_1, C=m2_1, D=m3_1, E=m4_1, F=m5_1, G=m6_1, H=m7_1, Y=ram1)OR8(A=m0_2, B=m1_2, C=m2_2, D=m3_2, E=m4_2, F=m5_2, G=m6_2, H=m7_2, Y=ram2)OR8(A=m0_3, B=m1_3, C=m2_3, D=m3_3, E=m4_3, F=m5_3, G=m6_3, H=m7_3, Y=ram3)OR8(A=m0_4, B=m1_4, C=m2_4, D=m3_4, E=m4_4, F=m5_4, G=m6_4, H=m7_4, Y=ram4)OR8(A=m0_5, B=m1_5, C=m2_5, D=m3_5, E=m4_5, F=m5_5, G=m6_5, H=m7_5, Y=ram5)OR8(A=m0_6, B=m1_6, C=m2_6, D=m3_6, E=m4_6, F=m5_6, G=m6_6, H=m7_6, Y=ram6)OR8(A=m0_7, B=m1_7, C=m2_7, D=m3_7, E=m4_7, F=m5_7, G=m6_7, H=m7_7, Y=ram7) # ---------- Место под постоянную память ----------AND(row0, selP, pr0)AND(row1, selP, pr1)AND(row2, selP, pr2)AND(row3, selP, pr3)AND(row4, selP, pr4)AND(row5, selP, pr5)AND(row6, selP, pr6)resistor(VCC, pb0)resistor(VCC, pb1)resistor(VCC, pb2)resistor(VCC, pb3)resistor(VCC, pb4)resistor(VCC, pb5)resistor(VCC, pb6)resistor(VCC, pb7)NOT(pb0, pq0)NOT(pb1, pq1)NOT(pb2, pq2)NOT(pb3, pq3)NOT(pb4, pq4)NOT(pb5, pq5)NOT(pb6, pq6)NOT(pb7, pq7) # ---------- Всё сходится в din ----------AND(try0, selTRY, t0)AND(try1, selTRY, t1)AND(IO, selIO, io0)OR4(A=ram0, B=pq0, C=t0, D=io0, Y=din0)OR3(A=ram1, B=pq1, C=t1, Y=din1)OR(ram2, pq2, din2)OR(ram3, pq3, din3)OR(ram4, pq4, din4)OR(ram5, pq5, din5)OR(ram6, pq6, din6)OR(ram7, pq7, din7)Не получается? Что-то не работает →