Комбинационная и последовательная логика: в чём разница
Вся цифровая схема делится на два вида, и различие между ними проходит по одной черте: помнит ли схема предыдущее состояние. Комбинационная схема забывает всё сразу, последовательная — помнит до тех пор, пока не придёт такт. На уровне принципиальной схемы это выглядит как разница между вентилями без обратной связи и узлами, у которых есть вход Clock. Разберём, где проходит граница и почему процессор не может быть собран только из одного из двух видов. Где проходит эта граница в общей картине предмета, показано на странице «Схемотехника».
Один вопрос, который всё определяет
Возьмите любую схему и задайте ей один вопрос: что будет на выходе, если входы вернутся к тем значениям, которые были раньше? Если ответ «то же самое, что и тогда», схема комбинационная: у неё нет памяти. Если ответ «зависит от того, что было между», перед вами последовательная схема.
Формально разница выглядит так. Комбинационная схема описывается функцией выхода от входов, Y = f(X). Последовательная добавляет переменную состояния, Y = f(X, S), и отдельный блок, который состояние обновляет. Пока состояние не меняется, схема ведёт себя как комбинационная, поэтому последовательная схема всегда содержит комбинационную внутри.
| Свойство | Комбинационная | Последовательная |
|---|---|---|
| Память | Нет | Есть: элемент состояния |
| Такт | Не нужен | Нужен, иначе состояние меняется само |
| Как описывается | Таблица истинности, карта Карно | Таблица состояний, диаграмма переходов |
| Выход | Менется сразу после изменения входов | Меняется в момент такта |
| Чувствительность к задержке | Суммируется по всей цепочке вентилей | Та же плюс требования к моменту срабатывания |
| Примеры | Вентили, сумматор, мультиплексор, дешифратор, ROM | Триггер, регистр, счётчик команд, RAM |
Комбинационная часть: таблица истинности вместо истории
Комбинационная схема — это вентили, соединённые так, что на выходе нет ни одной петли. Подали на входы набор значений, и вентили последовательно отработали: сигнал прошёл через задержку каждого, и на выходе установилось новое значение. Оно зависит только от того, что подано сейчас, и никакой истории в схеме нет. Ровно поэтому любую комбинационную схему можно описать таблицей истинности и проверить до того, как в неё попадут транзисторы. Карты Карно, о которых отдельная статья, существуют ровно для этого: они превращают таблицу в готовое соединение вентилей.
Важная деталь про задержку. Мгновенной комбинационная схема не бывает: на выходе новый результат появляется не сразу, а через время задержки, которое складывается по цепочке. Пока сигнал пересчитывается, на выходе может быть промежуточное значение, которое в таблице истинности не встречается. Короткий импульс в середине схемы — это нормальная вещь, и проверяющий код её не увидит. Именно поэтому такт в процессоре выбирают так, чтобы к его концу вся комбинационная часть успела посчитать.
Последовательная часть: состояние, которого нет на листе
Последовательная схема добавляет к логике элемент, который умеет помнить один бит. В D-триггере этот бит живёт между тактами: на входе D стоит значение, на выходе Q — значение, записанное в прошлый такт. Пока тактов нет, триггер держит Q и не смотрит на D. Так появляется схема, у которой два одинаковых входа дают разный выход в зависимости от того, когда их посмотрели.
Из этого одного бита получается всё остальное состояние. Регистр на восемь битов — это восемь триггеров с общим тактом. Счётчик команд хранит в триггерах номер инструкции и на каждом такте увеличивает его на единицу или загружает адрес из шины. ОЗУ хранит в ячейках то, что записали в прошлый такт, и выдаёт содержимое ячейки по адресу. Заметьте: чтение содержимого ничем не отличается от комбинационной логики, память живёт только в момент записи.
Как отличить на схеме
На схеме у последовательной части два признака. Первый — обратная связь: выход уходит обратно на вход. Второй — вход такта, отмеченный значком, похожим на треугольник, или буквой с чертой над ней. Если на схеме есть вход Clock и выход, который возвращается на вход, всё, что между ними, — последовательная часть. Если блок не имеет входа такта и ни одна его линия не возвращается назад, перед вами комбинационная часть.
Петля обратной связи — не ошибка, а признак состояния. Единственное место в процессоре, где состояние меняется не по такту, — это блок памяти внутри кристалла: там при выключении питания и без тактовой обвязки содержимое сохраняется. Учебный процессор можно тактировать по одному такту, нажимая кнопку, — тогда появление нового состояния видно глазами, сразу после щелчка.
Между регистрами: почему процессор разбит на вентили
Здесь становится понятно, зачем в процессоре много регистров. Схема, полностью построенная из вентилей без регистров, выдала бы правильный ответ, но ждала бы его очень долго: сигнал прошёл бы через десятки тысяч вентилей, и каждый добавил бы свою задержку. Вместо одного такта на всю операцию пришлось бы ждать сумму всех задержек.
Регистры разбивают схему на короткие комбинационные участки. Каждый участок называется конвейерной ступенью, а между ступенями стоит регистр, который запоминает результат предыдущей ступени. Пока идёт один такт, работают все ступени сразу, но каждая по своим данным. Длина ступени ограничена задержкой: чем короче цепочка вентилей, тем меньше времени отводится на ступень. Отсюда растёт тактовая частота — тот же процессор, разбитый на большее число регистром, работает быстрее при той же технологии. Каскады и сумматоры в этом курсе собираются именно как ступени с регистрами между ними, а не как один гигантский комбинационный блок, и в разборе анатомии сумматора видно, где проходит граница.
Второе следствие такого разбиения: за один такт схема не может «отменить» уже записанное состояние. Всё, что попало в регистр, остаётся до следующего такта. Отсюда у компилятора ограничение: если два обращения к памяти идут подряд, и второй адрес зависит от результата первого, процессор не может выполнить их за один такт и нужен либо отдельный такт ожидания, либо обход пути, описанный в статье про задержку распространения.
Как это устроено в симуляторе
В симуляторе этого курса тип узла виден по его поведению, а не по подписи. Вентили NAND, AND, OR, XOR, мультиплексор, дешифратор, сумматор, компаратор и ПЗУ отрабатывают за один проход симуляции: их выход пересчитывается, пока меняются входы. Узлы DFF, регистр, счётчик команд, индексный регистр, генератор псевдослучайной последовательности и ОЗУ хранят значение между тактами, поэтому симуляция для них трёхфазная: сначала все узлы считают новое значение, потом все состояния фиксируются, и только после этого изменения расходятся дальше.
Второй признак виден в интерфейсе: у триггеров, регистров и счётчика на корпусе показано текущее значение, потому что состояние важно для человека. У вентилей такой цифры нет, и в списке узлов у них нет входа Clock. Ровно это и отличает последовательный узел от комбинационного в том же самом симуляторе.
Чем комбинационная логика отличается от последовательной?
Комбинационная схема выдаёт результат, который зависит только от текущих входов: закрыли входы, и через время задержки на выходе снова стабильное значение. Последовательная схема помнит предыдущее состояние, поэтому результат зависит не только от входов, но и от того, что было до. Простейший пример последовательной схемы — D-триггер, который меняет выход только по такту.
Как понять на схеме, где комбинационная часть, а где последовательная?
Ищите два признака: обратную связь, то есть выход, который возвращается на вход, и шину такта, которая подходит к блокам. Пока сигнал не прошёл через такт, он комбинационный. Есть обратная связь или есть вход Clock — перед вами последовательная схема.
Может ли вся схема быть комбинационной?
Да, но тогда у неё нет памяти. Комбинационная схема не может хранить число, адрес или результат предыдущей операции: как только входы вернулись к прежним значениям, выход вернётся к прежнему результату. Память в процессоре, в счётчике и в любом устройстве с состоянием обеспечивают триггеры.
Нужны ли тактовые сигналы сумматору?
Нет. Сумматор — чисто комбинационная схема: сменились операнды, и через время задержки на выходе появилась новая сумма. Такт нужен только для записи результата в регистр, чтобы следующая операция читала устойчивое значение, а не то, что успело просчитаться к середине такта.
Проверьте себя
Схема на входе всегда выдаёт 0, что это значит?
Два варианта. Если схема комбинационная, она в каждый момент выхода выдаёт результат текущей комбинации, и «всегда 0» означает, что входы не доходят до схемы, а не то, что логика сломана: проверьте, что вход действительно подключён. Если в схеме есть регистр, «всегда 0» почти всегда означает, что такта не было. Регистр не смотрит на свой вход сам по себе, он берёт значение только в момент такта, поэтому без такта любой вход даёт нулевое состояние.
Можно ли построить процессор только из комбинационных схем?
Теоретически да, практически нет. Процессору нужно помнить номер команды, содержимое регистров и адрес, и всё это требует памяти, а память в кремнии делается на триггерах. Чисто комбинационная схема способна посчитать, но не способна запомнить. При этом корпус процессора наполнен комбинационной логикой: сумматоры, дешифраторы, блоки выбора. Такт нужен не всей схеме, а тем точкам, где значение переживает границу ступени.
Зачем процессору ПЗУ, если это «просто таблица»?
ПЗУ в этом курсе — комбинационная схема: адрес на входе, команда на выходе, такта нет. Роль у него особая: это место, где процессор берёт себе следующую операцию. Адрес приходит из счётчика команд, а содержимое — мгновенная функция от адреса, поэтому стадия чтения команды не требует такта на своей стороне. Такт нужен, чтобы счётчик команд успел перейти к следующему адресу, а не самой таблице.
Читать символы на листе помогает разбор того, как читать принципиальную схему, а как состояние появляется из вентилей, показано в статье про такт и D-триггер. Общее устройство процессора разобрано в как работает процессор.