Как работает логическая логика

Carding 4 Carders

Professional
Messages
2,729
Reaction score
1,521
Points
113
логическая логика

Логическая логика влияет на работу компьютеров.

Вы когда-нибудь задумывались, как компьютер может делать что-то вроде балансировки чековой книжки, игры в шахматы или проверки правописания в документе? Это то, что всего несколько десятилетий назад могли делать только люди. Теперь компьютеры делают это с очевидной легкостью. Как может «чип», состоящий из кремния и проводов, делать что-то, что, кажется, требует человеческой мысли?

Если вы хотите понять ответ на этот вопрос в самой основе, первое, что вам нужно понять, - это что-то, называемое булевой логикой. Логическая логика, первоначально разработанная Джорджем Булем в середине 1800-х годов, позволяет отображать довольно много неожиданных вещей в биты и байты. Самое замечательное в булевой логике заключается в том, что, как только вы освоитесь, логическая логика (или, по крайней мере, те части, которые вам нужны для понимания операций компьютеров) становится невероятно простой. В этой статье мы сначала обсудим простые логические «ворота», а затем посмотрим, как объединить их во что-то полезное.

СОДЕРЖАНИЕ
  1. Простые ворота
  2. Простые сумматоры
  3. Полные сумматоры
  4. Шлепки
  5. Вьетнамки JK
  6. Реализация Гейтса

Простые ворота​

bool-not.gif

НЕ ворота

bool-and.gif

И ворота

bool-or.gif

ИЛИ ворота

bool-nor.gif

NOR ворота

Есть три, пять или семь простых ворот, о которых вам нужно узнать, в зависимости от того, как вы хотите их считать (через мгновение вы поймете, почему). С помощью этих простых ворот вы можете создавать комбинации, которые реализуют любой цифровой компонент, который вы можете себе представить. Эти ворота будут казаться здесь немного сухими и невероятно простыми, но мы увидим некоторые интересные комбинации в следующих разделах, которые сделают их намного более вдохновляющими. Если вы еще этого не сделали, перед продолжением будет полезно прочитать, как работают биты и байты.

НЕ Ворота
Простейший возможный вентиль называется «инвертором» или вентилем НЕ. На входе он принимает один бит, а на выходе производит противоположное. Логическая таблица:
А Q
0 1
1 0
Элемент НЕ имеет один вход с именем A и один выход с именем Q («Q» используется для выхода, потому что, если вы использовали «O», вы легко могли бы спутать его с нулем). В таблице показано, как ведут себя ворота. Когда вы применяете 0 к A, Q дает 1. Когда вы применяете 1 к A, Q дает 0. Простой.

И ворота
Логический элемент И выполняет логическую операцию «И» на двух входах, A и B:
BQ
0 0 0
0 1 0
1 0 0
1 1 1
Идея логического элемента И заключается в следующем: «Если А И В равны 1, то Q должно быть равно 1». Вы можете увидеть это поведение в логической таблице для ворот. Вы читаете эту таблицу построчно, вот так:

BQ
0 0 0 Если A равно 0 И B равно 0, Q равно 0.
0 1 0 Если A равно 0 И B равно 1, Q равно 0.
1 0 0 Если A равно 1 И B равно 0, Q равно 0 .
1 1 1 Если A равно 1 И B равно 1, Q равно 1.

ИЛИ Ворота
Следующие ворота - ворота ИЛИ. Его основная идея такова: «Если A равно 1 ИЛИ B равно 1 (или оба равны 1), то Q равно 1.»
BQ
0 0 0
0 1 1
1 0 1
1 1 1
NAND ворота

NAND ворота

Это три основных ворот (это один из способов их посчитать). Также довольно часто можно распознать два других: NAND и NOR. Эти два ворот представляют собой просто комбинацию ворот И или ИЛИ с воротами НЕ. Если вы включите эти два ворот, то счет возрастет до пяти. Вот основная операция вентилей И-НЕ и ИЛИ-ИЛИ - вы можете видеть, что это просто инверсия вентилей И и ИЛИ:
NOR ворота
BQ

0 0 1
0 1 0
1 0 0
1 1 0

NAND ворота
BQ
0 0 1
0 1 1
1 0 1
1 1 0

Последние два гейта, которые иногда добавляются в список, - это вентили XOR и XNOR , также известные как вентили « исключающее ИЛИ » и «исключающее ни» соответственно. Вот их таблицы:
XOR ворота
BQ

0 0 0
0 1 1
1 0 1
1 1 0

XNOR ворота
BQ

0 0 1
0 1 0
1 0 0
1 1 1
bool-xor.gif

XOR ворота.

bool-xnor.gif

XNOR ворота.

Идея логического элемента XOR такова: «Если любое из A OR B равно 1, но НЕ оба, Q равно 1.» Причина, по которой XOR может не быть включен в список шлюзов, заключается в том, что вы можете легко реализовать его, используя исходные три перечисленных шлюза.

Если вы попробуете все четыре различных шаблона для A и B и проследите их по схеме, вы обнаружите, что Q ведет себя как вентиль XOR. Поскольку существует хорошо понятный символ для вентилей XOR, обычно проще думать о XOR как о «стандартном вентиле» и использовать его так же, как AND и OR в принципиальных схемах.

Простые сумматоры​

В статье о битах и байтах вы узнали о двоичном сложении. В этом разделе вы узнаете, как создать схему, способную к двоичному сложению, используя вентили, описанные в предыдущем разделе.
Начнем с однобитового сумматора. Допустим, у вас есть проект, в котором вам нужно сложить отдельные биты и получить ответ. Чтобы начать проектировать схему для этого, сначала посмотрите на все логические комбинации. Вы можете сделать это, посмотрев на следующие четыре суммы:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10
Это выглядит нормально, пока вы не дойдете до 1 + 1. В этом случае вам придется беспокоиться об этом надоедливом переносе. Если вы не заботитесь о переносе (потому что это, в конце концов, проблема с 1-битным сложением), то вы можете увидеть, что вы можете решить эту проблему с помощью логического элемента XOR. Но если вам все равно, вы можете переписать свои уравнения, чтобы всегда включать 2 бита вывода, например:
0 + 0 = 00
0 + 1 = 01
1 + 0 = 01
1 + 1 = 10

Из этих уравнений можно составить логическую таблицу:
1-битный сумматор с выносом
A BQ CO

0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
Посмотрев на эту таблицу, вы можете увидеть, что вы можете реализовать Q с вентилем XOR и CO (перенос) с вентилем AND. Простой.
Что, если вы хотите сложить два 8-битных байта вместе? Это становится немного сложнее. Самое простое решение - разделить проблему на компоненты многократного использования, а затем реплицировать компоненты. В этом случае нам нужно создать только один компонент: полный двоичный сумматор.
Разница между полным сумматором и предыдущим сумматором, который мы рассмотрели, заключается в том, что полный сумматор принимает входы A и B плюс вход переноса (CI). Когда у нас есть полный сумматор, мы можем связать восемь из них вместе, чтобы создать байтовый сумматор и каскадировать бит переноса от одного сумматора к другому.
В следующем разделе мы рассмотрим, как полный сумматор реализован в схеме.

Полные сумматоры​

Логическая таблица для полного сумматора немного сложнее, чем таблицы, которые мы использовали раньше, потому что теперь у нас есть 3 входных бита . Это выглядит так:

Однобитовый полный сумматор с выносом и выносом
CI A BQ CO

0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
bool-full-adder.gif

Полные сумматоры могут быть реализованы самыми разными способами.

Есть много разных способов реализовать эту таблицу. Я собираюсь представить здесь один метод, преимущество которого заключается в простоте понимания. Если вы посмотрите на бит Q, вы увидите, что верхние 4 бита ведут себя как вентиль XOR по отношению к A и B, в то время как нижние 4 бита ведут себя как вентиль XNOR по отношению к A и B. верхние 4 бита CO действуют как вентиль И по отношению к A и B, а нижние 4 бита ведут себя как вентиль ИЛИ. Исходя из этих фактов, следующая схема реализует полный сумматор:
Это определенно не самый эффективный способ реализовать полный сумматор, но его чрезвычайно легко понять и проследить через логику с помощью этого метода. Если вы так склонны, посмотрите, что вы можете сделать, чтобы реализовать эту логику с меньшим количеством ворот.

Теперь у нас есть функция, называемая «полный сумматор». Затем компьютерный инженер создает «черный ящик», чтобы не беспокоиться о деталях компонента. Черный ящик для полного сумматора будет выглядеть следующим образом:
bool-full-adder-bb.gif

bool-8-bit-add.gif

С этим черным ящиком теперь легко нарисовать 4-битный полный сумматор:
На этой диаграмме перенос каждого бита напрямую переходит в перенос следующего бита. 0 жестко зашит в начальный переносимый бит. Если вы введете два 4-битных числа в строки A и B, вы получите 4-битную сумму в строках Q плюс 1 дополнительный бит для окончательного выполнения. Вы можете видеть, что эта цепочка может расширяться сколько угодно, до 8, 16 или 32 бит, если это необходимо.

Только что созданный 4-битный сумматор называется сумматором с волновым переносом. Он получил такое название, потому что биты переноса "колеблются" от одного сумматора к другому. Эта реализация имеет преимущество простоты, но недостаток - проблемы со скоростью. В реальной схеме воротам требуется время для переключения состояний (время порядка наносекунд, но в высокоскоростных компьютерах наносекунды имеют значение). Таким образом, 32-битные или 64-битные сумматоры с переносом пульсаций могут занять от 100 до 200 наносекунд, чтобы прийти к окончательной сумме из-за пульсаций переноса. По этой причине инженеры создали более продвинутые сумматоров называемых ручной касательно последующего сумматоры. Количество шлюзов, необходимых для реализации упреждающего переноса, велико, но время установления для сумматора намного лучше.

Шлепки​

bool-mem2.gif

Простейшая из возможных схем обратной связи с использованием двух инверторов.

Одна из наиболее интересных вещей, которые вы можете делать с помощью логических вентилей, - это создавать с их помощью память. Если вы правильно расставите ворота, они запомнят входное значение. Эта простая концепция является основой RAM (оперативной памяти) в компьютерах, а также позволяет создавать множество других полезных схем.
Память основана на концепции, называемой обратной связью. То есть выход затвора возвращается на вход. Простейшая возможная схема обратной связи с использованием двух инверторов показана выше.

Если вы проследите путь обратной связи, вы увидите, что если Q окажется равным 1, он всегда будет 1. Если он окажется равным 0, он всегда будет 0. Поскольку приятно иметь возможность управлять цепями, которые мы создаем, от этого мало толку, но он позволяет увидеть, как работает обратная связь.

Оказывается, что в «реальных» схемах вы действительно можете использовать такой простой подход с обратной связью инвертора. Ниже показана более полезная схема обратной связи, использующая два логических элемента NAND:
Эта схема имеет два входа (R и S) и два выхода (Q и Q '). Из-за обратной связи его логическая таблица немного необычна по сравнению с теми, которые мы видели ранее:

R S Q Q '
0 0 Незаконный
0 1 1 0
1 0 0 1
1 1 помнит
bool-rs.gif

Логическая таблица показывает, что:
  • Если R и S противоположны друг другу, то Q следует за S, а Q 'является обратным Q.
  • Если оба R и S переключены на 1 одновременно, тогда схема запоминает то, что было ранее представлено на R и S.
Есть еще забавное нелегальное государство. В этом состоянии R и S оба переходят в 0, что не имеет значения в смысле памяти. Из-за недопустимого состояния вы обычно добавляете небольшую логику кондиционирования на входной стороне, чтобы предотвратить его, как показано здесь:
bool-ff.gif

В этой схеме два входа (D и E). Вы можете думать о D как о «данных», а E как о «включении». Если E равно 1, то Q будет следовать за D. Однако, если E изменится на 0, Q запомнит все, что в последний раз видели на D. Схема, которая ведет себя таким образом, обычно называется триггером .
В следующем разделе мы рассмотрим триггер JK.

Вьетнамки JK​

Очень распространенной формой триггера является триггер JK . Исторически неясно, откуда произошло название «JK», но обычно оно представлено в черном ящике следующим образом:
На этой диаграмме P означает «Preset», C означает «Clear», а Clk означает «Clock».
Триггер JK может использоваться для создания защелки, срабатывающей по фронту, что важно для конструкции ЦП.


Триггер JK может использоваться для создания защелки, срабатывающей по фронту, что важно для конструкции ЦП.

P C Clk J K Q Q '
1 1 1 к 0 1 0 1 0
1 1 1 к 0 0 1 0 1
1 1 1 к 0 1 1 Переключает
1 0 х х х 0 1
0 1 х х х 1 0
Вот что говорит таблица: Во-первых, Preset и Clear полностью отменяют J, K и Clk. Итак, если Preset переходит в 0, то Q переходит в 1; и если Clear переходит в 0, то Q переходит в 0 независимо от того, что делают J, K и Clk. Однако, если и Preset, и Clear равны 1, то J, K и Clk могут работать. Обозначение « 1 к 0» означает, что когда часы меняются с 1 на 0, значения J и K запоминаются, если они противоположны. На нижнем фронте тактового сигнала (переход от 1 к 0) сохраняются J и K. Однако, если и J, и K равны 1 на низком фронте, тогда Q просто переключается. То есть Q переходит из текущего состояния в противоположное.

Вы могли бы спросить себя прямо сейчас: «Что в этом мире хорошего?» Оказывается, концепция «срабатывания по фронту» очень полезна. Тот факт, что триггер JK только «фиксирует» входы JK при переходе от 1 к 0, делает его гораздо более полезным в качестве устройства памяти. Триггеры JK также чрезвычайно полезны в счетчиках (которые широко используются при создании цифровых часов). Вот пример 4-битного счетчика с использованием триггеров JK:
bool-counter.gif

Выходы для этой схемы - A, B, C и D, и они представляют собой 4-битное двоичное число. На тактовый вход крайнего левого триггера поступает сигнал, многократно меняющийся с 1 на 0 и обратно на 1 (колебательный сигнал). Счетчик будет считать низкие фронты, которые он видит в этом сигнале. То есть каждый раз, когда входящий сигнал изменяется с 1 на 0, 4-битное число, представленное A, B, C и D, будет увеличиваться на 1. Таким образом, счет будет идти от 0 до 15, а затем снова вернется к нулю. Вы можете добавить к этому счетчику столько битов, сколько захотите, и считать все, что захотите. Например, если вы поместите магнитный выключатель на дверь, счетчик будет считать, сколько раз дверь открывалась и закрывалась. Если вы поместите оптический датчик на дорогу, счетчик сможет подсчитать количество проезжающих машин.
bool-latch.gif

Еще одно использование триггера JK - создание защелки, запускаемой фронтом, как показано здесь.
В этой компоновке значение на D «фиксируется», когда фронт тактовой частоты переходит от низкого к высокому. Защелки чрезвычайно важны при проектировании таких вещей, как центральные процессоры (ЦП) и периферийные устройства компьютеров.

Реализация Гейтса​

bool-relay-inv.gif

В предыдущих разделах мы видели, что с помощью очень простых логических вентилей мы можем реализовать сумматоры, счетчики, защелки и так далее. Это большое достижение, потому что не так давно люди были единственными, кто умел складывать два числа. Приложив немного усилий, нетрудно разработать логические схемы, которые реализуют вычитание, умножение, деление. Как видите, мы не так уж далеки от карманного калькулятора. Отсюда не так уж и далеко до полноценных процессоров, используемых в компьютерах.

Итак, как мы можем реализовать эти ворота в реальной жизни? Мистер Буль придумал их на бумаге, и на бумаге они выглядят великолепно. Однако, чтобы использовать их, нам необходимо реализовать их в физической реальности, чтобы ворота могли активно выполнять свою логику. Сделав этот скачок, мы приступим к созданию реальных вычислительных устройств.

Самый простой способ понять физическую реализацию логической логики - использовать реле. Фактически, именно так были реализованы самые первые компьютеры. Никто больше не реализует компьютеры с реле - сегодня люди используют субмикроскопические транзисторы, выгравированные на кремниевых микросхемах. Эти транзисторы невероятно маленькие и быстрые, и они потребляют очень мало энергии по сравнению с реле. Однако реле невероятно просты для понимания, и они могут очень просто реализовать булеву логику. Благодаря этой простоте вы увидите, что отображение «ворот на бумаге» на «активные ворота, реализованные в физической реальности» возможно и просто. Выполнить такое же сопоставление с транзисторами так же просто.

Начнем с инвертора. Реализовать вентиль НЕ с помощью реле просто: мы собираемся использовать напряжения для представления состояний битов. Мы определим двоичную 1 как 6 вольт, а двоичный 0 как ноль вольт (земля). Затем мы будем использовать 6-вольтовую батарею для питания наших цепей. Таким образом, наши ворота НЕ будут выглядеть так:
[Если эта цифра не имеет для вас никакого смысла, пожалуйста, прочтите, как работают реле, для объяснения.]
На этой схеме вы можете видеть, что если вы приложите ноль вольт к A, то вы получите 6 вольт на Q; и если вы приложите 6 вольт к A, вы получите нулевое напряжение на Q. Очень просто реализовать инвертор с реле!

Аналогично легко реализовать логический элемент И с двумя реле:
bool-relay-and.gif

Здесь вы можете видеть, что если вы приложите 6 вольт к A и B, Q будет иметь 6 вольт. В противном случае на Q будет ноль вольт. Это именно то поведение, которое мы хотим от логического элемента AND. Логический элемент ИЛИ еще проще - просто соедините вместе два провода для А и В, чтобы создать ИЛИ. Вы можете сделать это получше, если захотите, и использовать два реле параллельно.

Из этого обсуждения видно, что из реле можно создать три основных логических элемента - НЕ, И и ИЛИ. Затем вы можете соединить эти физические вентили вместе, используя показанные выше логические схемы, чтобы создать физический 8-битный сумматор с переносом пульсации. Если вы используете простые переключатели для подачи входных сигналов A и B к сумматору и подсоедините все восемь линий Q к лампочкам, вы сможете сложить любые два числа вместе и прочитать результаты на индикаторах («свет горит» = 1, » выключить свет "= 0).

Логическая логика в виде простых вентилей очень проста. Из простых ворот вы можете создавать более сложные функции, например сложение. Физически реализовать ворота можно и легко. Из этих трех фактов вы составили суть цифровой революции и в ее основе поймете, как работают компьютеры.
 
Last edited by a moderator:
Top