Как работают триггеры: секреты последовательной логики
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 — это по сути «интеллектуальный» мультиплексор с обратной связью, позволяет глубже взглянуть на проблемы метастабильности. При возникновении конфликта входных сигналов внутри замкнутого цикла триггер входит в нестабильное состояние — как если бы в поток воды попали пузырьки воздуха, вызывая прерывистость и непредсказуемость. Таким образом, становится очевидно: метастабильность — это не только следствие нарушения таймингов, но и риск, заложенный в саму топологию схемы.
В РФ зафиксировали свыше 100 тысяч действующих спутниковых модемов
Создан морозостойкий электролит для суперконденсаторов, выдерживающий удары молотком и 5000 циклов работы
Отказываемся от Opus и Codex: тест MacBook, игрового ноутбука и DGX Spark на задачках с ловушками
Приставы в России получили право конфисковывать криптовалюту
AMD развернула первые ИИ-системы Helios в дата-центрах своего главного партнера
Российские спутники научились тестировать быстрее чем за час
Samsung уподобиет названия своих телевизоров линейке Galaxy S: что изменится в моделях Обычный, Plus и Ultra
Белорусские хакеры осуществили кибератаку на сайт Росстата