Урок 5. Калькулятор ±: минус на лампе, модуль на табло
В картинкахПосле этого урока у тебя будет калькулятор: набираешь два числа, выбираешь «+» или «−» — и видишь ответ со знаком, 3 − 5 → «−» и 2. Этим уроком набор закончен: в нём уже есть всё, чем процессор считает. Урок 6 — бонус.
5.1. Идея: модуль — это ещё одно вычитание
Табло умеет показывать только числа без знака. Если показать на нём 3 − 5 как есть, увидим 254 — это −2 в дополнительном коде, но человек так не читает. Нужно показать отдельно знак и отдельно модуль.
- Знак — это флаг
N, старший бит ответаS7. Его показывает лампа «−». - Модуль отрицательного числа — это оно же с обратным знаком:
0 − S. А вычитать мы уже умеем.
Второй ADDSUB8 считает 0 + S или 0 − S, и что из двух — решает сам ответ: его S7 подан на SUB. Ответ положительный — второй сумматор прибавляет к нулю и пропускает его как есть. Отрицательный — вычитает из нуля и переворачивает знак.
Числа набирай от 0 до 127 (тумблеры A7 и B7 выключены): в 8 битах со знаком больше 127 не бывает. Если ответ не влезает, горит V, и табло показывает неправду.
5.2. Сборка
Тот же проект. Стенд урока 4 (17 тумблеров, ADDSUB8 на холсте, OR/NOR, NOT/AND, лампы, табло) удали; Power/Ground оставь.
Идея. Табло умеет показывать только числа без знака. Значит, отрицательный ответ надо показать как «минус» на лампе и модуль на табло. Модуль отрицательного числа — это оно же с обратным знаком, то есть 0 − S. А вычитать мы уже умеем: второй ADDSUB8 считает 0 + S или 0 − S, и выбирает знак сам ответ — его старший бит S7 (флаг N) подан на SUB.
Числа набирай от 0 до 127 (тумблеры A7 и B7 выключены): в 8 битах со знаком больше 127 не бывает. Если ответ не влезает, горит V — табло тогда показывает неправду.
Шаг 1. Тумблеры и сумматор A ± B
| Деталь | Нога | Метка |
|---|---|---|
| Input | выход | A0 |
| Input | выход | A1 |
| Input | выход | A2 |
| Input | выход | A3 |
| Input | выход | A4 |
| Input | выход | A5 |
| Input | выход | A6 |
| Input | выход | A7 |
| Input | выход | B0 |
| Input | выход | B1 |
| Input | выход | B2 |
| Input | выход | B3 |
| Input | выход | B4 |
| Input | выход | B5 |
| Input | выход | B6 |
| Input | выход | B7 |
| Input | выход | SUB |
| ADDSUB8 (A ± B) | A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 SUB S0 S1 S2 S3 S4 S5 S6 S7 CO V | A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 SUB S0 S1 S2 S3 S4 S5 S6 S7 C V |
Шаг 2. Модуль на табло, знак на лампе
| Деталь | Нога | Метка |
|---|---|---|
| ADDSUB8 (модуль) | A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 SUB S0 S1 S2 S3 S4 S5 S6 S7 CO V | GND GND GND GND GND GND GND GND S0 S1 S2 S3 S4 S5 S6 S7 S7 M0 M1 M2 M3 M4 M5 M6 M7 — (свободна) — (свободна) |
| LED («−» — знак) | вход | S7 |
| LED (V — не влезло) | вход | V |
| Display | ⚙ | ширина 8, DEC, шина A |
| Display | ⚙ | ширина 8, DEC, шина B |
| Display | ⚙ | ширина 8, DEC, шина M |
A0–A7 второго сумматора все на GND: это ноль, из которого вычитаем. CO и V у него не нужны.
5.3. Проверка
| A | Тумблеры A7…A0 | B | Тумблеры B7…B0 | SUB | Табло M | Лампы | Это |
|---|---|---|---|---|---|---|---|
| 3 | 0000 0011 | 5 | 0000 0101 | 1 | 2 | − | 3 − 5 = −2 |
| 100 | 0110 0100 | 27 | 0001 1011 | 0 | 127 | — | 100 + 27 = 127 |
| 10 | 0000 1010 | 100 | 0110 0100 | 1 | 90 | − | 10 − 100 = −90 |
| 127 | 0111 1111 | 127 | 0111 1111 | 1 | 0 | — | 127 − 127 = 0 |
| 42 | 0010 1010 | 0 | 0000 0000 | 1 | 42 | — | 42 − 0 = 42 |
| 100 | 0110 0100 | 50 | 0011 0010 | 0 | — | V | 150 больше 127 — не влезло |
В колонках «Тумблеры» слева — старший тумблер (A7), справа — A0; 1 — включён, 0 — выключен.
Если вместо модуля видно большое число (например, 254 вместо 2) — второй ADDSUB8 не вычитает: SUB не на S7.
Вставка урока 5 (Cmd+I)
Нужен ADDSUB8 из урока 4. Стенд урока 4 удали, кроме питания.
# Урок 5 — калькулятор ±. Табло показывает модуль результата, лампа «−» — знак.# Вставка: Cmd+I поверх урока 4 (нужен ADDSUB8). Стенд урока 4 удалить, кроме питания. # --- на холст: тумблеры A, B, SUB; сумматор считает A ± B ---input(A0)input(A1)input(A2)input(A3)input(A4)input(A5)input(A6)input(A7)input(B0)input(B1)input(B2)input(B3)input(B4)input(B5)input(B6)input(B7)input(SUB)ADDSUB8(A0=A0, A1=A1, A2=A2, A3=A3, A4=A4, A5=A5, A6=A6, A7=A7, B0=B0, B1=B1, B2=B2, B3=B3, B4=B4, B5=B5, B6=B6, B7=B7, SUB=SUB, S0=S0, S1=S1, S2=S2, S3=S3, S4=S4, S5=S5, S6=S6, S7=S7, CO=C, V=V)# --- модуль: M = 0 − S, если S отрицательно (S7 = 1), иначе M = 0 + S ---ADDSUB8(A0=GND, A1=GND, A2=GND, A3=GND, A4=GND, A5=GND, A6=GND, A7=GND, B0=S0, B1=S1, B2=S2, B3=S3, B4=S4, B5=S5, B6=S6, B7=S7, SUB=S7, S0=M0, S1=M1, S2=M2, S3=M3, S4=M4, S5=M5, S6=M6, S7=M7)led(S7)led(V)Не получается? Что-то не работает →