Урок 1. Ячейка и строка: слово из 4 бит
В картинкахВ процессоре Game & Watch вся память — примитив ram: поставил, настроил, и он помнит. Как он устроен внутри, не видно. В этом наборе мы соберём память сами — из тех же защёлок, что в первом наборе держали цифры часов. После этого урока у вас будет строка памяти WORD4: она запоминает 4 бита по кнопке и выдаёт их, когда её спросят.
1.1. Идея: память — это много защёлок
Один бит умеет хранить защёлка DLatch (первый набор, урок 2): пока на входе EN единица, её выход Q повторяет вход D; убрали единицу — Q держит последнее значение сколько угодно.
Память на 256 ячеек — это тысяча таких защёлок и способ выбрать нужные. Сначала научим одну защёлку двум вещам, которые понадобятся в большой памяти:
- «запиши» — защёлка берёт новое значение, только когда ей разрешили (
W = 1); - «выдай» — защёлка выпускает свой бит наружу, только когда её выбрали (
R = 1), а в остальное время на выходе ноль.
Зачем второе: в следующем уроке выходы шестнадцати строк сойдутся в одну точку. Если невыбранные строки дают нули, их можно просто сложить вентилем ИЛИ — останется бит выбранной.
1.2. Ячейка: защёлка и «кран»
«Кран» — обычный AND: O = Q · R. Когда R = 0, на выходе 0, что бы ни хранила защёлка.
1.3. Строка: 4 ячейки с общими проводами
Процессор работает словами по 4 бита, поэтому ячейки ставим по четыре. У каждой свой бит данных D и свой выход O, а «запиши» W и «выдай» R — общие на всю строку.
W = 1— все четыре защёлки открыты, словоD3 D2 D1 D0записывается целиком;R = 1— все четыре «крана» открыты, слово выходит наO3 O2 O1 O0.
1.4. Сборка
Ставить в новый пустой проект: у стенда свои тумблеры и питание. Нужны чипы первого набора NOT, AND, NOR, SRLatch, DLatch.
Шаг 1. Чип WORD4
Что собираем. Строку памяти: четыре защёлки и четыре «крана».
ПОРТЫ-ВХОДЫ: D0, D1, D2, D3, W, R · ПОРТЫ-ВЫХОДЫ: O0, O1, O2, O3
| Элемент | Нога | Направление | Метка |
|---|---|---|---|
| DLatch | D | вход | D0 |
| DLatch | EN | вход | W |
| DLatch | Q | выход | q0 |
| DLatch | D | вход | D1 |
| DLatch | EN | вход | W |
| DLatch | Q | выход | q1 |
| DLatch | D | вход | D2 |
| DLatch | EN | вход | W |
| DLatch | Q | выход | q2 |
| DLatch | D | вход | D3 |
| DLatch | EN | вход | W |
| DLatch | Q | выход | q3 |
| AND | I0 | вход | q0 |
| AND | I1 | вход | R |
| AND | O0 | выход | O0 |
| AND | I0 | вход | q1 |
| AND | I1 | вход | R |
| AND | O0 | выход | O1 |
| AND | I0 | вход | q2 |
| AND | I1 | вход | R |
| AND | O0 | выход | O2 |
| AND | I0 | вход | q3 |
| AND | I1 | вход | R |
| AND | O0 | выход | O3 |
Выделить всё → Ctrl+G → в библиотеке двойной клик по имени чипа → WORD4.
Шаг 2. Стенд
Что собираем. Пульт для проверки: четыре тумблера данных, тумблер «выдай» R, кнопка «запиши» W и два табло — что на тумблерах и что выдаёт строка.
| Элемент | Нога | Направление | Метка |
|---|---|---|---|
| power | out | выход | VCC |
| ground | out | выход | GND |
| input | Out | выход | wD0 |
| input | Out | выход | wD1 |
| input | Out | выход | wD2 |
| input | Out | выход | wD3 |
| input | Out | выход | wR |
| button | out | выход | wW |
| WORD4 | D0 | вход | wD0 |
| WORD4 | D1 | вход | wD1 |
| WORD4 | D2 | вход | wD2 |
| WORD4 | D3 | вход | wD3 |
| WORD4 | W | вход | wW |
| WORD4 | R | вход | wR |
| WORD4 | O0 | выход | wO0 |
| WORD4 | O1 | выход | wO1 |
| WORD4 | O2 | выход | wO2 |
| WORD4 | O3 | выход | wO3 |
Оба табло: ⚙ — ширина 4, вид HEX; источник — шина wD (тумблеры) и wO (выход строки). Стенд в чип не сворачивать.
1.5. Проверка
Тумблеры wD0–wD3 — двоичное число справа налево: wD0 — младший бит. 5 = 0101 (включены wD0 и wD2).
| № | Что делаешь | Тумблеры | Табло wO | |
|---|---|---|---|---|
| 1 | R выключен | любые | 0 | «кран» закрыт |
| 2 | набрать 5, нажать и отпустить W, включить R | 0101 | 5 | записали 5 и выпустили наружу |
| 3 | набрать A (W не трогать) | 1010 | 5 | тумблеры поменялись — память нет |
| 4 | выключить R | 1010 | 0 | |
| 5 | включить R | 1010 | 5 | 5 никуда не делась |
| 6 | держать W и щёлкать тумблерами | любые | = тумблеры | пока W нажата, защёлки открыты — так и должно быть |
| 7 | отпустить W | любые | последнее | запомнилось то, что было в момент отпускания |
Сразу после включения, пока ничего не записано, при R = 1 табло wO пустое или оранжевое (в Fast — F): защёлки ещё ничего не хранят. Так и должно быть — настоящая память при включении тоже содержит «что попало».
Если не так:
| Видно | Где смотреть |
|---|---|
| wO всегда 0 | R: тумблер wR → нога R чипа; внутри AND второй вход = R (у всех четырёх одна метка R) |
| запоминается не всё слово | W на EN у всех четырёх DLatch |
| один бит не тот | D и O этого бита: D0 → защёлка → q0 → AND → O0 |
Частая ошибка. При копировании метки редактор дописывает к имени номер: R → R1, R2. Метки с разными именами — разные провода. Если «кран» открывается только у одного бита — проверьте имена меток R и W внутри WORD4.
Вставка урока 1 (Cmd+I)
В новый проект с чипами первого набора.
# Урок 1 — ячейка и строка памяти: чип WORD4 + стенд.# Вставка: Cmd+I в новый проект (нужны NOT, AND, NOR, SRLatch, DLatch первого набора). # ---------- строка памяти: 4 бита ----------# W = 1 — запомнить D0–D3; R = 1 — выдать хранимое на O0–O3 (R = 0 — там нули)chip WORD4 { portIn(D0) portIn(D1) portIn(D2) portIn(D3) portIn(W) portIn(R) portOut(O0) portOut(O1) portOut(O2) portOut(O3) 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) AND(q0, R, O0) AND(q1, R, O1) AND(q2, R, O2) AND(q3, R, O3)} # ---------- стенд ----------power(VCC)ground(GND)# данные (4 тумблера), «выдай» (тумблер), «запиши» (кнопка: держишь — пишется)input(Out=wD0)input(Out=wD1)input(Out=wD2)input(Out=wD3)input(Out=wR)button{label="W", hostKey="KeyW"}(wW)WORD4(D0=wD0, D1=wD1, D2=wD2, D3=wD3, W=wW, R=wR, O0=wO0, O1=wO1, O2=wO2, O3=wO3)# табло: что на тумблерах данных и что выдаёт строкаdisplay{bits=4, base="HEX", busSource="wD"}()display{bits=4, base="HEX", busSource="wO"}()Не получается? Что-то не работает →