*насколько мне известно, если знаете более компактный-пожалуйста напишите!
Не так давно одним махом (за выходные) пересмотрел практически все
видео от Ben Eater, где он на макетных платках из ТТЛ-микросхемок низкой степени интеграции (лог. элементы, триггеры, регистры, шинные формирователи, 4-битные сумматоры) собирает 8-битный компьютер.
По сути, это учебные видео - объясняется, как всё это дело работает. А для меня это напоминание, что процессор не является какой-то совершенно недосягаемой для простых смертных сущностью, которую теперь могут разрабатывать только компьютеры, ибо ни один человек не способен удержать в голове полную схему и пересчитать все состояния. Совсем недавно всё это делалось "на бумажке" - и ничего, работало :)
Как ни странно, чуть ли не самым сложным для реализации на такой рассыпухе оказался
декодер двоичного кода на 7-сегментный индикатор. В конечном итоге, используя классические КНФ/ДНФ, но не шибко погружаясь в карты Карно, он уместился в 53 логических элемента (15 корпусов), решил в итоге, что это перебор даже для него, и реализовал всё на ПЗУ.
Если смотришь на функциональную схему
микросхемки-декодера для 7-сегментного индикатора, там тоже элементов прилично набирается.
Но относительно недавно, в 2011 году, Кори Пловер нашёл схему всего лишь на 11 двухвходовых логических элементах, которая декодирует числа от 0 до 9. Правда, в его постановке задачи можно использовать всевозможные логические элементы - AND, OR, XOR, NAND, NOR, NXOR, и даже заменять один из входов на инверсный. В итоге у него получилось 2 элемента XOR, 4 элемента OR, 5 элементов AND, и 11 инверсий по ходу процесса.
Вчера мне попало Шило в задницу - и решил попробовать уместить эту схему в стандартные ТТЛ-микросхемки. В итоге всё влезло в 4 корпуса: 155ЛА3 (она же латрёшка - 4 элемента 2И-НЕ), 155ЛЕ1 (4 элемента 2ИЛИ-НЕ), 155ЛП5 (4 элемента XOR) и 155ЛН1 (6 инверторов), причём последний также можно заменить на 155ЛА3, а из 4 элементов XOR задействовано только 3.
Оригинальная схема (в алгебраическом виде) приведена в томе 4А Кнута "Искусство программирования" - "Комбинаторные алгоритмы". (какой-то странный символизм - Кнут и Шило)
Обозначения весьма оригинальные: исходное 4-битное число записано как (x1x2x3x4), а затем строятся промежуточные значения x5...x15. Им же (иногда с инверсией) приравниваются выходы a,b,c,d,e,f,g:
x5 = x1 | x2;
x6 = x3 ^ x5;
x7 = (~x2) & x6;
x8 = x4 | x7;
x9 = x6 ^ x8; d = ~x9;
x10 = (~x5) & x8; f = ~x10;
x11 = x2 & (~x9); b = ~x11;
x12 = (~x3) & x9; a = ~x12;
x13 = (~x4) & x10; c = ~x13;
x14 = x4 | x9; e = ~x14;
x15 = x6 | x11; g = x15;
Здесь я применил верилоговские/сишные обозначения:
~ - отрицание,
& - И,
| - ИЛИ,
^ - искл. ИЛИ (XOR).
Далее я ковырял их методом грубого тыка, используя законы Де-Моргана, а также свойство XOR, что отрицание одного из входов приведёт к отрицанию результата, а отрицание обоих входов никак не скажется на результате. И ещё самый первый элемент OR заменил на XOR, поскольку он соединяет два старших разряда, а когда там две единицы, это значения от 12 до 15 - нам на них плевать!
Получил схемку, что нарисована сверху.
Просто ввёл "простой симулятор логических элементов в поисковике" - и он мне выдал
Atanua, в ней и забил, чтобы убедиться в корректности схемы.
Вот файл моей схемы:
https://yadi.sk/d/MMs6FFdObCoFJQ Там можно тыкать по клавишам 0..4 на клавиатуре, переключая соответствующие тумблеры, и смотреть, как меняется результат. Ярко зелёные провода - на которых лог. "1", более тусклые - на которых лог. "0". (ещё бывают красные-неопред. значение, или серые-висят в воздухе).
Ещё мне было интересно, а что будет на выходе, если подать значения от 10 до 15 (Ah..Fh). Вот все состояния:
Да, не очень сгодится для компьютера Бена Итера - здесь нет HEX-значений. Схема с ними тоже в Кнуте приведена, но заметно сложнее - 21 лог. элемент. Её пока лениво было мучать.
Не знаю, есть ли в этом хоть какой-то смысл - когда программируешь ПЛИС, такая схема в лучшем случае синтезируется в 7 ЛЭ, как и самое простое перечисление "на 4'b0000 выдай так, на 4'b0001 выдай эдак, ...", поскольку базовый элемент ПЛИС - это уже 4-х входовой генератор функций (ГФ, он же LUT).
Может пригодиться в каких-нибудь винтажных проектах, или для компьютера в майнкрафте :)