Разбираем работу компонента под названием сумматор, который может принимать на вход три значения и складывать их. Строим схему его работы и изучаем реализацию сумматора, собранную на макетной плате из базовых логических вентилей.
Тут кстати можно логически вывести схему исходя из того, как на самом деле происходит суммирование. Можно представить, что сумматор последовательно выполняет следующие действия, а именно он суммирует сначала A и B, потом ещё суммирует с входящим C и при складывании учитывает флаги переноса: 1) Сначала он складывает A и B (s1=A⊕B) и вычиляет значение флага переноса (c1=A&B). 2) Затем он складывает получившееся значение из пункта 1 с входным Cвх (S=s1⊕Cвх). В итоге у нас получается значение S. Тут также вычисляем значение флага переноса (с2=s1&Свх). 3) Объединяем флаги переноса из пунктов 1 и 2 и получаем Cout (Сout=c1ǀǀc2). В итоге получаем ту же самую схему, что и в видео.
Черт, я только что такой же комментарий написал, с объяснениями 🤦♂️ Нужно сначала комментарии читать. Ну, у меня, вроде, чуть больше деталей, в частности о том почему там OR а не еще один полусумматор, так что наверное кому то будет полезен.
Светодиоды всегда нужно подключать с резисторами, потому что он всегда будет потреблять тока больше, чем ему нужно и таким образом, даже если он не сгорел сейчас, то через некоторое время сгорит, если использовать его без резистора
Предлагаю собирать схемы онлайн, так будет нагляднее. Мы видим результат, а его сложно сразу воспринять и повторить. Пожалуйста, сразу поясняйте, где и для чего используется конкретная схема, чтобы люди понимали, что в конечном итоге дадут все получаемые знания.
На самом деле все сильно проще и можно обойтись вообще без таблиц истинности. Первое что нужно понять - зачем это вообще нужно. Ответ - чтобы вычислять сумму многоразрядных чисел с помощью поразрядного сложения, так же как и в школе. Пусть p=a+b, где a, b - многоразрядные числа длиной n разрядов, p - их сумма, тоже n разрядов. Каждый разряд p будет вычисляться по правилу p[i] = (a[i] + b[i]) + c[i] Вот это действие выполняет полный сумматор. При этом, нам нужно вычислить 2 суммы одноразрядных чисел. Значит, нам нужна функция/схема, которая умеет складывать 2 одноразрядных (однобитных) числа - это наш полусумматор. Эта функция возвращает уже 2-разрядное число или, можно считать, что 2 одноразрядных числа - цифру d (младший разряд суммы) и перенос разряда в старший разряд (старший разряд суммы) half_adder(a, b) - > (c, d): с = a AND b d = a XOR b После вычисления первой суммы нам нужно сложить вот это уже 2-битное число результата с 1-битным числом переноса разряда - вторая сумма. А для этого нужно 1) сложить их младшие разряды, взять перенос этой суммы 2) сложить старшие разряды; при этом у второго числа тут 0 (оно ж у нас одноразрядное, помните), но из п.1 может прилететь перенос, значит вот что нужно сделать на этом шаге: сложить старший разряд первого числа с переносом из п. 1 Получается вот такая реализация полного сумматора: func full_adder(a, b, c_in) -> (c_out, d_out) : 1) c1, d1 := half_adder(a, b) 2) c2, d2 := half_adder(d1, c_in) 3) c3, d3 := half_adder(c1, c2) d_out := d2 c_out := d3 return (c_out, d_out) Здесь можно заметить что 1) в 3-м полусумматоре мы не используем вычисленное значение переноса c3 (это значение всегда будет 0,можете проверить по таблицам истинности в видео) а значит от этого полусумматора нам нужна только половина, та которая вычисляет d, то есть, вот эта часть d = a XOR b 2) c1 и с2 никогда совместно не принимают значение 1, можно проверить по таблицам истинности, но, вообще это свойство двоичной системы счисления), значит XOR для таких значений превращается в OR (таблица истинности для XOR и OR отличается лишь для аргументов 1 и 1). Значит вызов 3) превращается в 3) d3 = c1 OR c2 Вот и весь полный сумматор. Как теперь с помощью этого сумматора решить исходную задачу, сложение многоразрядных чисел? Для 8-битных чисел : func add_8b(a, b, c_in) -> (c_out, p) : c_0, d_0 := full_adder(a[0], b[0], c_in) p[0] := d_0 c_1, d_1 := full_adder(a[1], b[1], c_0) p[1] := d_1 ... c_7, d_7 := full_adder(a[7], b[7], c_6) p[7] := d_7 c_out := c_7 То есть, для вычисления каждого разряда результата нужен отдельный аппаратный сумматор, они соединены в цепочку. Более того, квждый сумматор не может начать вычислять разряд, пока не получил перенос от предыдущего сумматора. И это печально, потому что процесс становится сугубо последовательным. Для того чтобы это улучшить, есть отдельные схемы формирования ускоренного переноса. В реальных процессорах (точнее их АЛУ) c_in=0, значит первый полный сумматор можно заменить на полусумматор. А c_out = 1 сигнализирует об ошибке - арифметическое переполнение, вылезли за границу разрядной сетки.
спасибо большое за обучение, жаль что новых видосов больше нет...Хотел спросить ещё марку провода который используете на макетной плате,провод тонкий а изоляция толстая.
да, схему лучше было бы собрать при нас)) было бы нагляднее и понятнее, а времени ушло бы не намного больше, чем на разъяснение постфактум. Спасибо за урок
Очень интересно, для лучшего понимания пересмотрели несколько раз
Собираю полный однобитный сумматор на транзисторе и двух типах резисторов.
Посмотрев это видео понял всю его работу.
Прошел все видео, сейчас собираю сумматор, спасибо
Сегодня собрал свой сумматор, не самый оптимальный, из 5 XOR и 1 AND. Смотрю, кайфую с решения автора.
Можно использовать карту Карно для минимизации схемы
Тут кстати можно логически вывести схему исходя из того, как на самом деле происходит суммирование. Можно представить, что сумматор последовательно выполняет следующие действия, а именно он суммирует сначала A и B, потом ещё суммирует с входящим C и при складывании учитывает флаги переноса:
1) Сначала он складывает A и B (s1=A⊕B) и вычиляет значение флага переноса (c1=A&B).
2) Затем он складывает получившееся значение из пункта 1 с входным Cвх (S=s1⊕Cвх). В итоге у нас получается значение S. Тут также вычисляем значение флага переноса (с2=s1&Свх).
3) Объединяем флаги переноса из пунктов 1 и 2 и получаем Cout (Сout=c1ǀǀc2).
В итоге получаем ту же самую схему, что и в видео.
Хорошее объяснение, спасибо.
Черт, я только что такой же комментарий написал, с объяснениями 🤦♂️ Нужно сначала комментарии читать.
Ну, у меня, вроде, чуть больше деталей, в частности о том почему там OR а не еще один полусумматор, так что наверное кому то будет полезен.
Светодиоды всегда нужно подключать с резисторами, потому что он всегда будет потреблять тока больше, чем ему нужно и таким образом, даже если он не сгорел сейчас, то через некоторое время сгорит, если использовать его без резистора
О да у нас тут гений
Предлагаю собирать схемы онлайн, так будет нагляднее. Мы видим результат, а его сложно сразу воспринять и повторить. Пожалуйста, сразу поясняйте, где и для чего используется конкретная схема, чтобы люди понимали, что в конечном итоге дадут все получаемые знания.
На самом деле все сильно проще и можно обойтись вообще без таблиц истинности. Первое что нужно понять - зачем это вообще нужно. Ответ - чтобы вычислять сумму многоразрядных чисел с помощью поразрядного сложения, так же как и в школе. Пусть p=a+b, где a, b - многоразрядные числа длиной n разрядов, p - их сумма, тоже n разрядов. Каждый разряд p будет вычисляться по правилу
p[i] = (a[i] + b[i]) + c[i]
Вот это действие выполняет полный сумматор. При этом, нам нужно вычислить 2 суммы одноразрядных чисел. Значит, нам нужна функция/схема, которая умеет складывать 2 одноразрядных (однобитных) числа - это наш полусумматор.
Эта функция возвращает уже 2-разрядное число или, можно считать, что 2 одноразрядных числа - цифру d (младший разряд суммы) и перенос разряда в старший разряд (старший разряд суммы)
half_adder(a, b) - > (c, d):
с = a AND b
d = a XOR b
После вычисления первой суммы нам нужно сложить вот это уже 2-битное число результата с 1-битным числом переноса разряда - вторая сумма. А для этого нужно
1) сложить их младшие разряды, взять перенос этой суммы
2) сложить старшие разряды; при этом у второго числа тут 0 (оно ж у нас одноразрядное, помните), но из п.1 может прилететь перенос, значит вот что нужно сделать на этом шаге: сложить старший разряд первого числа с переносом из п. 1
Получается вот такая реализация полного сумматора:
func full_adder(a, b, c_in) -> (c_out, d_out) :
1) c1, d1 := half_adder(a, b)
2) c2, d2 := half_adder(d1, c_in)
3) c3, d3 := half_adder(c1, c2)
d_out := d2
c_out := d3
return (c_out, d_out)
Здесь можно заметить что
1) в 3-м полусумматоре мы не используем вычисленное значение переноса c3 (это значение всегда будет 0,можете проверить по таблицам истинности в видео) а значит от этого полусумматора нам нужна только половина, та которая вычисляет d, то есть, вот эта часть d = a XOR b
2) c1 и с2 никогда совместно не принимают значение 1, можно проверить по таблицам истинности, но, вообще это свойство двоичной системы счисления), значит XOR для таких значений превращается в OR (таблица истинности для XOR и OR отличается лишь для аргументов 1 и 1).
Значит вызов 3) превращается в
3) d3 = c1 OR c2
Вот и весь полный сумматор.
Как теперь с помощью этого сумматора решить исходную задачу, сложение многоразрядных чисел? Для 8-битных чисел :
func add_8b(a, b, c_in) -> (c_out, p) :
c_0, d_0 := full_adder(a[0], b[0], c_in)
p[0] := d_0
c_1, d_1 := full_adder(a[1], b[1], c_0)
p[1] := d_1
...
c_7, d_7 := full_adder(a[7], b[7], c_6)
p[7] := d_7
c_out := c_7
То есть, для вычисления каждого разряда результата нужен отдельный аппаратный сумматор, они соединены в цепочку. Более того, квждый сумматор не может начать вычислять разряд, пока не получил перенос от предыдущего сумматора. И это печально, потому что процесс становится сугубо последовательным. Для того чтобы это улучшить, есть отдельные схемы формирования ускоренного переноса.
В реальных процессорах (точнее их АЛУ) c_in=0, значит первый полный сумматор можно заменить на полусумматор. А c_out = 1 сигнализирует об ошибке - арифметическое переполнение, вылезли за границу разрядной сетки.
А как микросхемы называются, и принципиальную схему скачать можно???
спасибо большое за обучение, жаль что новых видосов больше нет...Хотел спросить ещё марку провода который используете на макетной плате,провод тонкий а изоляция толстая.
Использую одножильный провод калибра 22 AWG. Можно найти на AliExpress.
да, схему лучше было бы собрать при нас)) было бы нагляднее и понятнее, а времени ушло бы не намного больше, чем на разъяснение постфактум. Спасибо за урок
Жирный лайк
Какие диоды стоят?
Схему можно элементов?
Прожег палец паяльником.