6-1. 순차 논리 회로 모델링 - 플립플롭
1. 플립플롭의 이해: 순차 논리 회로의 핵심 요소
순차 논리 회로는 이전 상태의 출력을 기억하고, 현재 입력과 함께 결합하여 새로운 출력을 생성하는 회로입니다. 이러한 기억 기능을 수행하는 기본적인 빌딩 블록이 바로 플립플롭(Flip-Flop)입니다. 플립플롭은 1비트의 정보를 저장할 수 있으며, 디지털 시스템에서 데이터를 보존하고, 상태를 관리하며, 타이밍을 제어하는 데 필수적인 역할을 합니다. 플립플롭은 래치(Latch)의 개선된 형태로, 래치의 단점인 불안정한 동작을 보완하여 안정적인 동작을 보장합니다.
1) 플립플롭의 필요성: 래치의 단점
래치는 입력 신호에 따라 출력이 즉시 변동하는 특성을 가지고 있습니다. 즉, 입력이 바뀌면 곧바로 출력이 바뀌는 투명성(Transparency)을 가집니다. 이러한 특성은 조합 논리 회로에서는 유용할 수 있지만, 순차 논리 회로에서는 문제를 야기할 수 있습니다. 예를 들어, 래치가 여러 개 연결된 경우, 한 래치의 출력이 다른 래치의 입력으로 들어가고, 그 출력이 다시 첫 번째 래치로 피드백되는 상황이 발생할 수 있습니다. 이러한 레이스 컨디션(Race Condition)은 회로의 불안정한 동작을 초래하고 예측 불가능한 결과를 초래합니다.
플립플롭은 래치와 달리 클럭 신호(Clock Signal)에 의해 제어됩니다. 클럭 신호의 특정 시점(예: 상승 에지)에서만 입력을 받아들이고 출력을 변경합니다. 이러한 클럭 기반의 동작은 회로의 타이밍을 동기화하고, 레이스 컨디션을 방지하여 안정적인 동작을 가능하게 합니다.
2) 플립플롭의 기본 동작 원리
플립플롭은 일반적으로 두 개의 안정된 상태를 가지며, 각 상태는 1 또는 0을 나타냅니다. 플립플롭의 상태는 입력 신호와 클럭 신호에 따라 변경됩니다. 클럭 신호가 활성화되었을 때, 플립플롭은 입력 신호의 값을 샘플링(Sampling)하고, 그 값을 저장합니다. 저장된 값은 클럭 신호가 비활성화된 동안에도 유지되며, 플립플롭의 출력으로 나타납니다.

위 그림은 기본적인 D 플립플롭의 구조를 나타냅니다. D 플립플롭은 데이터 입력(D)과 클럭 입력(Clock)을 가지며, 클럭 신호의 상승 에지에서 D 입력의 값을 캡처하여 출력(Q)에 저장합니다. 이러한 동작은 플립플롭의 핵심적인 특징을 보여주며, 다양한 종류의 플립플롭 모델링의 기반이 됩니다.
2. 다양한 종류의 플립플롭: 동작 원리와 Verilog 모델링
다양한 종류의 플립플롭이 있으며, 각 플립플롭은 특정 용도에 맞게 설계되었습니다. 주요 플립플롭으로는 D 플립플롭, JK 플립플롭, T 플립플롭 등이 있습니다.
1) D 플립플롭 (Data Flip-Flop)
D 플립플롭은 가장 기본적인 플립플롭 중 하나이며, 데이터 입력(D)의 값을 클럭 신호의 에지에서 캡처하여 저장합니다. D 플립플롭은 데이터 저장에 특화되어 있으며, 디지털 시스템에서 데이터의 지연(Delay)을 구현하는 데 사용됩니다.
a. 동작 원리
D 플립플롭의 동작은 다음과 같습니다.
- 클럭 신호의 상승 에지에서 D 입력의 값을
샘플링합니다. - 샘플링된 값은 플립플롭의 출력(Q)에 저장됩니다.
- 클럭 신호가 비활성화된 동안, Q의 값은 변하지 않고 유지됩니다.
Q' (Q-bar)는 Q의 보수값을 출력합니다.
b. Verilog 모델링
D 플립플롭은 Verilog로 다음과 같이 모델링할 수 있습니다.
module d_flipflop (
input wire clk,
input wire d,
output reg q,
output reg q_bar
);
always @(posedge clk) begin
q = d;
q_bar = ~d; // Q-bar는 Q의 보수
end
endmodule
위 코드에서 always @(posedge clk) 블록은 클럭 신호의 상승 에지에서 실행됩니다. 클럭이 상승 에지가 되면, 입력 d의 값이 q에 할당되고, q_bar에는 q의 보수값이 할당됩니다. reg 자료형은 값을 저장하기 위한 레지스터를 의미하며, 플립플롭의 상태를 저장하는 데 사용됩니다.
2) JK 플립플롭 (JK Flip-Flop)
JK 플립플롭은 D 플립플롭보다 더 다재다능하며, 두 개의 입력(J, K)을 사용하여 다양한 기능을 구현할 수 있습니다. JK 플립플롭은 데이터 입력, 토글(Toggle) 기능, 그리고 상태 유지 기능을 모두 갖추고 있어 복잡한 디지털 시스템 설계에 유용합니다.
a. 동작 원리
JK 플립플롭은 두 개의 입력(J, K)과 클럭 신호에 따라 다음과 같이 동작합니다.
- J=0, K=0: 현재 상태를 유지합니다 (Hold).
- J=0, K=1: Q를 0으로 설정합니다 (Reset).
- J=1, K=0: Q를 1로 설정합니다 (Set).
- J=1, K=1: Q의 값을 반전시킵니다 (Toggle).
b. Verilog 모델링
JK 플립플롭은 Verilog로 다음과 같이 모델링할 수 있습니다.
module jk_flipflop (
input wire clk,
input wire j,
input wire k,
output reg q,
output reg q_bar
);
always @(posedge clk) begin
case ({j, k})
2'b00: q = q; // Hold
2'b01: q = 0; // Reset
2'b10: q = 1; // Set
2'b11: q = ~q; // Toggle
endcase
q_bar = ~q; // Q-bar는 Q의 보수
end
endmodule
위 코드에서 case 구문은 입력 j와 k의 조합에 따라 플립플롭의 동작을 정의합니다. 2'b00, 2'b01, 2'b10, 2'b11은 각각 J와 K의 값을 나타냅니다.
3) T 플립플롭 (Toggle Flip-Flop)
T 플립플롭은 JK 플립플롭의 특별한 경우로, J와 K 입력을 하나로 묶어 사용합니다. T 플립플롭은 클럭 신호가 활성화될 때마다 출력을 반전시키는 토글(Toggle) 기능을 수행합니다.
a. 동작 원리
T 플립플롭은 T 입력과 클럭 신호에 따라 다음과 같이 동작합니다.
- T=0: 현재 상태를 유지합니다 (Hold).
- T=1: Q의 값을 반전시킵니다 (Toggle).
b. Verilog 모델링
T 플립플롭은 Verilog로 다음과 같이 모델링할 수 있습니다.
module t_flipflop (
input wire clk,
input wire t,
output reg q,
output reg q_bar
);
always @(posedge clk) begin
if (t) begin
q = ~q; // Toggle
end
q_bar = ~q; // Q-bar는 Q의 보수
end
endmodule
위 코드에서 if (t) 구문은 T 입력이 1일 때 Q의 값을 반전시키고, 0일 때는 현재 값을 유지하도록 합니다.
3. 플립플롭 모델링 시 고려 사항
플립플롭을 모델링할 때 몇 가지 중요한 사항을 고려해야 합니다.
1) 클럭 신호의 중요성
클럭 신호는 플립플롭의 동작을 동기화하는 데 핵심적인 역할을 합니다. 클럭 신호의 타이밍은 회로의 성능과 신뢰성에 큰 영향을 미치므로, 클럭 신호의 주파수(Frequency), 듀티 사이클(Duty Cycle), 지터(Jitter) 등을 신중하게 고려해야 합니다.
2) 비동기식 입력
플립플롭은 비동기식 입력(Asynchronous Input)을 가질 수 있습니다. 비동기식 입력은 클럭 신호와 관계없이 플립플롭의 상태를 즉시 변경할 수 있습니다. 일반적인 비동기식 입력으로는 셋(Set)과 리셋(Reset)이 있습니다. 이러한 입력은 회로의 초기화 또는 특정 상태로의 강제 변경에 사용됩니다.
3) Set/Reset의 Verilog 모델링
Set/Reset 입력이 있는 플립플롭은 다음과 같이 모델링할 수 있습니다.
module d_flipflop_with_set_reset (
input wire clk,
input wire d,
input wire set, // 비동기식 Set 입력
input wire reset, // 비동기식 Reset 입력
output reg q,
output reg q_bar
);
always @(posedge clk or posedge set or negedge reset) begin
if (reset) begin
q = 0; // Reset
end else if (set) begin
q = 1; // Set
end else begin
q = d; // Data input
end
q_bar = ~q; // Q-bar는 Q의 보수
end
endmodule
위 코드에서 always 블록은 클럭 신호의 상승 에지 뿐만 아니라, set의 상승 에지 또는 reset의 하강 에지에서도 실행됩니다. reset 신호가 활성화되면 q가 0으로 설정되고, set 신호가 활성화되면 q가 1로 설정됩니다. set과 reset이 모두 비활성화된 경우에만 d 입력의 값이 q에 저장됩니다.
4) 홀드 타임과 셋업 타임
플립플롭은 입력 신호가 유효하게 유지되어야 하는 셋업 시간(Setup Time)과, 클럭 신호의 에지 이후에도 유효하게 유지되어야 하는 홀드 시간(Hold Time)이라는 타이밍 제약 조건을 갖습니다. 이러한 타이밍 제약 조건을 위반하면 플립플롭의 동작이 불안정해질 수 있으며, 회로 오류를 발생시킬 수 있습니다.
5) 엣지 트리거 방식의 중요성
플립플롭은 일반적으로 엣지 트리거(Edge-Triggered) 방식으로 동작합니다. 즉, 클럭 신호의 상승 에지 또는 하강 에지에서 입력 신호를 샘플링합니다. 엣지 트리거 방식은 플립플롭의 동작을 정확하게 제어하고, 레이스 컨디션을 방지하는 데 중요한 역할을 합니다.
4. 플립플롭의 활용 예시
플립플롭은 다양한 디지털 시스템에서 널리 사용됩니다.
1) 데이터 저장
D 플립플롭은 데이터를 저장하는 데 사용됩니다. 예를 들어, CPU의 레지스터, 메모리, FIFO(First-In, First-Out) 버퍼 등에서 데이터를 저장하고 유지하는 데 사용됩니다.
2) 타이밍 제어
플립플롭은 클럭 신호에 의해 제어되므로, 타이밍 제어에 유용합니다. 예를 들어, 디지털 시계, 카운터, 분주기 등에서 클럭 신호의 주파수를 분할하거나, 특정 시간 간격을 생성하는 데 사용됩니다.
3) 상태 관리
플립플롭은 시스템의 상태를 저장하고 관리하는 데 사용됩니다. 예를 들어, 유한 상태 기계(FSM)에서 현재 상태를 저장하고, 다음 상태를 결정하는 데 사용됩니다.
4) 시프트 레지스터
플립플롭은 시프트 레지스터를 구현하는 데 사용됩니다. 시프트 레지스터는 데이터를 한 비트씩 좌우로 이동시키는 기능을 수행하며, 직렬-병렬 변환, 병렬-직렬 변환 등에 사용됩니다.

위 그림은 4비트 시프트 레지스터의 아키텍처를 보여줍니다. 각 D 플립플롭은 이전 플립플롭의 출력을 입력으로 받으며, 클럭 신호에 따라 데이터를 시프트합니다.
5. 플립플롭 모델링 시뮬레이션 및 검증
Verilog로 플립플롭을 모델링한 후에는 시뮬레이션을 통해 동작을 검증해야 합니다. 시뮬레이션은 모델의 정확성을 확인하고, 잠재적인 문제를 미리 발견하는 데 도움이 됩니다.
1) 테스트벤치(Testbench) 작성
테스트벤치는 모델의 입력을 생성하고, 출력을 관찰하여 모델의 동작을 검증하는 Verilog 코드입니다. 테스트벤치는 플립플롭의 각 입력에 대한 다양한 조합의 신호를 생성하고, 플립플롭의 출력을 예상 값과 비교합니다.
2) 시뮬레이션 실행 및 결과 분석
시뮬레이션을 실행한 후에는 시뮬레이션 결과를 분석하여 플립플롭의 동작이 예상대로 수행되는지 확인합니다. 시뮬레이션 파형을 통해 입력 신호와 출력 신호의 타이밍 관계를 확인하고, 셋업/홀드 타임 위반 여부 등을 검사합니다.
3) 예시: D 플립플롭 테스트벤치
module d_flipflop_tb;
// Inputs
reg clk;
reg d;
// Outputs
wire q;
wire q_bar;
// Instantiate the DUT (Device Under Test)
d_flipflop uut (
.clk(clk),
.d(d),
.q(q),
.q_bar(q_bar)
);
// Clock generation
always #5 clk = ~clk;
// Stimulus
initial begin
// Initialize
clk = 0;
d = 0;
#10;
d = 1;
#10;
d = 0;
#10;
$finish;
end
endmodule
위 코드는 D 플립플롭의 테스트벤치 예시입니다. 이 테스트벤치는 클럭 신호를 생성하고, 데이터 입력 d를 변경하여 D 플립플롭의 동작을 확인합니다. 시뮬레이션을 통해 q와 q_bar의 출력을 확인하고, 플립플롭이 예상대로 동작하는지 검증합니다.
6. 결론
플립플롭은 순차 논리 회로의 핵심적인 구성 요소이며, 다양한 종류와 동작 방식을 가지고 있습니다. D 플립플롭, JK 플립플롭, T 플립플롭 등 각 플립플롭은 고유한 특징을 가지고 있으며, 설계 목표에 맞게 선택하여 사용할 수 있습니다. Verilog를 사용하여 플립플롭을 모델링하고, 테스트벤치를 통해 동작을 검증하는 과정을 통해 디지털 회로 설계 능력을 향상시킬 수 있습니다. 플립플롭의 동작 원리를 정확히 이해하고, Verilog 모델링 기법을 익히는 것은 디지털 시스템 설계를 위한 중요한 첫걸음입니다.
비슷한 글 추천
6-2. 순차 논리 회로 모델링 - 래치
래치의 동작 원리와 Verilog 모델링 방법을 설명합니다. 플립플롭과의 차이점을 비교합니다.
6-3. 순차 논리 회로 모델링 - 카운터
업 카운터, 다운 카운터, 모드-n 카운터 등 다양한 카운터의 Verilog 모델링 방법을 설명합니다.
5-1. 조합 논리 회로 모델링 - 게이트 레벨 모델링
Verilog를 이용한 게이트 레벨 모델링 방법을 설명합니다. AND, OR, NOT 게이트 등 기본 게이트를 이용한 회로 설계 방법을 알아봅니다.
5-2. 조합 논리 회로 모델링 - 데이터플로우 모델링
데이터플로우 모델링을 이용한 조합 논리 회로 설계 방법을 설명합니다. 할당 연산자를 사용하여 회로를 모델링합니다.
Comments (0)
No comments yet. Be the first to comment!
Please to write a comment.