Универсальным логическим вентилем (universal logic gate) называется такой логический вентиль , имея который, можно построить все остальные вентили, а в пределе и целый компьютер общего назначения. Такими вентилями являются NAND, он же И-НЕ или штрих Шеффера , а также NOR, он же ИЛИ-НЕ или стрелка Пирса . Рассмотрим все это чуть более детально и с примерами.
Вспомним таблицу истинности для NAND и NOR:
A | B | NAND(A,B) | NOR(A,B) |
---|---|---|---|
0 | 0 | 1 | 1 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 0 |
А вот как эти вентили можно сделать на N-канальных полевых транзисторах :
Получили так называемую NMOS-логику . Именно на ней работает Intel 8080 , или, к примеру, оригинальный Zilog Z80 . Позднее Z80 появился и в CMOS варианте. Конечно, детали чуть сложнее. Так в 8080 на самом деле нет резисторов. Их роль выполняют частично открытые полевые транзисторы, что оказалось удобнее при производстве. Это же является причиной , почему 8080 для работы нужно больше одного напряжения.
Заметьте, что никто не говорил, что высокое напряжение должно означать единицу, а низкое — ноль. Также никто не говорил, что логические вентили обязаны строится на полевых транзисторах. С тем же успехом подойдут биполярные транзисторы, лампы , реле и не только .
Если есть операция NAND, то из нее можно получить NOR , и наоборот . По этой причине они взаимозаменяемы. Имея только NAND или NOR, можно получить любой другой логический вентиль. Это называется NAND-логикой и NOR-логикой соответственно. Используя только NAND-логику или только NOR-логику мы не обязательно получим самую простую реализацию вентиля, но работать будет.
В качестве простого примера рассмотрим, как из NAND получить AND:
Если соединить входы NAND, то получаем NOT. Теперь считаем NOT(NAND(A,B))
и получаем AND(A,B)
. Если в лоб заменять NAND вентили на транзисторы, то понадобится четыре транзистора. Но можно заметить, что для NOT достаточно и одного транзистора. Итого на AND требуется три транзистора.
А так из NOR вентиля можно получить OR:
Все остальные логические вентили получаются из NAND и/или NOR по тем же принципам. Формулы, а также схемы для NMOS, CMOS и т.д. есть в Википедии . По этой причине я не вижу смысла их здесь перерисовывать.
Логических вентилей достаточно для построения АЛУ . Также на NAND или NOR вентилях реализуются триггеры . Триггер — это уже примитив синхронизации между блоками процессора, а также один бит памяти. Объединив воедино много триггеров, получаем статическую память .
Сколько транзисторов нужно, чтобы сделать процессор? В 8-и битном Intel 8080 их содержится 4500 штук. Инженеры Zilog использовали уже 8500 транзисторов в своем Z80. Это более сложный процессор с большим количеством инструкций, оттого в нем и больше транзисторов.
Если подумать, то несколько тысяч транзисторов — это не слишком много, и даже не слишком дорого, особенно если использовать SMD компоненты. Так 5000 штук 2N7002 обойдутся вам примерно в 50-100$, смотря где и в каком количестве вы будете их покупать. При желании можно сделать свой собственный процессор на дискретных компонентах. Более того, такие проекты существуют , и даже не один .
Можно использовать и не транзисторы вовсе. Так Артем Кашканов сначала сделал релейный компьютер BrainfuckPC , а затем ламповый DekatronPC . Также Артем экспериментирует со струйной логикой.
Если не хочется паять, то всегда есть вариант воспользоваться ПЛИС. Когда-то в этом блоге публиковался обзор Icicle , реализации RISC-V процессора на ПЛИС семейства Lattice ICE40. В 2018-м году Icicle требовалось 2500 логических ячеек. Сейчас проект подрос и требует уже 3000 ячеек.
В заключение стоит сказать, что компьютеры вообще-то не обязаны использовать нули и единицы. Например, существовали троичные и десятичные компьютеры. Нынче разработка и производство таких компьютеров, конечно же, экономически нецелесообразны. Однако в качестве хобби, чтобы интересно провести время, радиолюбитель может творить все что пожелает.