Как работают триггеры: секреты последовательной логики

Как работают триггеры: секреты последовательной логики

Прокомментировать Просмотры: 4

Flip‑flop (в буквальном смысле «шлепанец») — это фундамент, благодаря которому современные процессоры и любые интегральные микросхемы обрели способность сохранять данные.

Рассмотрим абстрактную логическую схему: у нее есть вход и выход. Логично, что выход напрямую зависит от текущего входного сигнала. Но каким образом из комбинационной логики, лишенной памяти, удалось создать архитектуру, способную фиксировать значение и использовать его для дальнейших операций?

В этом материале я предлагаю:

  • разобрать эволюцию возникновения ячеек памяти;

  • попутно проанализировать природу метастабильности и проблем, связанных с временем установки (setup) и удержания (hold) данных.

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

Как работают триггеры: секреты последовательной логики
full adder

Математически это выглядит так:

\begin{equation} S = A \oplus B \oplus C_{in} \end{equation}\begin{equation} C_{out} = (A \cdot B) + (B \cdot C_{in}) + (A \cdot C_{in}) \end{equation}

Такие схемы статичны — выход зависит лишь от текущего состояния входов. Но чтобы «запомнить» данные, нам нужно внутреннее состояние. Самый простой способ добиться этого — создать обратную связь, соединив выход схемы с ее же входом.

схема 1
схема 1

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

схема 2
схема 2

Сигнал 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.

схема 3
схема 3

Решение — либо прецизионная подгонка задержек, либо математическая оптимизация логики. Давайте переработаем уравнение мультиплексора:

Q^+ = D \cdot clk + \overline{clk} \cdot Q

Используя теорему консенсуса, дополним выражение и сгруппируем члены:

Q^+ = D \cdot clk + \overline{clk} \cdot Q + (D \cdot Q)Q^+ = D \cdot clk + Q \cdot (\overline{clk} + D)

Применив закон де Моргана, приводим схему к базису NAND:

Q^+ = D \cdot clk + Q \cdot (\overline{clk \cdot \overline{D}})Q^+ = \overline{\overline{D \cdot clk + Q \cdot (\overline{clk \cdot \overline{D}})}}Q^+ = \overline{ \overline{(D \cdot clk)} \cdot \overline{Q \cdot (\overline{clk \cdot \overline{D}})} }

Теперь схема выглядит следующим образом:

D-type latch
D‑type latch

Это и есть классическая 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 — это по сути «интеллектуальный» мультиплексор с обратной связью, позволяет глубже взглянуть на проблемы метастабильности. При возникновении конфликта входных сигналов внутри замкнутого цикла триггер входит в нестабильное состояние — как если бы в поток воды попали пузырьки воздуха, вызывая прерывистость и непредсказуемость. Таким образом, становится очевидно: метастабильность — это не только следствие нарушения таймингов, но и риск, заложенный в саму топологию схемы.

 

Источник

Поделиться:

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов