В прошлом уроке мы познакомились с полусумматором. Это была наша первая вычислительная схема: она складывала два бита и показывала результат и перенос. Но у полусумматора был один серьёзный недостаток: он не умел учитывать перенос из предыдущего разряда.
Почему это так важно? Потому что в реальности процессор не складывает один бит с другим — он работает хотя бы с байтами, то есть с восемью битами одновременно. А при сложении многобитных чисел почти всегда возникает перенос. Представьте, что мы складываем два числа: 1011 и 0111. Сначала складываются младшие биты: 1 + 1 = 10. Мы должны записать 0, а единицу передать в следующий разряд. Но если использовать только полусумматоры, мы не сможем правильно учесть эту единицу. Именно поэтому нам нужен полный сумматор.
Полный сумматор — это логическая схема, которая складывает не два, а три входа. Два из них — это наши основные биты A и B, а третий — это перенос из предыдущего разряда, который обычно называют Cin. У полного сумматора также два выхода: сумма (S) и перенос (C).
Работает он так: складываем A и B, а потом учитываем, есть ли перенос из предыдущего разряда. Таким образом, полный сумматор решает задачу многобитного сложения. Каждый разряд числа складывается с учётом того, что «передал» ему предыдущий.
Чтобы понять работу полного сумматора, снова посмотрим таблицу истинности. На входе три значения: A, B и Cin. На выходе два значения: сумма (S) и перенос (C).
Если внимательно рассмотреть эту таблицу, то можно заметить интересный факт: полный сумматор на самом деле можно построить из двух полусумматоров и одного элемента OR (Cin = Сумма (S) OR Перенос (С)). Сначала полусумматор складывает A и B. Затем второй полусумматор складывает результат с Cin. А итоговые переносы складываются с помощью OR, чтобы получить C.
Теперь можно представить схему. На вход идут A, B и Cin. Сначала они попадают в первый полусумматор, затем во второй. А выходы переносятся на элемент OR. В результате мы получаем два сигнала: сумма и перенос.
Представим, что мы складываем A = 1, B = 1 и перенос из предыдущего разряда равен 0. Тогда результат будет сумма = 0, перенос = 1. Если же к этим же входам добавить перенос Cin = 1, то сумма уже станет равна 1, а перенос сохранится равным 1. То есть полный сумматор действительно учитывает всё, что ему передали.
Ещё пример: A = 0, B = 1, Cin = 1. Сначала 0 + 1 = 1. Потом этот результат складываем с Cin = 1, получаем 10 в двоичной системе. Итог: сумма = 0, перенос = 1.
Теперь становится понятно, почему полный сумматор важен для процессора. Он — основной строительный блок многобитных сумматоров о которых мы поговорим в следующем уроке. Чтобы сложить байт, процессор соединяет восемь полных сумматоров цепочкой: перенос от младшего разряда передаётся на следующий, затем на следующий, и так до самого старшего разряда. В результате процессор умеет складывать целые числа.
Полный сумматор — это пример того, как простые логические схемы начинают выполнять работу, похожую на настоящую математику. Именно благодаря ему процессор получает способность к арифметике. В будущем мы увидим, что на базе полного сумматора строятся не только сложение, но и вычитание, а ещё множество других операций.
Еще разок. Чтобы объяснить работу полного сумматора, можно сравнить её с привычным сложением в столбик. Когда мы складываем многозначные числа, мы начинаем с правого края. Складываем две цифры. Если получается больше девяти, мы пишем только последнюю цифру, а единицу переносим в следующий разряд. В двоичной системе то же самое: складываем два бита, и если получается больше единицы, переносим дополнительный бит дальше. Полусумматор умел только складывать «две цифры», а полный сумматор уже учитывает «единицу сверху», которую мы переносим из прошлого разряда.
Спасибо за внимание!