[Из песочницы] Архитектура компьютерных систем 1 часть. Логические вентили
Логические элементы
Доброго времени суток, я начинаю серию статей по написанию виртуальной машины на языке Golang. Я выбрал этот язык так как он прост для чтения и имеет в стандартной библиотеке уже необходимые функции, которые пригодятся в дальнейшем.
Эта статья не несёт в себе абсолютно никакой новой информации для тех, кто умеет составлять таблицы истинности для простых логических вентилей. Если вы это умеете, то не тратьте время и переходите ко второй части.
Логический вентиль это устройство с одним или несколькими входами и одним или несколькими выходами. В этой части будем рассматривать только самые простые из них. Для моделирования вентилей мы будем использовать только сигналы 0 и 1, не используя входные, выходные характеристики реальных вентилей.
Так как мы будем работать с Golang, то каждый элемент можно представить в виде функции.
В Go функция выглядит так:
func имя(имя переменной тип переменной) тип возвращаемого значения {
    //код
    return имя возвращаемой переменной
}
Буфер
Это самый простой элемент имеющий один вход и один выход. На практике используется для усиления сигнала или создания задержки, иногда можно заменить проводником.
| a | BUF a |
| 0 | 0 |
| 1 | 1 |
в случае с буфером наша функция будет выглядеть так:
func buf(v bool) bool {
    return v
}
Инвертор
Тот же самый буфер, только на выходе инвертирует сигнал.
| a | NOT a |
| 0 | 1 |
| 1 | 0 |
в случае с инвертором функция будет выглядеть так:
func inv(v bool) bool {
    return !v
}
ИЛИ
Этому элементу необходим хотя бы один сигнал равный 1, чтобы на выходе получить 1.
| a | b | a OR b |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
func or(v, s bool) bool {
    return v || s
}
И
Всегда возвращает 1, когда на все его входы подаётся 1, во всех остальных случаях он возвращает 0.
| a | b | a AND b |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
func and(v, s bool) bool {
    return v && s
}
Исключающее ИЛИ
Для того, чтобы на выходе получить 1, нужно чтобы на вход подавались разные сигналы (0 и 1) или (1 и 0). Эта операция является полезной, так как позволяет поменять местами две переменные без использования дополнительной памяти.
| a | b | a XOR b |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
func xor(v, s bool) bool {
// написать (v ^ s) мы не можем потому, что для bool такой операции в языке нет, поэтому юзаем костыль
    return (v || s) && !(v && s)
}
ИЛИ-НЕ
Работает как элемент ИЛИ, только к его выходу подсоединён инвертор, с которого получаем сигнал.
| a | b | a NOR b |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
func nor(v, s bool) bool {
    return !(v || s)
}
НЕ-И
Элемент работает точно так же, как элемент И, только на выходе инвертируется сигнал.
| a | b | a NAND b |
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
func nand(v, s bool) bool {
    return !(v && s)
}
Исключающее ИЛИ с инверсией
Элемент работает точно так же, как элемент ИЛИ, только на выходе инвертируется сигнал.
| a | b | a XNOR b |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
func xnor(v, s bool) bool {
// и тут костыль
    return !(v || s) && !(v && s)
}
Теперь, когда функции написаны, можно их собрать в пакет Gate, на основе которого будем реализовывать более сложные вещи. Наша иерархия пакетов будет похожа иерархию абстракций реального компьютера. Исходный код можно найти здесь.
Роботы научились прыгать и хватать предметы благодаря живым мышцам: био-гибридный прорыв ETH Zurich
Micron вдвое увеличила плотность флеш-памяти и преодолела порог в 400 слоёв NAND
Corsair научила блок питания аварийно отключать видеокарту, чтобы защитить разъём от оплавления
Впервые лазер смог превратить плазму в передатчик радиосигнала
Ноутбук толщиной 1,8 см с 128 ГБ памяти и графикой Blackwell: представлен Dell XPS 16 Creator Edition
inDrive запустит роботакси в Астане в 2027 году и попробует потеснить Uber, несмотря на 40-градусные морозы
Blackview показала неубиваемый смартфон с 225-кратным зумом и батареей на 12 000 мА·ч
ИИ-дата-центры смогут опреснять воду за счёт своего тепла: до 750 000 литров в сутки на каждый мегаватт