Как работают триггеры: секреты последовательной логики
full adder
Flip‑flop (в буквальном смысле «шлепанец») — это фундамент, благодаря которому современные процессоры и любые интегральные микросхемы обрели способность сохранять данные.
Рассмотрим абстрактную логическую схему: у нее есть вход и выход. Логично, что выход напрямую зависит от текущего входного сигнала. Но каким образом из комбинационной логики, лишенной памяти, удалось создать архитектуру, способную фиксировать значение и использовать его для дальнейших операций?
В этом материале я предлагаю:
-
разобрать эволюцию возникновения ячеек памяти;
-
попутно проанализировать природу метастабильности и проблем, связанных с временем установки (setup) и удержания (hold) данных.
Начнем с основ. Любая комбинационная логика описывается методами булевой алгебры. К примеру, сумматор трех битов можно представить следующим образом:
Математически это выглядит так:
Такие схемы статичны — выход зависит лишь от текущего состояния входов. Но чтобы «запомнить» данные, нам нужно внутреннее состояние. Самый простой способ добиться этого — создать обратную связь, соединив выход схемы с ее же входом.

Это кажется контринтуитивным, но подобная структура действительно способна хранить бит. Однако у нее есть минус: мы не можем легко перезаписать значение, так как сигнал зациклен бесконечно. Нам нужен переключатель — мультиплексор (MUX), который позволит выбирать между удержанием текущего значения и записью нового.

Сигнал clk выступает управляющим: при 0 схема переходит в режим хранения, при 1 — в режим записи данных с входа D. В теории это D-защелка (D-latch), но на практике симуляция может показать неожиданный результат.
`timescale 1us / 1ns
module custom_d_latch(
output wire Q,
input clk, D
);
wire D_and_out, Q_and_out, inv_clk;
not (inv_clk, clk);
and (D_and_out, D, clk);
and (Q_and_out, Q, inv_clk);
or (Q, D_and_out, Q_and_out);
endmodule
module stimulus;
localparam DELAY=1;
reg clk=0, D=1;
wire Q;
custom_d_latch dl(.clk(clk), .D(D), .Q(Q));
initial begin
$monitor("Q=%d", Q);
set_q(1'b0);
set_q(1'b1);
end
task set_q(input d);
begin
D=d;
clk=1;
#DELAY;
clk=0;
#DELAY;
end
endtask
endmodule
output:
Q=0
Q=1
Q=0
Несмотря на то, что мы записали 1, на выходе наблюдается кратковременный 0. Это происходит из-за разницы в задержках прохождения сигнала («гонки»), что приводит к кратковременному метастабильному состоянию при смене фазы clk.

Решение — либо прецизионная подгонка задержек, либо математическая оптимизация логики. Давайте переработаем уравнение мультиплексора:
Используя теорему консенсуса, дополним выражение и сгруппируем члены:
Применив закон де Моргана, приводим схему к базису NAND:
Теперь схема выглядит следующим образом:

Это и есть классическая D-защелка, свободная от метастабильных переходов при корректных временных интервалах. Проверим ее в симуляции:
`timescale 1us / 1ns
module custom_d_latch_nand(
output wire Q,
input clk, D
);
not (inv_D, D);
nand (D_nand_clk, D, clk);
nand (iD_nand_clk, inv_D, clk);
nand (Q_nand, iD_nand_clk, Q);
nand (Q, Q_nand, D_nand_clk);
endmodule
module stimulus;
localparam DELAY=1;
reg clk=0, D=1;
wire Q;
custom_d_latch_nand dl(.clk(clk), .D(D), .Q(Q));
initial begin
$monitor("Q=%d", Q);
set_q(1'b0);
#DELAY;
set_q(1'b0);
#DELAY;
set_q(1'b1);
#DELAY;
set_q(1'b1);
#DELAY;
set_q(1'b0);
#DELAY;
end
task set_q(input d);
begin
$display("setting q = %b\n", d);
D=d;
clk=1;
#DELAY;
clk=0;
#DELAY;
end
endtask
endmodule
Результат:
setting q = 0
Q=0
setting q = 0
setting q = 1
Q=1
setting q = 1
setting q = 0
Q=0
Никаких сбоев. Соединив две такие защелки в мастер-слейв конфигурацию, мы получим полнофункциональный flip‑flop. В основе всех этих решений лежит SR-триггер.
Понимание того, что flip‑flop — это по сути «интеллектуальный» мультиплексор с обратной связью, позволяет глубже взглянуть на проблемы метастабильности. При возникновении конфликта входных сигналов внутри замкнутого цикла триггер входит в нестабильное состояние — как если бы в поток воды попали пузырьки воздуха, вызывая прерывистость и непредсказуемость. Таким образом, становится очевидно: метастабильность — это не только следствие нарушения таймингов, но и риск, заложенный в саму топологию схемы.
В Китае выстроились в очередь за складным iPhone Duo: на JD.com оформили почти 1,55 млн предзаказов
Ученые открыли экстремальный «горячий лед», который может существовать в недрах Урана и Нептуна
К 2040 году в России может появиться инновационный многоразовый лунный корабль
Представлен Ugreen iDX6011 Pro: универсальный сервер на Intel Core Ultra 7 с поддержкой до 208 ТБ
Пользователь Reddit случайно купил рабочую плату MSI Z790 за $20 и нашел в ней SSD на 2 ТБ
Biostar напомнила о давно забытой видеокарте GeForce GT 730 рекламным постом
Меркурий сжался сильнее, чем считалось: метеоритные удары скрывали масштаб его усыхания
Как правильно установить клавишу пробела со стабилизатором: пошаговая инструкция