Представьте себе инженера, который собирает схему, где два сигнала должны прийти к согласию: выход меняется, только когда оба входа оказались в одном значении. Пока один вход держит ноль, а второй уже поднялся в единицу, выход обязан спокойно сохранять прежнее состояние. На бумаге всё сводится к одной логической функции. В кремнии задержки транзисторов живут по своим законам: один путь срабатывает быстрее, другой медленнее, и схема, формально совпадающая с уравнением, неожиданно начинает вести себя иначе. Как отличить реализацию, которая сохранит смысл при любых задержках, от той, что способна зациклиться или расходовать энергию на короткое замыкание? Этот вопрос разбирает инженер Борис Цирлин в статье на Хабре, посвящённой приёмам КМОП-схемотехники на примере Г-триггера.
Г-триггер, он же C-элемент Маллера, занимает важное место в асинхронной схемотехнике. Его выход меняется только тогда, когда все входы сравнялись: стали нулями или единицами. В статье рассматривается двухвходовой вариант. Обычно предполагают, что при переходе от нулевого набора к единичному входы только растут, а в обратную сторону только убывают; кроме того, нулевой или единичный набор держится, пока выход не подтвердит изменение. В этих рамках работоспособной автор называет такую реализацию, которая «при любых величинах задержек её элементов и при любых их соотношениях не допускает нарушений функционирования Г-триггера ни при каких возможных изменениях значений его входов». Требование сильное: произвольными считаются задержки элементов, но проверка идёт только при допустимых изменениях входов, описанных в предыдущем предложении.
Чтобы проверить такое свойство, нужно воспроизвести все допустимые варианты изменения входов. Автор использует приём из литературы по апериодическим автоматам: выход Г-триггера замыкают на каждый его вход через отдельный инвертор. Получается интерпретирующая схема, где инверторы моделируют внешнюю среду. После переключения выхода входы могут обновиться в произвольные моменты, определяемые задержками этих инверторов. Поскольку на задержки ограничений нет, допустимо даже, чтобы входы изменились сразу после выхода: задержки могут быть нулевыми.
Дальше вводится понятие возбуждённого выхода. Выход элемента устойчив, если в данном состоянии его значение совпадает со значением логической функции, описывающей элемент. Если не совпадает, выход возбуждён. Возбуждённый выход может стать устойчивым двумя способами: изменить собственное значение через свою физическую задержку либо дождаться изменения входного набора, из-за которого функция подстроится под неизменившийся выход. Второй путь опасен: он способен привести к состязаниям. Полумодулярной называют схему, в которой в каждом рабочем состоянии возбуждённый выход может стать устойчивым только первым способом, то есть изменившись сам. Плюс различают константные состояния, из которых элемент уже никогда не переключится, и живые, в которых такой вечной остановки нет.
Критерий из цитируемой автором статьи получается двойным. Реализация Г-триггера считается работоспособной тогда и только тогда, когда в замкнутой через инверторы схеме существует состояние, где все инверторы возбуждены и схема полумодулярна относительно этого состояния, и это состояние является живым для выходного элемента Г-триггера. Первое условие отсекает схемы с опасными состязаниями, второе — схемы, в которых выход может «заснуть» и перестать реагировать. Важно, что это критерий для абстрактной модели, а не прямое описание кремниевой схемы.
Пример неработоспособности помогает понять, зачем нужна такая строгость. Автор берёт преобразование логического уравнения Г-триггера и получает схему, которая на бумаге эквивалентна исходной. Допустим, из-за повышенной задержки на выходах двух элементов нижнего яруса «застряла» единица, и такое же значение остаётся на выходе инвертора. Тогда оставшиеся три элемента образуют генератор: выход Z начинает циклически меняться между нулём и единицей при фиксированном значении одного из входов. Это прямое нарушение алгоритма Г-триггера. Причина в том, что выделенная часть схемы реализует элемент И-ИЛИ, нарушающий принятое допущение о задержках: логическая составляющая считается безынерционной, а задержка приписывается только выходу элемента. В реальной схеме задержки распределены иначе.
Здесь стоит задержаться на границе модели. Допущение о безынерционной логике и произвольной выходной задержке удобно для формального анализа, но сам автор оговаривает: насколько реальные логические элементы соответствуют этой гипотезе, в статье не рассматривается. Это не мелочь. Критерий полумодулярности доказан для одной идеализации, а инженеру нужно понимать поведение другой системы — транзисторной. Между ними есть зазор, и статья честно его показывает.
Переход к КМОП-реализациям этот зазор расширяет. Классическая схема по логическому уравнению требует 12 транзисторов; образец из авторского свидетельства СССР № 1324106, построенный на известных асинхронных примитивах вроде ячейки Давида и триггера на И и ИЛИ, — 30. Компактные варианты идут по другому пути: они отступают от исходного уравнения, но сохраняют алгоритм работы. Восьмитранзисторная схема состоит из входной цепи на четырёх последовательных транзисторах и ячейки памяти из двух инверторов. При равных входах средняя точка задаёт выход; при разных входная цепь разорвана, и инвертор обратной связи держит прежнее напряжение. Алгоритм формально корректен.
Но появляется новая неприятность. Когда входы выравниваются, входная цепь сталкивается с противодействием инвертора обратной связи. Геометрию транзисторов оптимизируют в пользу входной цепи, чтобы она «побеждала» в этом конфликте, однако в момент переключения оба пути открыты одновременно. Через них течёт сквозной ток — короткое замыкание, снижающее энергоэффективность. Автор формулирует это как качественный вывод, без численных оценок тока или энергии. И добавляет важное ограничение: формально при значительной задержке инвертора обратной связи нарушается полумодулярность, ведь его возбуждённый выход переходит в устойчивое состояние без изменения собственного значения. Но понятие возбуждённого выхода для этого элемента не работает: значение меняется принудительно ещё до смены входа. Поскольку такие эффекты типичны для КМОП, вопрос полумодулярности для этих схем в статье не рассматривается.
Это ключевое расхождение. Логическая корректность и отсутствие сквозных токов — разные критерии. Схема может безупречно реализовывать алгоритм Г-триггера и при этом тратить энергию в моменты переключения. И наоборот, критерий произвольных задержек сформулирован для абстрактных элементов, а в кремнии возбуждённый выход может вести себя иначе. Поэтому нельзя прочитать статью как доказательство того, что восьмитранзисторная схема плоха, а двенадцатитранзисторная хороша в практическом смысле. Автор сравнивает структуры и указывает на конкретный механизм потерь, не давая измерений.
Пятитранзисторный вариант, основанный на авторском свидетельстве СССР № 1411934, доводит этот компромисс до предела. По сути это элемент 2ИЛИ-НЕ с p-канальным проходным транзистором, соединяющим входы; затвор подключён к выходу, создавая обратную связь. Когда оба входа нулевые, на выходе единица, проходной транзистор открыт и входы замкнуты. Ни один вход не может перейти в единицу без другого. Когда оба входа единичные, выход падает в ноль, проходной транзистор закрывается, и новая единица на выходе появится только после возврата обоих входов в ноль. Алгоритм Г-триггера соблюдён, хотя выход инверсный. Недостаток тот же: в одной из фаз входы «мешают друг другу» и возникает короткое замыкание. Это сознательно допущенный дефект ради экономии транзисторов.
Автор предлагает и собственный нетрадиционный приём. В классических схемах лишним кажется инвертор, формирующий сигнал Z обратной связи. Если его убрать, останется только инверсия этого сигнала. Тогда транзисторы, на затворы которых он подавался, нужно заменить на транзисторы противоположного типа. Получаются две десятитранзисторные схемы. Риск известен: «чужие» транзисторы искажают сигнал на величину порогового напряжения, а если искажённый сигнал попадает на затвор другого «чужака», искажение может накапливаться лавинообразно, оставляя выход в средней точке между нулём и единицей. В рассматриваемом случае, по оценке автора, выход устанавливается через «родные» цепи, а «чужаки» срабатывают уже при корректном напряжении на стоке, поэтому такой лавины не происходит. Это инженерное рассуждение, а не результат моделирования.
В финале автор выходит за пределы Г-триггера. Если можно заменить один транзистор на противоположный тип, почему не все? Фактически это обмен полюсов питания. Исходная схема, реализующая логическую функцию, после такой замены даст её инверсию. Коллеги, по словам автора, предупреждали, что сгорят защитные диоды, но переполюсовка предполагалась на этапе проектирования, когда диодов ещё нет. Простейший случай — инвертор, превращающийся в повторитель. Автор отмечает, что такой повторитель уже описан в патенте US5929669A как комплементарный двухтактный КМОП-истоковый повторитель для аналогового видеобуфера. Это любопытная точка пересечения: приём, найденный при разборе асинхронной логики, оказывается давно известным в аналоговой схемотехнике под другим именем.
Чего в статье нет, так это численных данных. Нет параметров транзисторов, напряжения питания, временных диаграмм, результатов SPICE-моделирования или лабораторных измерений. Вывод о снижении энергоэффективности качественный: короткое замыкание существует, но насколько велик ток и как он зависит от технологии, не показано. Монография «Апериодические автоматы» под редакцией Варшавского и обзор по реализации схем в базисе И-НЕ упоминаются как источники формального критерия, однако в доступном материале их формулировки и доказательства отсутствуют. Поэтому статью правильно читать как инженерный разбор идей, а не как экспериментальное подтверждение характеристик конкретных схем.
Для читателя, который сталкивается с проверкой подобных утверждений в учебной или исследовательской работе, здесь есть методический урок. Формальный критерий работоспособности всегда привязан к модели. Перенос критерия с логических элементов на транзисторную схему требует отдельного обоснования: что считать возбуждённым выходом, как учесть сквозные токи, какие задержки действительно возможны. Если этого обоснования нет, утверждение «схема корректна при любых задержках» остаётся утверждением о чертеже, а не о кремнии. Похожая логика применима и к оценке источников в научной работе: важно различать, что доказано в рамках идеализации и что показано для реального объекта. Разбор того, как отбирать и проверять источники для обзора, помогает удерживать эту границу.
Остаётся и собственно научный вопрос, который автор фиксирует без пафоса. Полумодулярность — важное понятие теории Маллера, но в КМОП-схемотехнике оно часто неприменимо из-за принудительного изменения выходов. На данном этапе это направление автор называет бесперспективным. Значит, нужен другой формальный язык для описания корректности транзисторных асинхронных схем, такой, который учитывал бы и логику переключений, и токовые пути. Пока такого языка в статье нет. Есть конкретные схемы, честно описанные компромиссы и приём, который связывает цифровую асинхронику с аналоговым буфером. Это не финальная точка, а приглашение к более аккуратной постановке задачи.
Источники и литература

Фото: Ivan Chumak / Pexels