Урок 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 — один на ОЗУ и постоянную память.

012345678910111213141516171819202122232425262728293031ОЗУ: 8 ячеекурок 3личные данныеурок 6TRYурок 6IOурок 5
Адрес ячейки — младшие биты команды. 0–7 — ОЗУ, 16–22 — личные данные карты, 24 — счётчик попыток, 28–29 — провод данных. Строку внутри области выбирает один дешифратор DEC8.

3.2. Идея: защёлка пишет, пока открыта

Ячейка ОЗУ — 8 защёлок. Защёлка запоминает, пока открыта, поэтому открывать её можно только когда адрес и A устоялись. Такт делится на две половины: CLK = 1 — считать, CLK = 0 — записать. Окно записи weRAM открыто во второй половине и закрывается самим фронтом CLK — раньше, чем сменится PC.

CLKкомандаLD #1ST 0ADD 0JNC 1ST 0ADD 0oSTweRAMокно: CLK = 0↑ фронт CLK: PC шагает, окно уже закрыто
Защёлка пишет, пока открыта. Поэтому ST открывает строку ОЗУ только во второй половине такта (CLK = 0): адрес и A к этому времени устоялись, а закрывает окно сам фронт CLK — раньше, чем сменится PC.

3.3. Идея: память при включении — мусор

Защёлки при включении ничего не помнят: в Real они «плавают» (оранжевые). Поэтому программа сначала пишет ячейку и только потом читает. Так и в настоящих компьютерах: память после включения надо заполнить.

3.4. Сборка

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

ОЗУ собираем на защёлках: строка из 8 защёлок на каждую ячейку. Чтение — всегда (выбранная строка отдаёт хранимое), запись — только командой ST и только во второй половине такта.

Шаг 1. Чип AND3 — И на 3 входа

Если AND3 уже есть в библиотеке (из «Часов и игры») — шаг пропусти.

ДетальНогаМетка
Порт входавыходA
Порт входавыходB
Порт входавыходC
Порт выходавходY
ANDI0
I1
O0
A
B
ab
ANDI0
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
NOTI0
O0
I0
n0
NOTI0
O0
I1
n1
NOTI0
O0
I2
n2
AND3A
B
C
Y
n2
n1
n0
Y0
AND3A
B
C
Y
n2
n1
I0
Y1
AND3A
B
C
Y
n2
I1
n0
Y2
AND3A
B
C
Y
n2
I1
I0
Y3
AND3A
B
C
Y
I2
n1
n0
Y4
AND3A
B
C
Y
I2
n1
I0
Y5
AND3A
B
C
Y
I2
I1
n0
Y6
AND3A
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
DLatchD
EN
Q
D0
W
q0
DLatchD
EN
Q
D1
W
q1
DLatchD
EN
Q
D2
W
q2
DLatchD
EN
Q
D3
W
q3
DLatchD
EN
Q
D4
W
q4
DLatchD
EN
Q
D5
W
q5
DLatchD
EN
Q
D6
W
q6
DLatchD
EN
Q
D7
W
q7
ANDI0
I1
O0
q0
R
O0
ANDI0
I1
O0
q1
R
O1
ANDI0
I1
O0
q2
R
O2
ANDI0
I1
O0
q3
R
O3
ANDI0
I1
O0
q4
R
O4
ANDI0
I1
O0
q5
R
O5
ANDI0
I1
O0
q6
R
O6
ANDI0
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 — один дешифратор на ОЗУ и постоянную память.

ДетальНогаМетка
NOTI0
O0
ir4
selRAM
NOTI0
O0
ir3
nir3
NOTI0
O0
ir2
nir2
ANDI0
I1
O0
ir4
nir3
selP
AND3A
B
C
Y
ir4
ir3
nir2
selTRY
AND3A
B
C
Y
ir4
ir3
ir2
selIO
DEC8I0
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 — для записи.

ДетальНогаМетка
NOTI0
O0
CLK
nCLK
AND3A
B
C
Y
oST
selRAM
nCLK
weRAM
ANDI0
I1
O0
row0
selRAM
rr0
ANDI0
I1
O0
row1
selRAM
rr1
ANDI0
I1
O0
row2
selRAM
rr2
ANDI0
I1
O0
row3
selRAM
rr3
ANDI0
I1
O0
row4
selRAM
rr4
ANDI0
I1
O0
row5
selRAM
rr5
ANDI0
I1
O0
row6
selRAM
rr6
ANDI0
I1
O0
row7
selRAM
rr7
ANDI0
I1
O0
row0
weRAM
rw0
ANDI0
I1
O0
row1
weRAM
rw1
ANDI0
I1
O0
row2
weRAM
rw2
ANDI0
I1
O0
row3
weRAM
rw3
ANDI0
I1
O0
row4
weRAM
rw4
ANDI0
I1
O0
row5
weRAM
rw5
ANDI0
I1
O0
row6
weRAM
rw6
ANDI0
I1
O0
row7
weRAM
rw7

Шаг 6. Восемь строк ОЗУ

Каждая строка — 8 защёлок. D0–D7 — от A (что записать), O — что прочитано: у невыбранной строки там нули.

ДетальНогаМетка
WORD8D0
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
WORD8D0
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
WORD8D0
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
WORD8D0
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
WORD8D0
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
WORD8D0
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
WORD8D0
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
WORD8D0
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.

ДетальНогаМетка
OR8A
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
OR8A
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
OR8A
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
OR8A
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
OR8A
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
OR8A
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
OR8A
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
OR8A
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.

ДетальНогаМетка
ANDI0
I1
O0
row0
selP
pr0
ANDI0
I1
O0
row1
selP
pr1
ANDI0
I1
O0
row2
selP
pr2
ANDI0
I1
O0
row3
selP
pr3
ANDI0
I1
O0
row4
selP
pr4
ANDI0
I1
O0
row5
selP
pr5
ANDI0
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
NOTI0
O0
pb0
pq0
NOTI0
O0
pb1
pq1
NOTI0
O0
pb2
pq2
NOTI0
O0
pb3
pq3
NOTI0
O0
pb4
pq4
NOTI0
O0
pb5
pq5
NOTI0
O0
pb6
pq6
NOTI0
O0
pb7
pq7

Шаг 9. Всё сходится в din

Что прочитано — ОЗУ, постоянная память, счётчик попыток или провод IO — сходится ИЛИ в din0–din7, а оттуда в MUX2 числа урока 2. Счётчик попыток (try0, try1) и провод IO появятся в уроках 5–6: пока их метки пустые, а AND с невыбранной областью и так дают 0.

ДетальНогаМетка
ANDI0
I1
O0
try0
selTRY
t0
ANDI0
I1
O0
try1
selTRY
t1
ANDI0
I1
O0
IO
selIO
io0
OR4A
B
C
D
Y
ram0
pq0
t0
io0
din0
OR3A
B
C
Y
ram1
pq1
t1
din1
ORI0
I1
O0
ram2
pq2
din2
ORI0
I1
O0
ram3
pq3
din3
ORI0
I1
O0
ram4
pq4
din4
ORI0
I1
O0
ram5
pq5
din5
ORI0
I1
O0
ram6
pq6
din6
ORI0
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…acc0CЯчейка 0Что видно
10LD #11○○○○○○○●00
21ST 01○○○○○○○●01ячейка 0 ← 1
32ADD 02○○○○○○●○011 + 1 = 2
43JNC 12○○○○○○●○01C = 0 — ещё раз
51ST 02○○○○○○●○02ячейка 0 ← 2
62ADD 04○○○○○●○○022 + 2 = 4
73JNC 14○○○○○●○○02C = 0 — ещё раз
81ST 04○○○○○●○○04ячейка 0 ← 4
92ADD 08○○○○●○○○044 + 4 = 8
103JNC 18○○○○●○○○04C = 0 — ещё раз
111ST 08○○○○●○○○08ячейка 0 ← 8
122ADD 016○○○●○○○○088 + 8 = 16
133JNC 116○○○●○○○○08C = 0 — ещё раз
141ST 016○○○●○○○○016ячейка 0 ← 16
152ADD 032○○●○○○○○01616 + 16 = 32
163JNC 132○○●○○○○○016C = 0 — ещё раз
171ST 032○○●○○○○○032ячейка 0 ← 32
182ADD 064○●○○○○○○03232 + 32 = 64
193JNC 164○●○○○○○○032C = 0 — ещё раз
201ST 064○●○○○○○○064ячейка 0 ← 64
212ADD 0128●○○○○○○○06464 + 64 = 128
223JNC 1128●○○○○○○○064C = 0 — ещё раз
231ST 0128●○○○○○○○0128ячейка 0 ← 128
242ADD 00○○○○○○○○1128128 + 128 = 256 → 0, C = 1
253JNC 10○○○○○○○○1128C = 1 — дальше
264JMP 00○○○○○○○○1128сначала
270LD #11○○○○○○○●1128
281ST 01○○○○○○○●11ячейка 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)

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