Как работают триггеры: секреты последовательной логики
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 — это по сути «интеллектуальный» мультиплексор с обратной связью, позволяет глубже взглянуть на проблемы метастабильности. При возникновении конфликта входных сигналов внутри замкнутого цикла триггер входит в нестабильное состояние — как если бы в поток воды попали пузырьки воздуха, вызывая прерывистость и непредсказуемость. Таким образом, становится очевидно: метастабильность — это не только следствие нарушения таймингов, но и риск, заложенный в саму топологию схемы.
Жаркая осень 2026: iPhone 18, Huawei Mate 90, Xiaomi 18, Vivo X500 и Oppo Find X10 выйдут в сентябре
Цены на Google Pixel вырастут: компания больше не может сдерживать удорожание комплектующих
AMD продлит жизнь платформе AM5 ради процессоров Zen 7 и отложит выход AM6 с поддержкой DDR6 и архитектуры Zen 8 до 2029 года
Apple и Micron сошлись в споре из-за поставок китайской памяти для iPhone
Представлен уникальный игровой ПК SignalRGB с 36 модулями памяти
Живые фото Honor Robot Phone: первый в мире «смартфон-робот», интерфейс камеры и распаковка
Живые фото бюджетного смартфона HMD Touch AI за $70 в стиле Nokia Lumia с ИИ и Wi-Fi
Почему Илону Маску будет проще посадить Starship на Луну, чем на Землю