Урок 5. Калькулятор ±: минус на лампе, модуль на табло

В картинках

После этого урока у тебя будет калькулятор: набираешь два числа, выбираешь «+» или «−» — и видишь ответ со знаком, 3 − 5 → «−» и 2. Этим уроком набор закончен: в нём уже есть всё, чем процессор считает. Урок 6 — бонус.


5.1. Идея: модуль — это ещё одно вычитание

Табло умеет показывать только числа без знака. Если показать на нём 3 − 5 как есть, увидим 254 — это −2 в дополнительном коде, но человек так не читает. Нужно показать отдельно знак и отдельно модуль.

  • Знак — это флаг N, старший бит ответа S7. Его показывает лампа «−».
  • Модуль отрицательного числа — это оно же с обратным знаком: 0 − S. А вычитать мы уже умеем.

Второй ADDSUB8 считает 0 + S или 0 − S, и что из двух — решает сам ответ: его S7 подан на SUB. Ответ положительный — второй сумматор прибавляет к нулю и пропускает его как есть. Отрицательный — вычитает из нуля и переворачивает знак.

A = 3B = 5SUB = 1ADDSUB8A ± BS = 1111 1110(254 = −2)0A = GNDS7 = 1 → SUBADDSUB80 − SM−
Калькулятор ± на примере 3 − 5. Первый ADDSUB8 считает S = 254 — это −2 в дополнительном коде, старший бит S7 = 1. S7 зажигает лампу «−» и заставляет второй ADDSUB8 вычитать: 0 − S = 2. Табло показывает модуль, лампа — знак.

Числа набирай от 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…A0BТумблеры B7…B0SUBТабло MЛампыЭто
30000 001150000 010112−3 − 5 = −2
1000110 0100270001 10110127—100 + 27 = 127
100000 10101000110 0100190−10 − 100 = −90
1270111 11111270111 111110—127 − 127 = 0
420010 101000000 0000142—42 − 0 = 42
1000110 0100500011 00100—V150 больше 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)

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