Архитектура компьютерных систем 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, на основе которого будем реализовывать более сложные вещи. Наша иерархия пакетов будет похожа иерархию абстракций реального компьютера. Исходный код можно найти здесь.
Источник: https://habr.com/ru/post/476100/


Интересные статьи

Интересные статьи

Если вы пользуетесь Linux с ранних дней появления этой ОС (или если, вроде меня, начинали с Unix), то вам не надо очень быстро и в больших количествах изучать то новое, что появляется в с...
Предположим, у нас есть мобильный тонкий клиент, слабенький, с плохим каналом связи, и нам нужно с его помощью показывать один из статусов сложной системы. Такой, которая определяется бол...
Долгое время считалось, что классический метод аутентификации, основанный на комбинации логина и пароля, весьма надёжен. Однако сейчас утверждать такое уже не представляе...
(с) Среди ученых ходит байка о нетривиальном способе сделать свой доклад интересным и увлекательным. Во время выступления нужно выбрать в зале самого недоумевающего, самого потер...
В 2017 году мы выиграли конкурс на разработку транзакционного ядра инвестиционного бизнеса Альфа-Банка и приступили к работе (на HighLoad++ 2018 с докладом о ядре инвестиционного бизнеса выст...